首页 > 数据库 >Redis中Big Key该如何解决?

Redis中Big Key该如何解决?

时间:2024-08-17 22:58:59浏览次数:12  
标签:Key Big Redis BigKey user key

目录

1、Big Key的产生

2、BigKey场景分析

3、Big Key的危害

4、检测 BigKey 

5、解决 BigKey 问题

Big Key拆分

(1)按时间/业务拆分

(2)按哈希(Hash)拆分

(3)按前缀树拆分

Big Key定期清理

Big key压缩

Big Key批处理

优化持久化配置

6、总结


 Big Key 问题是指某个键(key)的值(value)过大,这会导致 Redis 的性能下降

1、Big Key的产生

  • 业务设计不合理

在设计应用时,如果对数据结构的设计不够精细,可能会导致单个 key 存储的数据量过大,没有合理地拆分成多个较小的 key

如:存储了大量数据的字符串、哈希表(hash)、列表(list)等,这会导致在执行涉及该键的操作时消耗更多的时间和资源。

  • 未及时清理无用数据

如:忘记设置过期时间,没有定期删除过期或不再需要的数据,List结构中数据持续增加而没有弹出数据的机制,那么数据会越来越多

  • 数据类型选择不当

不同的数据类型有不同的内存使用特点。例如,使用字符串类型存储大量数据可能不如使用哈希(HASH)类型来得高效。
选择不适合的数据类型可能导致内存使用效率低下,进而产生 Big Key

如:文件二进制数据不使用 String 保存、使用 HyperLogLog 统计页面 UV、Bitmap 保存状态信息(0/1)

  • 动态增长管理不当

某些数据结构可能随着时间和用户行为的变化而不断增长,如果没有适当的管理机制来控制其增长,就可能导致 Big Key 的出现。

如:日志记录、历史数据存储、某个明星热点粉丝列表或者评论的列表等功能如果没有合理的清理策略,可能会导致 key 的数据量逐渐增大

2、BigKey场景分析

以以下常见的场景分析Big Key的问题以及解决方案:

1. 用户行为日志记录

场景描述:应用程序记录用户的行为日志,如点击事件、浏览历史等,通常会将这些数据存储在一个用户的键中。
问题产生:随着用户行为的增多,单一用户的日志数据量会逐渐增大,形成 BigKey。
解决方案:分割日志数据到多个键中,例如按照日期分割。定期归档或清理旧的日志数据

2. 产品目录或商品信息

场景描述:电商平台或零售系统中,每个商品可能包含大量的属性信息,如规格、价格、库存等。
问题产生:如果将所有商品信息都存储在一个键中,随着商品数量的增加,键的大小也会增加。
解决方案:将商品信息拆分为多个键,例如按类别或品牌存储。使用更高效的数据结构,如使用哈希表存储商品的属性

3. 社交网络的好友关系

场景描述:社交应用中,每个用户都有自己的好友列表。
问题产生:当用户的好友数量非常多时,存储好友列表的键可能会变得非常大。
解决方案:将好友列表拆分为多个键,例如按照字母顺序或好友活跃度进行分组。使用有序集合(Sorted Set)存储好友列表,便于快速查找和排序

4. 会话状态存储

场景描述:Web 应用程序中,会话状态通常需要在服务器端存储。
问题产生:如果每个用户的会话状态包含了大量数据,如购物车、登录信息等,会话状态键可能会变得非常大。
解决方案:将会话状态拆分为多个键,例如将购物车和其他状态分开。定期清理过期的会话状态。

3、Big Key的危害

  • 性能下降

对 BigKey 执行批量操作,如 HGETALLHSETALL,这些命令的时间复杂度通常是 O(N),其中 N 是键中元素的数量。当 N 很大时,这些操作会变得非常耗时,尤其是在 Redis 的单线程模型下

  • 内存占用

BigKey 占用过多的内存,可能导致 Redis 的整体内存使用过高,从而触发内存淘汰策略,影响其他键的性能

  • 网络拥塞

BigKey 在网络上传输时会占用较多带宽,特别是当客户端频繁读取或写入 BigKey 时,可能会导致网络拥塞。

  • 超时阻塞

Redis 的主要命令执行是在单线程中完成的,这意味着在执行 BigKey 相关操作时,其他客户端的请求会被阻塞,直到该操作完成

  • 备份和恢复时间增加

Big Key 会使 RDB 快照文件或 AOF 日志文件增大,从而增加备份和恢复所需的时间。

大量的 Big Key 存在时,可能会导致备份和恢复过程变得非常缓慢

  • 复制延迟/删除异常

