什么是Redis大Key
我认为可以从Space Complexity和Time complexity两个方向定义一个大Key。
1.Space Complexity,指的就是这个Key所占用的空间大小,Redis是对内存的操作所以这里是在内存中占用空间的大小。一个string类型的Key最大为512MB,你的string Key占用了400MB,这就是一个比较大的Key了。
2.Time complexity,指的就是一个Key,存储了太多的字段,虽然所有的字段加起来也没有占用多大的内存,但是由于数量的原因它的对应访问模式时间复杂度较高,而你要删除这个字段比较大的Key就要格外注意千万不能直接删除,因为Redis进程会阻塞10秒的时间。
下面截取Redis官网的一句话:
Time complexity: O(N) where N is the number of keys that will be removed. When a key to remove holds a value other than a string, the individual complexity for this key is O(M) where M is the number of elements in the list, set, sorted set or hash. Removing a single key that holds a string value is O(1).
时间复杂度:O(N),其中N是将被删除的密钥数。当要删除的键持有字符串以外的值时,此键的单独复杂度是O(M),其中M是列表、集合、排序集或散列中的元素数量。移除包含字符串值的单个键是O(1)。
说了这么多,那么该如何正确的删除大 Key 呢?
说到这里那么我们如何删除掉一个比较大的Key呢:
Redis的过期策略就是一个比较好的方式,其中有三种:
- 当前内存使用超过maxmemory限定出发清理策略。
- 被动删除:Key下一次被访问到的时候才会删除。
- 主动删除:Redis定期主动删除过期的Key。
说到这里,我们应该去避免产生一个不合理的大Key去产生需要手动删除的情况,再有大家千万不要未经测试直接就去删除掉生产环境上的大Key,连锁反应、蝴蝶效应可不是闹着玩的!!!