当前位置: 首页 > 编程笔记 >

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

劳麒
2023-03-14
本文向大家介绍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/env python
# -*- coding: UTF-8 -*- 
#功能:扫描某个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脚本实例,包括了Redis获取某个前缀的key脚本实例的使用技巧和注意事项,需要的朋友参考一下 1.背景 在平时的维护中,经常会遇到要统计某个前缀的key有多少,在请求比较多的redis中,keys * 会直接导致阻塞。 可以采用scan的方式进行增量迭代,查询使用pipeline减少交互,提高效率。 2.scan命令的优缺点 SCAN命令的有SCAN,

  • 本文向大家介绍获取JsonObject某一未知key的值操作,包括了获取JsonObject某一未知key的值操作的使用技巧和注意事项,需要的朋友参考一下 我就废话不多说了,大家还是直接看代码吧~ 补充:java 解析json 遍历未知key 看代码吧~ 以上为个人经验,希望能给大家一个参考,也希望大家多多支持呐喊教程。如有错误或未考虑完全的地方,望不吝赐教。

  • 问题内容: 如何使用排序集从Redis获取多个键的值? 这将有两个用户。 如何在一个查询中检索具有键“ David”和“ Linda”的用户? 问题答案: 无需在Redis中引入新命令的方法有多种。 例如,您可以使用感兴趣的名称填充临时集,然后计算该临时集与zset之间的交集: 使用流水线操作,只会产生一次往返,并且您可以在tmp中填充任意数量的输入参数。 使用Redis 2.6,您还可以将这些行

  • 问题内容: 我目前正在与Redis一起玩,我有几个问题。是否可以从键数组中获取值? 例: 当我返回时。我可以遍历此列表并获得用户:1,获得用户:2。但这感觉不对,有没有办法让所有与会者的信息一目了然? 在rails中,我会做这样的事情: 但是在redis中我不能,因为它返回键,而不是存储在该键上的实际对象。 谢谢 :) 问题答案: 在项目上循环并同步访问每个元素不是很有效。使用Redis 2.4,

  • 本文向大家介绍Redis中实现查找某个值的范围,包括了Redis中实现查找某个值的范围的使用技巧和注意事项,需要的朋友参考一下 本文来自Redis在Google Group上的一个问题,有一位同学发贴求助,说要解决如下的一个问题:他有一个IP范围对应地址的列表,现在需要给出一个IP的情况下,迅速的查找到这个IP在哪个范围,也就是要判断此IP的所有地。这个问题引来了Redis作者Salvatore

  • 主要内容:Redis 脚本,1.Eval 命令,2.EvalSha 命令,3.Script Exists 命令,4.Script Flush 命令,5.Script kill 命令,6.Script Load 命令Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。 1.Eval 命令 Redis Eval 命令使用 Lua 解释器执行脚本。 1.1语法 Eval 命令的基本语法如下: cript