redis的set集合的常规使用
关于set我们都知道的就是他是可以用来存字符串或整数的,而且存的每一个元素都是不同的,是唯一的,所以使用set集合最大的一个好处就是可以对存的元素去重,保证存入的元素都是不通用的,接下来就来讲一下set集合是如何被redis利用,成为它的数据类型的;
1、sadd key member [member]
这个指令就是往key中插入一个或者多个member,可以是字符串,也可以是数字,如果key已经存在就不用新建一个key,而且往原有的key中插入member;如果redis中没有这个key,那就会先新建一个key,然后再往里插入元素;返回值就是成功插入的元素的个数,为什么是成功的个数呢?前面已经说了set会去重,如果如果你插入的是 1 1 2 3,返回值并不是4,而是3,已经两个1只能成功插入一个1;时间复杂度就是0(N),N指的是插入的元素,而不是key存的元素总个数,简单说原因是key存的所有元素的编码类型是hashtable,所以插入一个元素的时间复杂度就是O(1),具体后面会再介绍;
2、smembers key
返回key存的所有member,时间复杂度是O(N),N指的key存的member的个数
3、sismember key member
判断member是不是key已存的所有元素中一员,是就是返回1,不是就返回0;
4、spop key [count]
随机删除count个key中的元素,如果没有指定count,那就是随机删除一个,redis底层的代码原理就是生成一个随机数,然后去删除一个member,时间复杂度是O(N),N的值是count的大小;返回值是成功删除的member的值;
5、smove source destination member
source和destinaion指定是存的set类型数据的key,这个指令就是把source中的member移动到destination中,返回值是成功移动的元素;如果source不存在或者source不存在member,返回值就是0;1和0也可以说是表示移动成功或者失败;
6、srem key member [member ...]
删除key中一个或者多个指定的member,返回值就是成功删除的元素,不存在的元素删除不了,已经删除的元素不能再删除一次;
以上的指令已经是能够很简单的使用set集合了,接下来说的不同set集合之间的一些交互操作,比如求交集,并集,差集;相信交并差集的概念是什么,不需要我多说明;
7、sinter keyA keyB;sinterstore destination keyA keyB
这里求的就是keyA,keyB他们存的元素的交集,比如keyA存的 1 2 3 4,keyB存的是3 4 5 6,那么sinter keyA keyB返回值就是 3 4;这个指令只是求交集并且返回相交的元素;redis还提供的一个指令可以把交集存到一个key里面,比如还是keyA存的 1 2 3 4,keyB存的是3 4 5 6,sinterstore destination keyA keyB,执行的结果就是destination中的元素就是 3 4,返回值是交集的个数,keyA 和keyB的顺序是可以交换的,而且并不局限于两个key求交集,可以是多个,时间复杂是O(N*M),N和M分别指的是所有key中元素最多和最小的两个长度的乘积;
8、sunion keyA keyB;sunionstore destination keyA keyB
这两个指令是求并集,用法实际和求交集一样;
9、sdiff keyA keyB;sdiffstore destination keyA keyB
这两个指令是求差集,比较有差异的就是求差集,顺序不一样,求的结果也是不一样的,比如keyA存的 1 2 3 4,keyB存的是3 4 5 6,sdiff keyA keyB的结果就是1 2,表示的意思就是keyA有的元素但是keyB没有的元素;如果sdiff keyB keyA,返回就是 5 6,表示就是keyB有的元素但是keyA没有;