总结hmdp项目中遇到的坑

目录

1、RedisTemplate执行lua脚本抛出异常java.lang.UnsupportedOperationException

原因

[2、redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误](#2、redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误)

原因

[3、Hutool BeanToMap问题](#3、Hutool BeanToMap问题)


1、RedisTemplate执行lua脚本抛出异常java.lang.UnsupportedOperationException

org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.lang.UnsupportedOperationException: io.lettuce.core.output.StatusOutput does not support set(long)

java代码

java 复制代码
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;

    static {
        UNLOCK_SCRIPT = new DefaultRedisScript();
        UNLOCK_SCRIPT.setLocation(new ClassPathResource("lua/unlock.lua"));
        //不设置返回值类型,使用默认的返回值类型
        //UNLOCK_SCRIPT.setResultType(Long.TYPE);
    }

    @Override
    public void unLock() {
        redisTemplate.execute(UNLOCK_SCRIPT, Collections.singletonList(KEY_PREFIX + name), uuid + Thread.currentThread().getId());
    }

lua脚本

Lua 复制代码
-- 这里的 KEYS[1] 就是锁的key,这里的ARGV[1] 就是当前线程标示
-- 获取锁中的标示,判断是否与当前线程标示一致
if (redis.call('GET', KEYS[1]) == ARGV[1]) then
  -- 一致,则删除锁
  return redis.call('DEL', KEYS[1])
end
-- 不一致,则直接返回
return 0

原因

lua脚本中返回了一个long类型的值,但是在DefaultRedisScript类中,没有指定返回值类型,所以使用了默认的返回值类型(null),导致转换出错。

所以要显示指定返回值类型

2、redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误

java 复制代码
//1 查询redis缓存
String shopKey = RedisConstants.CACHE_SHOP_KEY + id;
//必定返回一个map,但是其中可能无键值
 Map shop = redisTemplate.opsForHash().entries(shopKey);

在上述代码执行时,发生错误,检查后发现redis中已有键名为${CACHE_SHOP_KEY + id}的字符串类型键值对,但是代码中却使用Hash类型进行操作,产生了错误

原因

出现此状况的缘由颇有多是由于:

redis中已经存在同名,但不一样类型的key值。

3、Hutool BeanToMap问题

Hutool BeanToMap的空指针问题

相关推荐
SoleMotive.2 天前
redis实现漏桶算法--https://blog.csdn.net/m0_74908430/article/details/155076710
redis·算法·junit
虹科网络安全3 天前
艾体宝干货 | Redis Python 开发系列#4 保证原子性与性能
redis·python·junit
我发在否3 天前
OpenResty > 平滑升级:1.25.x → 1.27.x
junit·openresty
IMPYLH3 天前
Lua 的 pairs 函数
开发语言·笔记·后端·junit·单元测试·lua
安冬的码畜日常3 天前
【JUnit实战3_35】第二十二章:用 JUnit 5 实现测试金字塔策略
测试工具·junit·单元测试·集成测试·系统测试·bdd·测试金字塔
IMPYLH7 天前
Lua 的 collectgarbage 函数
开发语言·笔记·junit·单元测试·lua
IMPYLH7 天前
Lua 的 assert 函数
开发语言·笔记·junit·单元测试·lua
倚肆10 天前
Spring Boot 日志系统全面详解
spring boot·junit·单元测试
百***489310 天前
Nginx实现接口复制
运维·nginx·junit
安冬的码畜日常12 天前
【JUnit实战3_33】第二十章:用 JUnit 5 进行测试驱动开发(TDD)(下)——TDD 项目的重构过程及新功能的开发实战
测试工具·junit·单元测试·测试驱动开发·tdd·junit5·test-driven