时间:2021-05-02
需求
有时候因为 Redis Key 没有设置过期时间或者因为业务需求或者Redis内存不足或者修改Redis Key值等需求,并且这些Key是有规律的,可以通过正则表达式来匹配。
解决方法一
一般通过网上搜索,会告诉你使用下面方法,Redis 提供了一个简单暴力的指令 keys用来列出所有满足特定正则字符串规则的 key。
$redis-cli--rawkeys"testkey-*"|xargsredis-clidel
通过 Redis keys 来匹配你需要删除的key,再使用 xargs 把结果传给 redis-cli del ,这样看似完美,实则有很大风险。
上面命令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。
注意:这种方法不推荐,建议生产环境屏蔽keys命令。那大家会问,有没有更好的方法来解决这个问题?答案是当然用,请接着看下文。
解决方法二
Redis从2.8版本开始支持 scan 命令,SCAN命令的基本用法如下:
SCANcursor[MATCHpattern][COUNTcount]
例子:
$scan0MATCHtestkey-*
1)"34"
2)1)"testkey-2"
2)"testkey-49"
3)"testkey-20"
4)"testkey-19"
5)"testkey-93"
6)"testkey-8"
7)"testkey-34"
8)"testkey-76"
9)"testkey-13"
10)"testkey-18"
11)"testkey-10"
$scan34MATCHtestkey-*COUNT1000
1)"0"
2)1)"ops-coffee-16"
2)"ops-coffee-19"
3)"ops-coffee-23"
4)"ops-coffee-21"
5)"ops-coffee-40"
6)"ops-coffee-22"
7)"ops-coffee-1"
8)"ops-coffee-11"
9)"ops-coffee-28"
10)"ops-coffee-3"
11)"ops-coffee-26"
12)"ops-coffee-4"
13)"ops-coffee-31"
...
scan 命令返回的是一个包含两个元素的数组,第一个数组元素是用于进行下一次迭代的新游标,而第二个数组元素则是一个数组,这个数组中包含了所有被迭代的元素。
上面这个例子的意思是扫描所有前缀为testkey-的key。第一次迭代使用0作为游标,表示开始一次新的迭代,同时使用了MATCH匹配前缀为testkey-的key,返回了游标值34以及遍历到的数据。第二次迭代使用的是第一次迭代时返回的游标,也即是命令回复第一个元素的值34,同时通过将COUNT选项的参数设置为1000,强制命令为本次迭代扫描更多元素。在第二次调用SCAN命令时,命令返回了游标0,这表示迭代已经结束,整个数据集已经被完整遍历过了。
Redis scan 命令就是基于游标的迭代器,意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。当SCAN命令的游标参数被设置为0时,服务器将开始一次新的迭代,而当redis服务器向用户返回值为0的游标时,表示迭代已结束,这是唯一迭代结束的判定方式,而不能通过返回结果集是否为空判断迭代结束。
上面的需求,最终可以使用下面命令来解决:
$redis-cli--scan--pattern"testkey-*"|xargs-L1000redis-clidel
xargs -L 指令表示xargs一次读取的行数,也就是每次删除key的数量,不要一次行读取太多数量key。
scan 与 keys 比较
scan 相比 keys 具备有以下特点:
小结
Redis 类似 scan 命令还有很多,比如:
注意:SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。而 SCAN 命令则不需要在第一个参数提供任何数据库键,因为它迭代的是当前数据库中的所有数据库键。
参考链接
http://jinguoxing.github.io/redis/2018/09/04/redis-scan/
https://juejin.cn/post/6844903869412016142
原文地址:https://mp.weixin.qq.com/s/kwuKdgerXwiC1uLr8PZLlQ
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题。本文描述一种可行的方
Redis中有删除单个Key的指令DEL,但好像没有批量删除Key的指令,不过我们可以借助Linux的xargs指令来完成这个动作。复制代码代码如下:redis
有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除。但是在keys(patten+
在redis中,对于已经过期的数据,Redis采用两种策略来处理这些数据,分别是惰性删除和定期删除惰性删除惰性删除不会去主动删除数据,而是在访问数据的时候,再检
销量过万的一般都是大众消费品,比如这个季节拖鞋有的店铺就销量过万了~满意请采纳~网店广告位推广联系小笨鸟说只要交三百块钱就可以帮你在外贸平台上开店卖货,比较好奇