Springboot 项目使用 RMapCache 保存数据,发现值出现 \x00 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/c07a13f3ed7f9750dc5a51cc416937b6.png) \#1 使用 StringRedisTemplate 保存数据,可用 \#2 使用 RMapCache 保存数据, 出现\x00, 不可用 大致结构如下 demo project "源码自取" (https://link.segmentfault.com/?enc=SDcu1bJmwZZK7ajo28g%2BaQ%3D%3D.QOduvRZlGUnngtp4ZvQZhOM9ngbT2I7bsS%2F82T4I5268pjLvJJgOgybVP3UKfGx8) "测试视频" (https://link.segmentfault.com/?enc=60wT4pLp7XYMTvcSf4UX9w%3D%3D.7jzF7t5DxkBd8WHwKDMURCBk4kFEDXpJUBXGYGz3svqZ9rLVfEUY4Pdo7PNn%2BAqS) springboot: 2.7.18 redisson: 3.26.1 / 3.21.0 redis: Redis-x64-5.0.14.1 / redis-5.0.5 redisson codec: JsonJacksonCodec / StringCodec 跟踪代码后发现,数据在执行lua脚本后出现了问题 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/d2257d1531ebf2ac4a7b673e590c1d4d.png) 然后将脚本放到 redis-cli 直接执行,数据也是异常的 eval "return struct.pack('dLc0', 0, string.len(ARGV[1]), ARGV[1])" 0 "test" "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241010/b533cdef9529b8d058f1c57bcedffde4.png) 我要怎么修改 ===== 关于 RedisTemplate 序列化回复 ===== 我不知道为啥回复,刷新之后就消失了,再回复又重复,删除又两个都消失,在这里回复吧。 我并不是使用 RedisTemplate 来操作,而是使用的是 Redisson 的 RedissonClient 来进行操作 成功案例:直接使用 StringRedisTemplate ,demo 项目懒得配那么多,而且我也是成功了,上图#1 失败案例:使用 RMapCache mapCache = redissonClient.getMapCache(name); 我的错误发生在 使用 mapCache.put(key, value) 后 如果要设置,也是设置 redissonClient 的 Codec,我尝试过 JsonJacksonCodec 和 StringCodec,没有效果。原因,原问题有解释 ===== 关于 RedisTemplate 序列化回复 =====
Springboot3集成Redisson,使用@Cacheable获取不到KEY. 继承AbstractValueAdaptingCache类重写lookup方法时,发现入参为null @Cacheable(key = "'cache_uid_' + #uid", value = "user") public User getUserInfo(String uid) { User user = userMap.get(uid); ThreadUtil.sleep(1000); logger.info("获取用户信息:{}", user.toString()); return user; } @SpringBootTest(classes = CacheApplication.class) public class CacheTest { @Autowired private UserService userService; @Test public void testCacheSizeAndWeightLimit() { for (int i = 0; i < 10; i++) { userService.getUserInfo("x001"); } userService.evictUserSync("x001"); userService.getUserInfo("x001"); } } public class RedisCaffeineCache extends AbstractValueAdaptingCache { @Override protected Object lookup(Object key) { System.out.println(key); //这里就成了cache_uid_null var cacheKey = buildKey(key); return null; } } 看了半天没看出来什么结果,想知道一般会有什么问题导致 代码:"cache项目地址" (https://link.segmentfault.com/?enc=CiC%2FE5%2BoPicj7NiYQoSCUw%3D%3D.%2FJ3A6yFDk163kMK%2FY15DL5wBgEBAiLYMhThgz7k%2B1Syxoy4IJb51yH5pKXm2mjWZEIrIieCCV1ZCYQljCMvhR7Okgp2e1QoLSQ0fBa5AByQC9DTSwL5nh2pvrca%2FBvz3) 分支:develop-x
Redisson的看门狗实现中,对于续期失败的异常处理就是释放锁: "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241201/a81ddf4ba05f88cc5b7d751556b14536.png) «见红框» 也就是说主线程不会知道当前锁是否还有效,可能锁因为续期失败已经过期了,但主线程还在处理业务。 这种情况应该怎么处理呢?
Redission实现公平锁为什么要使用ZSet数据结构? 使用ZSet结构有什么好处? 看lua代码好像也并没有使用到 ZSet的二分查找这种优势