Spring使用redis遇到的问题及解决方案

网友投稿 287 2022-12-10


Spring使用redis遇到的问题及解决方案

本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅;

一、配置文件

classpath*:config.properties

ySBaZYlkbR

注:可以看到我redis的配置中,对于hash的key使用的是StringRedisSerializer序列化,而对于value使用的是GenericJackson2JsonRedisSerializer序列化。

二、坑一

// 源代码

HashOperations ho = redisTemplate.opsForHash();

Boolean flag = ho.hasKey(“key”, "key1");

if (flag) {

// 处理逻辑

}

上面这段代码,当redis中值不存在时,按照官方的说明文档,应该返回false。但是我使用的时候,hasKey方法时而返回的是null,时而返回的false,导致空指针异常。搞了半天我也没搞明白为啥返回false,最后没办法我妥协了(大神如果知道可以回复我)。

// 妥协后代码

HashOperations ho = redisTemplate.opsForHash();

Boolean flag = ho.hasKey(“key”, "key1");

if (flag != null && flag) {

// 处理逻辑

}

三、坑二

// 将Map放到redis的hash中

public void putRedisHash1(){

HashOperations ho = redisTemplate.opsForHash();

Map tempMap = new HashMap(3){{

put("isRegistered",false);

put("isWeChat",false);

put("isAliPay",false);

}};

ho.put("key", "key1", tempMap);

}

// 将Map放到redis的hash中

public void putRedisHash2(){

HashOperations ho = redisTemplate.opsForHash();

Map tempMap = new HashMap(3);

tempMap.put("isRegistered",false);

tempMap.put("isWeChat",false);

tempMap.put("isAliPay",false);

ho.put("key", "key1", tempMap);

}

这两个方法的功能是一样的,但是第一个方法是在Map初始化同时将值放入其中,第二个方法是Map初始化以后将值放入其中,执行结果是一样,但是在redis中的存储形式完全不同。由于Hash的value使用的是GenericJackson2JsonRedisSerializer序列化,所以为了反序列化方便,它会存储

@class“”这个字段,由于Map初始化时机不同,导致相同内容在redis中@class内容不一致,为了使用方便,推荐第二种,即在Map初始化以后将值放入其中。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:idea右键没有java class选项问题解决方案
下一篇:如何处理maven仓库中后缀LastUpdated文件
相关文章

 发表评论

暂时没有评论,来抢沙发吧~