redis应该如何删除集合

 背景

在redis的命令接口中,没有专门针对list,set,hash等数据结构的key删除命令,只有指定到删除具体的对象的操作命令。
比如删除list列表的元素命令LREM,删除set集合中一个或多个元素命令SREM,删除hash中一个或多个元素HDEL。
而在redis的一些使用中还是可能遇到对这些集合类对象整体删除的场景如:
场景1:当用户的信息使用hash结构储存时,需要删除整个用户的信息
场景2:删除大V的粉丝列表

DEL

在redis4.0之前可以用del命令直接删除key,但是由于redis是单线程,如果对应value值很多,就会出现严重的阻塞问题。
官网给出了del命令的时间复杂度
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).

大概意思是:当有N个keys 要被移除时,时间复杂度是O(N);当要移除的key对应的value不是string,这是移除单个key的时间复杂度是O(M),这里的M是list,set,有序set或hash数据结构里面的元素。移除单个key,并且这个key对应的value是一个string类型,这时的时间复杂度是O(1).

因此,在list,set,有序set或hash数据结构里面的元素较少时,可以使用del删除对应的key。

 

UNLINK

为了解决删除大key的问题, Redis 4.0 新添加了 UNLINK 命令用于执行大KEY异步删除。

官网给出unlink时间复杂度:

Time complexity: O(1) for each key removed regardless of its size. Then the command does O(N) work in a different thread in order to reclaim memory, where N is the number of allocations the deleted objects where composed of.

UNLINK其实是直接返回,然后在后台线程慢慢删除。
如果你的Redis版本>=4.0.0,那么强烈建议使用UNLINK来删除。


参考:https://blog.csdn.net/u011499747/article/details/83055864 

你可能感兴趣的:(redis,redis)