1、什么是 big key?
对于不同的数据类型,big key 定义不同:
-
字符串类型:它的big体现在单个value值很大,一般认为超过10KB就是bigkey。 -
非字符串类型:哈希、列表、集合、有序集合,它们的big体现在元素个数太多。建议把集合类型的元素个数控制在1万个以下。
2、 big key 的危害:
-
影响性能,容易产生阻塞。 -
在 Redis 基本 IO 模型中,主要是主线程在执行操作,任何耗时的操作,例如 bigkey、全量返回等操作,都是潜在的性能瓶颈。 -
AOF 重写过程中:主进程 fork 出后台的子进程会阻塞住子进程,阻塞时间取决于整个实例的内存大小。当主线程收到新写或修改的操作时,主线程会申请新的内存空间,用来保存新写或修改的数据,如果操作的是 bigkey,也就是数据量大的集合类型数据,那么主线程会因为申请大空间而面临阻塞风险。因为操作系统在分配内存空间时,有查找和锁的开销,这就会导致阻塞。
-
-
造成网络拥塞:读取 bigkey 意味着需要消耗更多的网络流量,可能会对 Redis 服务器造成影响。 -
过期删除:过期删除时,容易产生阻塞。 -
迁移困难 -
内存空间不均匀:比如在 Redis cluster 或者 codis 中,会造成节点的内存使用不均匀。
总结就是:bigkey 的读写操作会阻塞线程,降低 Redis 的处理效率
阿里云建议:
当一个简单Key的Value过大或List、Hash等类型的数据中存储了大量的元素时,读取、删除这些数据的操作可能会花费过多的时间,阻塞单线程的Redis服务。此时您需要对内存结构进行优化,找出大Key并进行调整。
3、哪些场景下容易产生big key?
生产环境中遇到的几种不设置过期时间的情况:
-
多个服务共享相同的配置,把配置存储到Redis中。