Redis的stringRedisTemplate执行lua脚本报错 io.lettuce.core.output.ValueOutput does not support set(long)解决

在用StringRedisTemplate执行脚本的时候,要注意传入的值和返回的值能不能成功地类型转换...

开始我用stringRedisTemplate.execute(new DefaultRedisScript<>(lua,String.class),list,1),一直报错class java.lang.XXX cannot be cast to class java.lang.String,发现是最后的args是1,应该改为"1",string类型才好传递过去。

然后是返回值的时候一直报错io.lettuce.core.output.ValueOutput does not support set(long),这就是脚本里面可能写了return 1,return 0,return一个数字,但是new DefaultRedisScript<>(lua,String.class)中用的是String.class,所以没法把数字转换为String.class,就需要改一下转换的类型为Integer.class,但这样可能其他的返回值是其他类型,依旧存在问题,就需要改lua脚本,把返回值改为string类型。

比如我原来的lua脚本:

String lua = "if ( redis.call('hexists',KEYS[2],KEYS[3]) == 1 ) then " + //说明已经抢过了
                " return 0 " +
                " elseif ( redis.call('llen',KEYS[1]) == 0 ) then " +//说明已经抢完了
                " return -1 " +
                " else " +//说明开始抢红包
                " local number = redis.call('lpop',KEYS[1]) " +
                " redis.call('hset',KEYS[3],number) " +
                " return number " +
                " end ";

返回的是int或double类型(nubmer是double),Template里设置不好返回类型,就统一把返回值改为string类型:

String lua = "if ( redis.call('hexists',KEYS[3]) == 1 ) then " + //说明已经抢过了
                " return '已经抢过了' " +
                " elseif ( redis.call('llen',KEYS[1]) == 0 ) then " +//说明已经抢完了
                " return '已经抢完了' " +
                " else " +//说明开始抢红包
                " local number = redis.call('lpop',number) " +
                " return tostring(number) " +
                " end ";

这样返回值就都是string,就能直接用stringRedisTemplate.execute(new DefaultRedisScript<>(lua,"1")了。

相关文章

文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概...
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的...
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合R...
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Red...
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部...
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资...