一次Redis存储key序列化的异常原因分析

项目使用Redis作为缓存,原key默认字节化导致线上问题,通过@PostConstruct注解设置key为字符串序列化。然而在开发环境中,部分key仍出现字节化。排查发现,多个@PostConstruct注解的方法执行顺序不定,导致配置生效前key已写入缓存。解决方案是移除其他相关注解,统一在配置方法内按序执行,确保配置优先于操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司的项目采用了redis作为缓存使用,以前没有太关注序列化的时候,key和value的都是采用默认的序列化方式,后来有一次为了方便线上查找问题方便定位到具体缓存内容,才发现使用的默认序列化方式,只能通过命令获取,而且还获取不到,因为key被字节话了,所以统一修改的key的序列化方式为字符串,通过@PostConstruct注解,设置了序列化方式,当时测试都没有问题了。配置方法如下:

    @PostConstruct
    public void setRedisConfig() {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
    }

经过一段时间,有一次开发过程中通过可视化客户端工具查看开发环境的redis库的时候,发现又出现了字节话序列的key了,但是部分是好的,部分是坏的,很奇怪。通过多次排查发现了问题所在,原来因为业务需求,需要在项目启动的时候,默认从数据库读取一些系统常用配置到缓存,所以也通过@PostConstruct注解来进行,但是大家都是通过注解来进行的,而且这个注解没有参数来控制它的优先级,所以一部分的key在配置生效前就进了缓存,这时的key就是乱码了。

### 序列化 Redis 哈希键的方法 为了实现对 Redis存储的哈希键进行序列化,可以采用多种方法取决于具体的应用场景和技术栈。一种常见的做法是在应用程序层面处理序列化逻辑,在将数据保存至 Redis 或从中取出时应用特定的序列化/反序列化机制。 对于 Python 用户来说,`pickle` 和 `json` 是两个常用的库用于对象的序列化与反序列化工作。下面展示了一个简单的例子,说明如何利用这些工具配合 Redis 的命令接口完成哈希字段的操作: #### 使用 JSON 进行序列化和反序列化的实例 ```python import json import redis client = redis.Redis(host='localhost', port=6379, db=0) def save_hash(key, data): serialized_data = {k: json.dumps(v) for k, v in data.items()} client.hset(name=key, mapping=serialized_data) def load_hash(key): raw_data = client.hgetall(key) deserialized_data = {k.decode('utf-8'): json.loads(v.decode('utf-8')) for k, v in raw_data.items()} return deserialized_data # 测试案例 test_key = 'user_profile' profile_info = {"name": "Alice", "age": 25} save_hash(test_key, profile_info) retrieved_info = load_hash(test_key) print(retrieved_info) ``` 上述代码片段展示了怎样把字典形式的数据转换成字符串并通过 HSET 存入 Redis;当需要获取该信息时再将其解码并解析回原始格式[^1]。 值得注意的是,虽然这里选择了 JSON 来作为序列化协议,但在实际开发过程中也可以考虑其他更高效的二进制格式如 MessagePack 或 Protocol Buffers 等,这主要依赖于项目需求以及团队的技术偏好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值