承接国内外服务器租用托管、定制开发、网站代运营、网站seo优化托管接单、网站代更新,新老站点皆可!!咨询QQ:3787320601

Redis获得某个大key值的脚本实例

管理员 2023-07-24 08:53:56 互联网圈 0 ℃ 0 评论 3574字 收藏

Redis获得某个大key值的脚本实例

1、前言

工作中,常常有些Redis实例使用不恰当,或对业务预估不准确,或key没有及时进行处理等等缘由,致使某些KEY相当大。

那末大Key会带来哪些问题呢?

如果是集群模式下,没法做到负载均衡,致使要求倾斜到某个实例上,而这个实例的QPS会比较大,内存占用也较多;对Redis单线程模型又容易出现CPU瓶颈,当内存出现瓶颈时,只能进行纵向库容,使用更牛逼的服务器。

触及到大key的操作,特别是使用hgetall、lrange 0 ⑴、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/env python
# -*- coding: UTF⑻ -*- 
#功能:扫描某个key里面的所有元素
#使用方法:python bigkey_save_values.py "zyyset" "m*" 100
#如需获得全部的元素:python bigkey_save_values.py "zyyset" "*" 100
__author__ = "lcl" 
import sys
import redis 
import os 
pool=redis.ConnectionPool(host='192.168.225.128',port=6379,db=0) 
r = redis.StrictRedis(connection_pool=pool) 
#指定key
key = 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")
def list_iter(name):
 list_count = r.llen(key)
 for index in range(list_count):
  yield r.lindex(key, index)
if keytype=='list':
 f = open(txt,"w")
 for item in list_iter(key):
#将匹配到对应key中的member/score输出到文件中
  f.write("%s %s" % (item,"\n"))
  total = total+1
 f.close
elif keytype=='hash':
 f = open(txt,"w")
 for item in r.hscan_iter(key,match = match,count = count):
#将匹配到对应key中的member/score输出到文件中
  f.write("%s %s" % (item,"\n"))
  total = total+1
 f.close
elif keytype=='set':
 f = open(txt,"w")
 for item in r.sscan_iter(key,match = match,count = count):
  f.write("%s %s" % (item,"\n"))
  total = total+1
 f.close
elif keytype=='zset':
 f = open(txt,"w")
 for item in r.zscan_iter(key,match = match,count = count):
  f.write("%s %s" % (item,"\n"))
  total = total+1
 f.close
else:
 print("key的类型为string,value为:" + r.get(key))
print "key:%s的match:%s的数量为:%d" % (key,match,total)

总结

本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!

文章来源:丸子建站

文章标题:Redis获得某个大key值的脚本实例

https://www.wanzijz.com/view/66341.html

相关文章

Related articles

X

截屏,微信识别二维码

微信号:weimawl

(点击微信号复制,添加好友)

打开微信