Redis序列化原因导致数据库找不到字符串key对应的value值

问题背景:项目中使用的是RedisTemplate,使用set接口向Redis插入数据后,使用Redis客户端可视化工具或者命令行,根据get接口获取key字符串对应的value值,居然为空。

思路:项目插入Redis的db、和客户端或命令行的db,不是同一个db。

Redis默认db有16个,是从0到15,可以修改Redis的redis.conf配置文件中的database值进行变更,Redis不会限制最大的数据库数量,但是会限制最小数据库数量为1个

项目里面配置的db是1,于是在命令行输入 select 1 切换到db为1的数据库,然后再使用命令 get key字符串,居然还是为空。由于是开发环境,Redis没有禁用keys等相关危险的命令。

生产环境的Redis,一定要将KEYS、FLUSHALL、FLUSHDB、CONFIG危险的命令给禁用。在redis中修改配置文件redis.conf找到 SECURITY 区域,并找到rename-command命令禁用属性,

禁用命令

rename-command KEYS     ""
rename-command FLUSHALL ""
rename-command FLUSHDB  ""
rename-command CONFIG   ""

重命名命令

rename-command KEYS     "XXXXX"
rename-command FLUSHALL "XXXXX"
rename-command FLUSHDB  "XXXXX"
rename-command CONFIG   "XXXXX"

这样可以定义新命令,然后在客户端就不会执行危险命令了

参考文档:https://blog.csdn.net/wfy2695766757/article/details/95751044

禁用后如果需要使用【keys *】命令,可以使用【scan/sscan/zscan/hscan】命令

中文文档:http://redisdoc.com/database/scan.html?highlight=scan

使用 keys *key字符串* 查询所有key,发现key前面居然加了一串类似这种 \xAC\xED\x00\x05t\x00\x97 不认识的东西, 原来是Redis序列化原因导致的。在项目中配置redis的序列化和反序列化,解决问题。

    /**
     * redis模板,存储key是字符串,值jackson2JsonRedisSerializer是序列化后的值
     * @param
     * @return org.springframework.data.redis.core.RedisTemplate
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        //Jackson版本原因,2.9使用下面这个
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        //使用StringRedisSerializer来序列化和反序列化redis的key值
        RedisSerializer redisSerializer = new StringRedisSerializer();
        //key
        redisTemplate.setKeySerializer(redisSerializer);
        redisTemplate.setHashKeySerializer(redisSerializer);
        //value
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }



 

 


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis 中,字符串类型的数据可以保存为一个字符串对象。如果要将一个对象序列化字符串,可以使用一些常见的序列化工具,比如 JSON、Protobuf 等,将对象转换为字符串后再进行存储。 在使用 Redis 的客户端操作时,需要将序列化后的字符串传递给 Redis 客户端进行存储。如果使用 Redis 的官方客户端,可以使用 SET 命令将字符串保存到 Redis 中。例如,如果使用 Python 客户端,可以使用以下代码将一个 Python 对象序列化为 JSON 字符串,并将其保存到 Redis 中: ```python import json import redis # 创建 Redis 客户端连接 r = redis.Redis(host='localhost', port=6379, db=0) # 定义一个 Python 对象 user = { 'name': 'Alice', 'age': 25, 'email': 'alice@example.com' } # 将 Python 对象序列化为 JSON 字符串 user_json = json.dumps(user) # 将序列化后的字符串保存到 Redis 中 r.set('user:1', user_json) ``` 在这个例子中,我们将一个 Python 字典对象序列化为 JSON 字符串,并使用 Redis 客户端的 SET 命令将其保存到 Redis 中,key 为 `user:1`。在读取数据时,需要将序列化后的字符串序列化为 Python 对象。例如,如果要读取上面保存的用户信息,可以使用以下代码: ```python # 从 Redis 中读取数据 user_json = r.get('user:1') # 将序列化后的字符串序列化为 Python 对象 user = json.loads(user_json) # 输出用户信息 print(user['name']) # Alice print(user['age']) # 25 print(user['email']) # alice@example.com ``` 在这个例子中,我们使用 Redis 客户端的 GET 命令从 Redis 中读取保存的用户信息,然后将序列化后的 JSON 字符串序列化为 Python 对象,最后输出用户信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值