
正文
包含luarediskeys的词条
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
redis怎么查询key和删除缓存
1 使用cli
FLUSHDB 清除一个数据库,FLUSHALL清除整个redis数据。
2 使用shell
redis-cli keys "*" | while read LINE ; do TTL=`redis-cli ttl $LINE`; if [ $TTL -eq -1 ]; then echo "Del $LINE"; RES=`redis-cli del $LINE`; fi; done;
删除 3600秒之后过期的
redis-cli keys "*" | while read LINE ; do TTL=`redis-cli ttl $LINE`; if [ $TTL -ge 3600 ]; then echo "Del $LINE"; RES=`redis-cli del $LINE`; fi; done;
删除某些前缀的
redis-cli KEYS "126.com*" | xargs redis-cli DEL
3 使用lua脚本
删除所有keyEVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 *
删除某些key
EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 126.com*
相关问答
Q1: Redis 中使用 Lua 脚本
Redis 本身已经提供了丰富的命令,但是直接用来处理一些复杂业务时可能还不够方便,会有一定的局限性。因此,在 Redis2.6 版本开始提供了对 Lua 脚本的支持,Lua 脚本的使用还是比较广泛的,比如商品秒杀、分布式锁等,使用 Lua 脚本可以带来以下的好处:
为了让例子更加的贴近实际应用,这里实现一个简单版的分布式锁。这里先用 Jedis 操作。
上边详细的介绍了分布式锁的实现过程,以及可能出现的问题,最终,我们决定删除锁的操作使用 Lua 脚本实现,对应的脚本如下:
Lua 脚本中执行具体的 Redis 命令,需要使用 redis.call() 方法, KEYS 表示客户端发起脚本执行命令时携带的 Redis key 的一个集合, ARGV 则是其它参数的一个集合,主意下标从1开始。结合我们的业务,这里的 KEYS[1] 则表示 lock , ARGV[1] 则是一个随机字符串。整个脚本的含义就是,如果客户端传递的 lock 的 value 和 Redis 中存储的一致,就删除 lock 。
Lua 脚本的语法还是比较简单的,具体内容可以自行学习。
前边的准备工作基本结束了,文章开始说过执行脚本有两种途径,下边我们具体来看:
这里使用 jedis.eval() 发送脚本到 Redis 服务器执行,后两个参数分别是 key 的集合,以及 value 参数的集合。
先将脚本以文件形式放到 Redis 里,例如这样:
然后通过如下命令让 Redis 服务器缓存脚本:
script load 命令会在 Redis 服务器缓存 Lua 脚本,并且脚本内容经过 SHA-1 签名算法处理后,会返回脚本内容的 SHA1 校验和的编码,然后在端调用时,传入编码字符串作为参数,这样 Redis 服务器就会执行对应缓存的脚本了,就不用了每次发送具体的脚本内容了。
还有两个比较有用的命令:
除了使用上边的命令缓存脚本、生成脚本的 SHA1 校验和的编码,还可以使用 Jedis 实现,但最终的 SHA1 编码内容是不同的:
实际的项目中,可能更多的会在 SpringBoot 项目中整合 Redis,此时执行 Lua 脚本的基本流程如下:
核心的类就是 DefaultRedisScript ,它实现了 RedisScript 接口。 execute() 方法最后一个参数是可变类型的,用来传递多个 value 参数。初次执行 execute() 方法时,其内部会自动缓存 Lua 脚本到 Redis 服务器;同时每次执行脚本时会根据脚本内容自动计算出对应的 SHA1 校验和的编码,去匹配、执行缓存的脚本。
具体的 SHA1 校验和的编码,可以在 execute() 方法执行后,使用 redisScript.getSha1() 查看。使用 SpringBoot 方式 执行 Lua 脚本生成的 SHA1 校验和的编码和前边直接使用 Jedis 生成的一致。
无论用那种方式在 Redis 中使用 Lua 脚本,其中的原理都是类似的。
Q2: lua脚本删除redis指定key
key_name是键名,cd到redis-cli目录,./redis-cli eval "redis.call('del',key_name)" 0
Q3: 高并发场景Redis分布式锁实现方式
原理很简单,set 一个 锁-key,如果成功则说明加锁成功,反之则失败。
为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下几个条件:
基于以上条件,采用set扩展参数,保证原子性操作: SET lock-key "lock-client" EX 10086 NX
lock-key "lock-client" 指定 加锁client,解锁时用于判断。
EX 10010 指定过期时间
NX 只在键不存在时,才对键进行设置操作。效果等同于 SETNX 命令。
只不过早期版本redis不支持set的扩展参数,这就需要用到 lua 脚本了 。
加锁可以在高版本借助set命令实现原子操作,但解锁就不可以了,依然得用到lua脚本。
Redis在2.6版本推出了 lua 脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:
需要在获得 lock-key 后判断加锁对象是否为当前client,是,则解锁。Lua 脚本如下:
if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end
执行方式:eval;
eval 参数列表: eval lua-script key-num [key1 key2 key3 ....] [value1 value2 value3 ....] ,参数解析:
eval执行示例: eval "redis.call('set',KEYS[1],ARGV[1])" 1 lua-key lua-val ;
完整解锁执行脚本:
eval "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 lock-key client-val
----------End----------
关于luarediskeys和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







