当前位置:首页 > 问答 > 正文

Redis数据库清理那些事儿,教你简单又实用的方法一步步搞定

(引用来源:Redis官方文档,以及常见的运维实践经验)

你是不是也遇到过这种情况?服务器突然变慢,查来查去发现是Redis把内存快占满了,这时候你就得赶紧给Redis“瘦身”了,别担心,这事儿没想象中那么复杂,今天我就用大白话,一步步教你几种简单又实用的清理方法,让你轻松搞定。

第一步:先搞清楚“家底”还剩多少

在动手清理之前,咱们得先看看现在Redis里到底用了多少内存,有没有哪些数据是特别占地方的,这就好比你要收拾屋子,总得先看看哪个房间最乱吧。

打开你的Redis命令行工具(比如用redis-cli),输入命令:info memory,你会看到一大堆信息,别慌,重点关注这两个:

  • used_memory:这是Redis当前实际使用的内存总量,就是你最关心的那个数字。
  • used_memory_human:这个更友好,它会用M(兆)、G(吉)这样的单位显示,一眼就能看明白。

(引用来源:Redis INFO 命令说明)

第二步:找出那些“占着茅坑不拉屎”的Key

一些数据可能设置了过期时间但一直没被访问,或者根本就是些没用的陈年旧数据,我们可以用以下命令来扫描一下:

redis-cli --bigkeys 这个命令会帮你扫描整个数据库,找出哪种数据类型的Key最大,并列出最大的那几个,比如发现某个Hash键特别大,那你就可以重点检查它了。

Redis数据库清理那些事儿,教你简单又实用的方法一步步搞定

redis-cli --scan --pattern ‘*’ | head -100 这个命令可以随机扫描并列出一些Key(这里例子是前100个),让你看看Key的命名和大概有哪些数据,你可以把 换成像 user:session:* 这样的模式,专门查看某一类Key。

第三步:开始动手清理(几种常用方法)

了解清楚情况后,就可以选择合适的方法清理了。

设置过期时间,让数据“自动消失”

这是最省心的方法,对于那些你知道在一定时间后就没用了的数据,比如用户登录凭证(session)、手机验证码、临时缓存等,在存入Redis时就直接给它设个“寿命”。

命令是:SET key value EX secondsSET user:123:token “abc” EX 3600 就是1小时后过期)。 或者对已存在的Key设置:EXPIRE key seconds

Redis数据库清理那些事儿,教你简单又实用的方法一步步搞定

设好之后,Redis会自动在时间到了之后删除它们,完全不用你操心,Redis内部有策略会定期清理过期的Key。

(引用来源:Redis SETEXPIRE 命令)

手动删除,来个“大扫除”

如果有些数据明确不需要了,那就直接删掉,可以用 DEL key 命令一个一个删。

但如果要批量删除符合某个模式的Key,比如删除所有以 “temp:cache:” 开头的Key,千万不要在命令行里用 KEYS temp:cache:* 再管道符删除!因为 KEYS 命令在数据量大时会阻塞其他请求,非常危险。

正确的方法是使用 SCAN 命令结合脚本来分批删除,或者直接用这个命令: redis-cli --scan --pattern “temp:cache:*” | xargs redis-cli del 这个命令的意思是:先扫描出所有匹配的Key,然后一个个传给 DEL 命令删除。SCAN 命令是游标方式的,不会阻塞服务。

Redis数据库清理那些事儿,教你简单又实用的方法一步步搞定

(引用来源:Redis SCANDEL 命令的结合使用)

终极武器——清空整个数据库

如果情况非常紧急,需要立刻释放所有内存,或者你确定某个数据库里的所有数据都可以不要了,可以用这个“核武器”。

  • FLUSHDB 命令:清空当前你连接的这一个数据库的所有数据。
  • FLUSHALL 命令:清空Redis服务器上所有数据库的数据。(警告:这个命令杀伤力极大,一定要慎用!用之前务必确认无误!

第四步:养成好习惯,防范于未然

清理毕竟是事后补救,最好的方式是让Redis一直保持“苗条”。

  1. 配置内存上限:在Redis的配置文件 redis.conf 里,找到 maxmemory 这个参数,给它设置一个值,maxmemory 2gb,这样当内存用到2G时,Redis就会触发它的清理策略。
  2. 设置淘汰策略:光有上限还不够,还得告诉Redis内存满了之后怎么办,同样是配置文件里的 maxmemory-policy 参数,常用的有:
    • volatile-lru:从那些设置了过期时间的Key中,淘汰最近最少使用的。
    • allkeys-lru:从所有Key中,淘汰最近最少使用的。
    • volatile-ttl:淘汰剩余寿命最短的Key。 根据你的业务特点选一个合适的策略,这样即使你忘了手动清理,Redis也能自己腾出空间。

(引用来源:Redis配置文件中关于 maxmemorymaxmemory-policy 的说明)

最后的小提醒

清理数据前,如果条件允许,最好先备份一下数据(用 BGSAVE 命令生成RDB快照),尤其是执行 FLUSHDBFLUSHALL 前,一定要万分小心,确认再确认,别一不小心把重要数据全搞没了。

好了,以上就是Redis数据库清理的常规操作,从查看状态到选择清理方法,再到日常配置预防,一步步来,你会发现管理Redis内存其实并不难,希望这些简单实用的方法能帮到你!