Redis怎么获取某个大key值
这篇文章将为大家详细讲解有关Redis怎么获取某个大key值,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
1、前言
工作中,经常有些Redis实例使用不恰当,或者对业务预估不准确,或者key没有及时进行处理等等原因,导致某些KEY相当大。
那么大Key会带来哪些问题呢?
如果是集群模式下,无法做到负载均衡,导致请求倾斜到某个实例上,而这个实例的QPS会比较大,内存占用也较多;对于Redis单线程模型又容易出现CPU瓶颈,当内存出现瓶颈时,只能进行纵向库容,使用更牛逼的服务器。
涉及到大key的操作,尤其是使用hgetall、lrange 0 -1、get、hmget 等操作时,网卡可能会成为瓶颈,也会到导致堵塞其它操作,qps 就有可能出现突降或者突升的情况,趋势上看起来十分不平滑,严重时会导致应用程序连不上,实例或者集群在某些时间段内不可用的状态。
假如这个key需要进行删除操作,如果直接进行DEL 操作,被操作的实例会被Block住,导致无法响应应用的请求,而这个Block的时间会随着key的变大而变长。
在redis中,对于一个很大的key,例如hash类型,直接查看其值会非常慢,于是想到写个脚本通过增量迭代来获取,下面话不多说了,来一起看看详细的介绍吧。
2、具体的脚本如下:
功能:扫描redis某个key里面的所有元素
使用方法:python bigkey_save_values.py "zyyset" "*" 100
3、python脚本实现如下:
#!/usr/bin/envpython#-*-coding:UTF-8-*-#功能:扫描某个key里面的所有元素#使用方法:pythonbigkey_save_values.py"zyyset""m*"100#如需获取全部的元素:pythonbigkey_save_values.py"zyyset""*"100__author__="lcl"importsysimportredisimportospool=redis.ConnectionPool(host='192.168.225.128',port=6379,db=0)r=redis.StrictRedis(connection_pool=pool)#指定keykey=sys.argv[1]#扫描匹配值match=sys.argv[2]#每次匹配数量count=sys.argv[3]#总数量total=0#获取当前路径path=os.getcwd()keytype=r.type(key)print"key的类型为%s"%(keytype)#扫描到的key输出的文件txt=path+"/%s.txt"%(key)#打开文件#f=open(txt,"w")deflist_iter(name):list_count=r.llen(key)forindexinrange(list_count):yieldr.lindex(key,index)ifkeytype=='list':f=open(txt,"w")foriteminlist_iter(key):#将匹配到对应key中的member/score输出到文件中f.write("%s%s"%(item,"\n"))total=total+1f.closeelifkeytype=='hash':f=open(txt,"w")foriteminr.hscan_iter(key,match=match,count=count):#将匹配到对应key中的member/score输出到文件中f.write("%s%s"%(item,"\n"))total=total+1f.closeelifkeytype=='set':f=open(txt,"w")foriteminr.sscan_iter(key,match=match,count=count):f.write("%s%s"%(item,"\n"))total=total+1f.closeelifkeytype=='zset':f=open(txt,"w")foriteminr.zscan_iter(key,match=match,count=count):f.write("%s%s"%(item,"\n"))total=total+1f.closeelse:print("key的类型为string,value为:"+r.get(key))print"key:%s的match:%s的数量为:%d"%(key,match,total)
关于“Redis怎么获取某个大key值”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。