在主从复制场景中,Big Key 的复制会消耗更多的时间,导致从节点的延迟增加

当Big Key 过期需要删除时,由于数据量过大,可能发生主库较响应时间过长,主从数据同步异常(删除掉的数据,从库还在使用)

4、检测 BigKey 

  • 使用 redis-cli 工具:可以通过 redis-cli 工具来检测 BigKey
  • 使用 Redis 自带的命令:Redis 提供了 BIGKEYS 命令来查询当前 Redis 中所有 key 的信息,帮助统计分析键值对的大小情况

 使用以下命令扫描Redis中所有的键,并返回前1000个Big Key

redis-cli --scan --pattern '*' --count 1000
redis-cli -a "password" -- bigkeys

5、解决 BigKey 问题

  • Big Key拆分

将大键拆分成多个小键,使用更合适的数据结构来存储数据

拆分方式:

(1)按时间/业务拆分

如果 Big Key 包含的是按时间顺序排列的数据,可以考虑按时间范围拆分

(2)按哈希(Hash)拆分

使用哈希函数将大 Key 拆分成多个小 Key,并将其存储在不同的 Redis 实例中

(3)按前缀树拆分

使用前缀树将大 Key 拆分成多个层级结构,每个层级的 Key 都更小

前缀树是一种树形数据结构,用于高效地存储和检索字符串集合

标签:Key,Big,Redis,BigKey,user,key
From: https://blog.csdn.net/qq_36451127/article/details/141261563

相关文章

  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • Redis中Set数据类型常用命令
    目录1.添加元素2.移除元素3.检查成员是否存在4.获取集合成员5.获取集合成员数量6.随机获取集合中的一个成员7.集合运算8.集合的移值9.提供集合的随机元素在Redis中,Set是一种无序且不重复的字符串集合。1.添加元素SADDkeymember[member...]:向集......
  • Redis中Sorted Set数据类型常用命令
    目录1.添加元素2.获取成员3.获取成员的分数4.删除元素5.获取集合的大小6.获取成员的排名7.按分数范围获取成员8.按排名范围获取成员9.增减分数10.删除指定分数范围的成员11.获取分数的范围在Redis中,SortedSet(有序集合)是一种重要的数据类型,它的每......
  • SciTech-BigDataAIML-LLM-Transformer Series-Self-Attention:由Dot-Product(向量点乘)
    SelfAttention:由Dot-Product(向量点乘)说起https://lulaoshi.info/deep-learning/attention/transformer-attention.html#self-attention-从向量点乘说起Transformer[1]论文提出了一种Self-Attention(自注意力机制),Self-Attention的最核心的公式为:\(\large\begin{align*}......
  • Redis的基本概念和使用
    目录一、Redis简介1、NOSQL2、NOSQL和关系型数据库比较3、主流的NOSQL产品4、什么是Redis5、启动Redis二、Redis基本操作1、大概操作三、 Redis数据类型(5种常用)1、redis数据存储格式2、String3、hash4、list5、Set6、sorted_set四、Jedis1、导入对应的依......
  • 一篇总结Redis面试题知识点
    为什么要使用Redis        使用Redis主要是因为Redis的三大特性,高可靠高并发高性能。在请求访问数据时,如果直接从数据库中获取数据,它的并发量可能只有1000次/秒,这已经算是很不错的表现。如果在程序启动的时候就将数据放到Redis中,数据访问时如果直接从缓存中读取,他的性......
  • Redis底层原理
    1.Redis主从单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。1.1.单节点Redis的并发能力单节点Redis的并发能力确实是有限的。主要原因包括以下几点:单线程模型:Redis采用单线程模型来处理请求,这意味着它一次只能处理一个请求,......
  • Redis5多实例安装-Redis
    本文是按照Redis5二进制安装的后续1、创建6380、6381目录,分别将安装目录下的redis.conf拷贝到这两个目录下cd/usr/local/redis6/bin/mkdirredis6380mkdirredis6381cpredis.confredis6380/cpredis.confredis6381/2、修改配置文件redis6380viredis6380/redis.con......
  • Redisson
    packageorg.example.myoracle.config;importorg.redisson.Redisson;importorg.redisson.config.Config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.co......
  • Redis持久化
    1、为啥需要持久化?因为Redis服务是使用内存存储的,一旦RedisServer停止工作或者服务重启等问题,RedisServer使用的内存将被清空,数据也就丢失了。所以持久化是保证数据备份的关键。2、Redis持久化有哪些方式?Redis提供了两种持久化方式——RDB(快照持久化方式)和AOF(日志......