最近给自己的项目添加了redis缓存功能,按照网上的一些教程按以最简单的方式引入后实现了给文章添加缓存的功能,大致逻辑就是默认从redis缓存中取出对应id的文章,如果从redis取出的数据不存在则从数据库查询,查询到数据后再存入redis,下次再访问该篇文章则直接从缓存取数据不需要去数据库查询了。
这种方式可以灵活的控制哪些数据可以缓存,并且可以做对应的删除操作,但是如果你是以简单的方式引入的话,那么存入redis的时候key跟value是采用JdkSerializationRedisSerializer这种默认序列化的配置的,value可以String,也可以使Map,Hash等形式。key不是纯字符串,比如你把文章id作为key存入,那么此时你到redis数据库查看后发现key并不是你存入的id,可能前面还有一串乱码,这个时候如果你通过redisTemplate.keys去获取所有的key的时候会发现获取不到。
因为key的类型不一致,为了解决这问题需要新增redis配置,你可以指定其他的序列化方式,key跟value都可以单独的设置,但是笔者为了不影响之前的数据,只改了Key的方式,使用redis自带的StringRedisSerializer 方式,这样你存入的key跟传入的key就保持一致了。
这个时候在通过redisTemplate.keys就可以正常的获取到所有的key了,在通过遍历删除就可以实现清空的功能了。
新建redisconfig文件,内容如下:
@Configuration\npublic class RedisConfig {\n @Bean\n public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){\n RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();\n redisTemplate.setConnectionFactory(factory);\n StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();\n // key默认使用redis序列化方法,value使用默认,默认方法可以直接存对象\n redisTemplate.setKeySerializer(stringRedisSerializer);\n return redisTemplate;\n }\n}
具体使用缓存的代码
// 默认从缓存取,如果缓存没有,从数据库查询,同时存入redis\npagesDto = (PagesDto)redisTemplate.opsForValue().get(id);\nif (pagesDto == null){\n pagesDto = pagesDao.getDetail(Integer.parseInt(id));\n redisTemplate.opsForValue().set(id,pagesDto);\n}\nreturn pagesDto;
实现清空redis的代码:
public void clearCache() {\n // 使用*匹配所有key,通过迭代删除数据\n Set<String> keys = redisTemplate.keys("*");\n Iterator<String> iterator = keys.iterator();\n while (iterator.hasNext()){\n boolean res = redisTemplate.delete(iterator.next());\n }\n }