SpringBoot使用Redis 缓存
_RH_ 人气:0一、配置环境
首先,先创建一个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持久化失效的解决方法。
加载全部内容