redis+lua实现脚本一键查询

场景

经常需要查redis某个key的值,需要执行三条命令才能查到

  1. redis-cli,启动redis
  2. select num,选择db
  3. get key,查询语句

需要执行三条命令才能实现某个key的查询

有没有一种方式,直接一条命令搞定,并且做成脚本,实现快捷查询?

通过redis+lua实现的bat脚本替代上面多次操作

实现

说明:C:\Users\Administrator\Desktop,这个是lua脚本的存放目录

单机环境

lua脚本代码
redis.call('SELECT','2')
return redis.call('GET','a')
bat脚本代码
redis-cli --eval C:\Users\Administrator\Desktop\redis1.lua
pause

集群环境

lua脚本代码
redis.call('SELECT','2')
return redis.call('GET',KEYS[1])
bat脚本代码
redis-cli -h xxx.redis.rds.aliyuncs.com -p 6379 -a user:password --eval C:\Users\Administrator\Desktop\redis.lua key
pause
注意

Redis集群对lua脚本限制:调用必须要带有key,否则直接返回错误信息, “-ERR for redis cluster, eval/evalsha number of keys can’t be negative or zerorn”

遇到的问题

脚本只启动redis,没问题,如果配合lua脚本查询,会发生闪退?
其实命令已经正常执行了,只不过窗口闪退了
目前解决的办法是加上pause,让窗口停留
(error) ERR ‘EVAL’ command keys must in same slot
原因:lua脚本为保证事务,传入的key必须是在同一个slot中
解决:在KEY上加{},这样在hash key 的时候只会计算{}内的内容,使得Key落在同一个slot内
比如,我们原来的key是ali1,ali2,现在我们写成{ali}1,{ali}2,就不会报错

拓展

设置指定key的value,传入key的旧值和新值

lua脚本代码
if val == ARGV[1]
then
	redis.call('SET', KEYS[1], ARGV[2])
	return 1
else
	return 0
end
bat脚本代码
redis-cli --eval C:\Users\Administrator\Desktop\redis1.lua  a , 1 2
pause

上面的代码实现了把a的值从1改为2
注意:[key…]空格,空格[args…],英文逗号要用空格隔开,所有单词都要用空格隔开,不然执行不成功

posted @ 2022-06-02 11:10  程序员Forlan  阅读(368)  评论(0编辑  收藏  举报