首页 > 数据库 >Redis大key问题

Redis大key问题

时间:2024-02-04 13:56:19浏览次数:26  
标签:删除 Redis redis value 问题 命令 key

什么是大key

很多朋友肯定在想redis的key能有多大呀?

这里就有个误区了,所谓的大key问题是某个key的value比较大,所以本质上是大value问题

这样就对上了,key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。

设想一种场景:

在线音乐app中,某个歌单有很多用户收藏,假如有这样的数据结构:

  • 歌单和用户之间的映射关系采用redis存储

  • redis的key是歌单ID,长度可控且很小

  • redis的value是个list,list包含了用户ID

  • 用户可能很多,就导致list长度不可控

这下明白啥是大key问题了吧!

redis中有常见的几种数据结构,每种结构对大key的定义不同,比如:

  • value是String类型时,size超过10KB

  • value是ZSET、Hash、List、Set等集合类型时,它的成员数量超过1w个

上述的定义并不绝对,主要是根据value的成员数量和字节数来确定,业务可以根据自己的场景也确定标准

 

大key有什么影响

我们都知道,redis的一个典型特征就是:核心工作线程是单线程。

单线程中请求任务的处理是串行的,前面完不成,后面处理不了,同时也导致分布式架构中内存数据和CPU的不平衡。

  • 执行大key命令的客户端本身,耗时明显增加,甚至超时

  • 执行大key相关读取或者删除操作时,会严重占用带宽和CPU,影响其他客户端

  • 大key本身的存储带来分布式系统中分片数据不平衡,CPU使用率也不平衡

  • 大key有时候也是热key,读取操作频繁,影响面会很大

  • 执行大key删除时,在低版本redis中可能阻塞线程

这样看来大key的影响还是很明显的,最典型的就是阻塞线程,并发量下降,导致客户端超时,服务端业务成功率下降

大key是如何产生的

大key的产生往往是业务方设计不合理,没有预见vaule的动态增长问题:

  • 一直往value塞数据,没有删除机制,迟早要爆炸

  • 数据没有合理做分片,将大key变成小key

如何找到大key

  • 增加内存&流量&超时等指标监控

由于大key的value很大,执行读取时可能阻塞线程,这样Redis整体的qps会下降,并且客户端超时会增加,网络带宽会上涨,配置这些报警可以让我们发现大key的存在。

  • bigkeys命令

使用bigkeys命令以遍历的方式分析Redis实例中的所有Key,并返回整体统计信息与每个数据类型中Top1的大Key

 

  • redis-rdb-tools

使用redis-rdb-tools离线分析工具来扫描RDB持久化文件,虽然实时性略差,但是完全离线对性能无影响。

redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件生成json文件或者生成报表用来分析Redis的使用详情。

  • 集成化可视化工具

基于某些公有云或者公司内部架构的redis一般都会有可视化的页面和分析工具,来帮助我们定位大key,当然页面底层也可能是基于bigkeys或者rdb文件离线分析的结果。

如何解决大key问题

如何解决大key问题

根据大key的实际用途可以分为两种情况:可删除和不可删除。

删除大key

如果发现某些大key并非热key就可以在DB中查询使用,则可以在Redis中删掉:

  • 当Redis版本大于4.0时,可使用UNLINK命令安全地删除大Key,该命令能够以非阻塞的方式,逐步地清理传入的Key。

Redis UNLINK 命令类似与 DEL 命令,表示删除指定的 key,如果指定 key 不存在,命令则忽略。
UNLINK 命令不同与 DEL 命令在于它是异步执行的,因此它不会阻塞。
UNLINK 命令是非阻塞删除,非阻塞删除简言之,就是将删除操作放到另外一个线程去处理。

  • 当Redis版本小于4.0时,避免使用阻塞式命令KEYS,而是建议通过SCAN命令执行增量迭代扫描key,然后判断进行删除。

Redis Scan 命令用于迭代数据库中的数据库键。
SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

压缩和拆分key

    • 当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。

    • 当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的key,使用multiget等操作实现事务读取。

    • 当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。

 

压缩和拆分key

  • 当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。

  • 当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的key,使用multiget等操作实现事务读取。

  • 当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。

