平时我们在redis中查找某一固定前缀的key一般使用的命令是:keys pattern,但是在生产环境中这是个很危险的命令。如果生产环境数据量很大,使用这个命令会导致redis锁住和CPU飙升,其他业务全部阻塞(因为redis是单线程的),等到这个命令结束的时候全部请求瞬间打到redis中导致缓存雪崩,redis崩了导致数据库也扛不住了。
1.生产环境如何禁用这个命令
在redis.conf文件中,在SECURITY这一项中,我们新增命令:
rename-command KEYS ""
2.使用游标代替keys命令
游标的特点是每次只返回一部分数据,而keys命令要全部遍历完数据才返回结果,相比之下使用游标遍历更加安全。
游标的语法为:SCAN cursor [MATCH PATTERN] [count]
每次返回一个整数和部分结果值,当整数不为0是代表还没有遍历完,再输入返回的整数继续遍历。
示例:从0开始遍历,每次返回10条数据
第二次遍历的时候直接用第一次返回的整数来继续遍历
另外,每次遍历的结果可能会有重复,需要在代码里用HashSet去重。