Back

redis - redis优化经验 - 根据regex 正则 删掉多个key

发布时间: 2018-05-04 01:56:00

参考:  https://stackoverflow.com/questions/4006324/how-to-atomically-delete-keys-matching-a-pattern-using-redis

通过 $ redis-cli INFO 来查看 server的版本. 

redis 2.6.0: 

EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 your_keys_pattern*

redis 3.2.8: 

redis-cli -n 1 keys your_keys* | xargs redis-cli -n 1 DEL    # 注意pipe 后面的 -n 1 是不能省略的。否则不会删除

对于 指定的端口号:

$ redis-cli -p 6800 keys *buy | xargs redis-cli -p 6800 DEL  (注意前期需要等会儿, 每次删的记录则是7000条左右, 大约 50W/s )

可以通过下面的命令查看数据库的记录:

$ info keyspace

非常重要:

1. 一个2.8G的 dump.rdb 文件, 启动后要加载到内存,需要  82秒 (阿里云)

12802:M 19 Nov 20:42:46.625 * DB loaded from disk: 82.293 seconds

AWS上,  20G dump.rdb, 需要加载     31932:M 20 Nov 11:03:25.766 * DB loaded from disk: 154.903 seconds

2. 删除之前, 建议重启redis, 修改配置文件: (不要修改10000条数据后, 立刻备份,否则是不行的)

#   after 900 sec (15 min) if at least 1 key changed
#   after 300 sec (5 min) if at least 10 keys changed
#   after 60 sec if at least 10000 keys changed
save 900 1
save 500 10
save 300 10000   # 这里改成 300 就可以. 一般说来, 1S可以删掉5W记录

3. 每次redis在做持久化的时候,其实是不响应查询的.  所以尽可能的缩短持久化的时间(这点远不及mysql了)

4. 要把redis跟mysql拆开.  否则redis在写硬盘的时候,会抢占mysql的性能

根据warning, 我们可能要运行下面两个命令: 

$ sysctl vm.overcommit_memory=1

$ echo never > /sys/kernel/mm/transparent_hugepage/enabled

下面是效果:(大部分都是没用的order)

-rw-r----- 1 root   root    20G Nov 20 10:50 dump.rdb
-rw-r----- 1 root   root   621M Nov 20 11:13 dump.rb.removed_order
-rw-r----- 1 root   root   257M Nov 20 11:16 dump.rdb.removed_account_member

Back