1、分析内存占用情况
redis内存分析工具redis-rdb-tools安装部署 项目地址:?https://github.com/sripathikrishnan/redis-rdb-tools
安装部署 安装Python2.7 下载redis-rdb-tools git clone https://github.com/sripathikrishnan/redis-rdb-tools.git 安装redis-rdb-tools pip2.7 install ?python-lzf cd redis-rdb-tools python2.7 setup.py install
# 以json格式输出
> rdb --command json /var/redis/6379/dump.rdb
# 以json格式输出,模糊查找
> rdb --command justkeyvals --key "user.*" /var/redis/6379/dump.rdb
user003 fname Ron,sname Bumquist,
user001 fname Raoul,sname Duke,
user002 fname Gonzo,sname Dr,
user_list user003,user002,user001
# 查找确定键信息
> redis-memory-for-key -s localhost -p 6379 -a mypassword person:1
Key person:1
Bytes 111
Type hash
Encoding ziplist
Number of Elements 2
Length of Largest Element 8
# rdb文件解析并输出为csv
> rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
> cat memory.csv
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,lizards,241,quicklist,5,19
0,list,user_list,190,quicklist,3,7
2,hash,baloon,138,ziplist,3,11
2,list,armadillo,231,quicklist,5,20
2,hash,aroma,129,ziplist,3,11
# 输出top10的键信息
rdb -c memory --largest=10 /app/redis/data/7000/dump.rdb
2、清理内存
使用 SCAN 和 Pipeline 命令删除
Redis 的大 Key 删除操作会导致 Redis 线程阻塞,网上关于如何删除大 Key 也有一些不少,只有通过 SCAN 扫出 Key 后一个个删除。
这里结合 pipeline 介绍更加高效的操作方法,通过 pipeline 来批量删除。
下面以每次扫出1000个 field 为例子,每次通过 pipeline 删除1000个 field 来删除一个大 Hash Key。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import redis
# 每次 SCAN 和删除 field 的数量,可以根据实际调高以提高效率
COUNT = 1000
# Redis 连接
conn = redis.StrictRedis(host='127.0.0.1', port=6379)
# 要删除的 Key 的名字
key_to_be_deleted = 'key_to_be_deleted'
# 参考函数
def del_key(redis_conn, hash_key, del_count):
cursor = '0'
while cursor != 0:
pl = redis_conn.pipeline()
cursor, data = redis_conn.hscan(hash_key, cursor=cursor, count=del_count)
for item in data.items():
pl.hdel(hash_key, item[0])
pl.execute()
def main():
del_key(conn, key_to_be_deleted, COUNT)
if __name__ == '__main__':
main()
删除string 类型的key
redis-cli -h 127.0.0.1 -p 6379 keys 'blk_1*' | xargs redis-cli -h 127.0.0.1 -p 6379 del
|