标签:删除,Redis,redis,value,问题,命令,key
From: https://www.cnblogs.com/JavaYuYin/p/18006055

相关文章

  • Memory protection key in Linux
    MemoryProtectionKeysReference:MPKinLinuxkerneldocumentMemoryProtectionKeysforUserspace(PKUakaPKEYs)isafeaturewhichisfoundonIntel’sSkylake“ScalableProcessor”ServerCPUs.Itwillbeavalableinfuturenon-serverparts.Foranyone......
  • gitlab 502问题解决
    问题现象: Whoops,GitLabistakingtoomuchtimetorespond.Tryrefreshingthepage,orgoingbackandattemptingtheactionagain.PleasecontactyourGitLabadministratorifthisproblempersists. 问题定位分析:一、查看系统资源使用情况磁盘满了g......
  • 解决缓存与数据库同步下的同步锁问题之分段锁
    契子  在实际业务会我们会使用第三方的缓存例如:Reids、Memcache等;但是,并且我们在查询使用缓存时都得尽可能的保证缓存的一致性,在读取时得保证尽可能的保证缓存拿到的是数据库的最新数据,那么在实现的逻辑上一般都为这样:1、请求线程先读取缓存实现2、如果缓存没有数据的话触发......
  • edusrc-appkey泄露
    edusrc-appkey泄露简介AppKey泄露是指应用程序的应用密钥(AppKey)或API密钥被非法访问或公开的安全事件。AppKey是应用程序与第三方服务或API进行安全通信的凭证,通常用于身份验证和数据加密。如果这些密钥泄露,攻击者可以利用它们来访问敏感数据、执行未授权的操作或冒充合法的服务......
  • redis有5种数据结构
    redis有5种数据结构,分别如下:5种数据结构python语言对5种数据结构的增删改查全局函数1|0redis连接importredispool=redis.ConnectionPool(host='localhost',port=6379,decode_responses=True)r=redis.Redis(connection_pool=pool)redis取出的结果默认是字节,可......
  • 很好用的python游戏环境(续):强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个pyt
    前文分享了一个python下的maze游戏环境,本文再给出一个不错的实现项目,这个项目的实现更加的简单,并且可视化界面做的很好看,是用tkinter框架做的可视化:相关:迷宫游戏python实现Github地址:https://github.com/wonanut/Maze-Game/tree/Maze-game-v1.0.7......
  • 很好用的python游戏环境:强化学习算法走迷宫游戏环境(导航问题 navigation):分享一个pyth
    项目的GitHub地址(作者:莫凡):https://github.com/MorvanZhou/mmaze运行的示例代码:importmmazestart=(0,0)end=(10,10)m=mmaze.generate(width=11,height=11,symmetry="horizontal")solutions=m.solve(start=start,end=end)m.plot(solution=solutions[0],star......
  • vSphere上启用嵌套虚拟化运行Proxmox VE和DoraCloud,虚拟机无法访问物理网络问题
    在vSphere上部署ProxmoxVE,然后在ProxmoxVE内部署DoraCloud桌面云系统。首先遇到的一个问题是安装ProxmoxVE时,提示不支持嵌套虚拟化。解决方法:在vSphere中为ProxmoxVE这个虚拟机启用嵌套,即让vSphereESXi向虚拟机暴露硬件虚拟化的支持。这样ProxmoxVE可以正常检测到硬......
  • 关于 AJAX 请求跨域问题在 Vue 项目中的解决方式
    0.前言关于域,sry刚刚新建文件夹,写好了就换过来;此文为88岁高龄、入门级前端初心者专用笔记;暂时只关心AJAX请求受同源策略的影响及在Vue项目中的解决方式捏;1.必要性1.0你需要知道(1)协议、域名、端口都相同,才为同源;(2)浏览器报跨域错误,并不是服务器没有返回,而......
  • redis相关
    2.Redis单线程含义 Redis的网络IO和键值对读写是由一个线程来完成的Redis其他功能,如持久化、异步删除、集群数据同步等其实都是由额外线程执行3.Redis单线程设计3.1多线程需要解决的问题4.多路复用机制    Redis多路复用机制在网络IO操作中能并发处理......