所谓的大
key
问题是某个
key
的
value
比较大,所以本质上是大
value
问题。大
Key
问题的坏处最典型的就是阻塞线程,并发量下降,导致客户端超时,服务端业务成功率下降。
快速找出大Key
下面列出常用的两种,其实最方便的是通过第三方工具去监控
1.redis-cli --bigkeys
命令
该命令可以列出
Redis
中大小最大的
key
。这个命令只在
Redis 4.0
或更高版本中可用。
2.Redis
内置命令对目标
Key
进行分析
- STRING类型:执行STRLEN命令,返回对应Key的value的字节数。
- LIST类型:执行LLEN命令,返回对应Key的列表长度。
- HASH类型:执行HLEN命令,返回对应Key的成员数量。
- SET类型:执行SCARD命令,返回对应Key的成员数量。
- ZSET类型:执行ZCARD命令,返回对应Key的成员数量。
- STREAM类型:执行XLEN命令,返回对应Key的成员数量。
优化大Key
12306 项目为了避免大 K 问题,对 Username Redis Set 结构进行分片。因此,我 将 Set 结构进行 分片,根据用户名的 HashCode 进行取模操作,将数据分散存储在 1024 个 Set 结构中 ,从而有效地解决了这个问题。
- 分割大 key:将大 key 拆分成多个小 key 来存储数据。例如,如果一个大型哈希表存储了大量的数据,可以将它拆分成多个小的哈希表,每个哈希表存储一部分数据。这样可以降低每个 key 的大小,并使 Redis 更加稳定和高效。
- 使用适当的数据结构:选择适当的 Redis 数据结构,以减少单个 key 的大小。例如,如果要存储大量元素,应该使用 Redis 集合或有序集合,而不是使用列表。
- 定期清理数据:定期清理 Redis 中的过期数据和不必要的数据,以避免大 key 的大小增长。可以使用 Redis 内置的过期机制或手动清理不必要的数据。
- 压缩数据:使用 Redis 的数据压缩功能,将大 key 中的数据进行压缩,可以减少每个 key 的大小,从而提高 Redis 的性能和可用性。
- 按需加载数据:不要在一次性将整个大 key 加载到内存中,而是按需加载数据,可以降低 Redis的内存使用率,从而提高性能。