详解SpringBoot如何使用Redis和Redis缓存
一、配置环境
首先,先创建一个SpringBoot项目,并且导入Redis依赖,使用Jedis进行连接测试。
本人的Redis装在虚拟机里,直接切换到虚拟机中的安装目录,启动redis服务,打开redis-cli,如果你设置了密码,还要先输入密码。
cd redis安装目录
#启动redis
redis-server /etc/redis.conf
#进入redis
redis-cli
#如果你设置了密码
auth 密码
在项目中,设置配置文件
# Mysql数据库连接
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/redisdemo?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.passWord=123456
#返回JSON的全局时间格式
spring.jackson.date-fORMat=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#配置mapper xml文件的路径
mybatis-plus.mapper-locations=classpath:com/rh/csdn_redis_demo/mapper/xml/*.xml
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置redis
spring.redis.host=你的redis地址
spring.redis.password=你的redis密码(没有直接空着,或者可以注掉这行)
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
在test中写一个测试方法,测试是否能够连接,返回值为pong
Jedis jedis = new Jedis("你的redis安装的ip地址",6379);
//没有密码就注掉这行,不然会报错
jedis.auth("你的redis密码");//设置密码
String value = jedis.ping();
System.out.println(value);
二、Redis的基本操作
首先,要写一个redisconfig的配置类,这个类是为了解决redis存取值的序列化问题和缓存问题。
@EnableCaching
@Configuration
public class RedisConfig extends CachinGConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2jsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.seTKEySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value HashMap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600)) //设置数据过期时间600秒
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
定义一个controller,写一个测试方法,进行访问
@RestController
@RequestMapping("redisTest")
public class RedisTestController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/test01")
public void test01(){
redisTemplate.opsForValue().set("test","redis存值测试");
String test = (String) redisTemplate.opsForValue().get("test");
System.out.println(test);
}
}
在reids中也可以查询key与vaule(中文没有显示是shell的编码问题)。
SpringBoot中进行redis的操作基本都是借助于ops*,各位可以根据自己需求进行其他的选用。
三、使用redis作缓存
简单的用redis做一个缓存,这里使用@Cacheable在方法上作缓存。
写一个用于访问的test02方法,并在该方法上作缓存。
controller
@RestController
@RequestMapping("redisTest")
public class RedisTestController {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private UserService userService;
@GetMapping("/test01")
public void test01(){
redisTemplate.opsForValue().set("test","redis存值测试");
String test = (String) redisTemplate.opsForValue().get("test");
System.out.println(test);
}
@GetMapping("/test02")
public List<User> test02(){
List<User> userList = userService.test02();
System.out.println(userList);
return null;
}
}
service
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Cacheable(value = "user",key = "'cache'")
@Override
public List<User> test02() {
List<User> userList = baseMapper.selectList(null);
return userList;
}
}
首先查看redis中缓存内容
然后调用方法
可以看到,这一次查询,由于redis中没有缓存,所以对数据库进行了访问,再次查看redis中key
可以看到redis中多出了user::cache这个键,这个就是我们做的缓存了(编码格式问题导致这么显示)
这个时候我们再次访问方法
可以看到,第二次调用方法,并没有连接数据库,没有操作数据库的语句,这表示我们成功的从缓存中取出了数据。
tpis.
如果你在连接redis的时候出现了MISCONF Redis is configured to save RDB snapshots……这样的错误提示,这表示redis的持久化失效了,可以再redis-cli中直接输入config set stop-writes-on-bgsave-error no,但是这种方法不能永远解决这个问题,如果需要永解决这个问题,可以搜索redis持久化失效的解决方法。
以上就是详解SpringBoot如何使用Redis和Redis缓存的详细内容,更多关于SpringBoot使用Redis 缓存的资料请关注其它相关文章!
相关文章