目录
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值。