redis在本地存数据不乱码,部署的服务器上乱码?

本地mac环境运行,跑起来存数据key和value不乱码,在win上测试了也不乱
图片
但是到了线上环境,key前缀出现乱码 value 也全是前缀这种乱码
图片
redisConfig已替换原JdkSerializationRedisSerializer:
图片

阅读 3.6k
4 个回答
✓ 已被采纳

解决了,乱码确实是不耽误读写的,但是业务有需求要通过其他服务删除对应key的value数据.服务器又禁止keys命令,首先从代码里是无法动态获取key的,只能写死.但是del的时候是删不掉的,加上乱码也删不掉(console里倒是可以),无奈只能先让数据不乱码,所以使用了stringRedisTemplate,kv确实都不乱了,但是v存的是list实体类,json数据.
不得已在存入阶段先

JSON.toJSONString(baseModelList)

取的时候在

StrUtil.strip(json, "\"")去掉首尾的“
StringEscapeUtils.unescapeJava(strip)去掉多余的\

在转成list

JSON.parseArray(json)

返回前端

新手上路,请多包涵

继续换下,看下有没有阿里系出的一些解析器来替换。

以实际情况看应该是序列化存储的时候字符集和服务器上的不一样。Linux服务器一般都是utf-8,而win开发环境很多是936,即使是utf-8,win里面还有个bom头问题。

情况一:

现象描述
使用RedisTemplate操作redis数据,在相关的redis可视化工具中查看数据,如下图!虽然可视化工具显示如此,但不影响读写
image.png
解决办法
因为不影响读写,所以我选择忽视。

情况二:

现象描述
RedisTemplate查询一个hash,输入正确的key,却不能查出来数据,使用命令keys *查询了下发现存入的值变乱码了
解决办法
实例化RedisTemplate时使用StringRedisSerializer(String序列化策略), 但是注意一点,由于采用了String的序列化策略,所以只接受value值类型为String的参数。

@Component
public class RedisUtils {
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

//    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
//        this.redisTemplate = redisTemplate;
//    }

    //表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。
    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer(); //序列化为String
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //序列化为Json
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        this.redisTemplate = redisTemplate;
    }
}
新手上路,请多包涵

redistemplate 的序列化没配置

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