redis - redis优化经验 - 根据regex 正则 删掉多个key
访问量: 1899
通过 $ 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