资讯专栏INFORMATION COLUMN

Redis集合类型

littlelightss / 3008人阅读

摘要:今天我们了解一下中的集合类型,也就是集合。判读元素是否在集合中命令也有返回值,如果返回值为则表示当前元素在当前中,如果返回则表示当前元素不在中。从集合中随机弹出元素命令也是随机从中弹出元素,并且也支持可选参数,但有一点和命令不同。

今天我们了解一下Redis中的集合类型,也就是set集合。在Redis中set也是可以保存多个字符串的。那么set集合和list链表到底有什么不同呢?下面我们重点介绍一下它们之间的不同。

set中的元素是不可以重复的,而list是可以保存重复元素的。

set中的元素是无序的,而list中的元素是有序的。

set中的元素不能通过索引下标获取元素,而list中的元素则可以通过索引下标获取元素。

除此之外set还支持更高级的功能,例如多个set取交集、并集、差集、等等。

下面我们介绍一下set中的相关命令。


命令

一、集合内操作

1.添加元素

sadd key member [member ...]

sadd命令也是有返回值的,它的返回值就是当前执行sadd命令成功添加元素的个数,因为set中不能保存重复元素,所以在执行:

sadd setkey c d

命令时,返回的是1,而不是2。因为元素c,已经成功保存到set中,不在继续保存了,只能将d保存到set中。


2.删除元素

srem key member [member ...]

srem命令和sadd命令一样也是有返回值的,返回值就是当前删除元素的个数。


3.计算元素个数

scard key

scard命令的时间复杂度为O(1),scard命令不会遍历set中的所有元素,而是直接使用Redis中的内部变量。


4.判读元素是否在集合中

sismember key member

sismember命令也有返回值,如果返回值为1则表示当前元素在当前set中,如果返回0则表示当前元素不在set中。


5.随机从set中返回指定个数元素

srandmember key [count]

srandmember命令中有一个可选参数count,count参数指的是返回元素的个数,如果当前set中的元素个数小于count,则srandmember命令返回当前set中的所有元素,如果count参数等于0,则不返回任何数据,如果count参数小于0,则随机返回当前count个数的元素,不管当前set中的元素个数为多少。


6.从集合中随机弹出元素

spop key [count]

spop命令也是随机从set中弹出元素,并且也支持count可选参数,但有一点和srandmember命令不同。spop命令在随机弹出元素之后,会将弹出的元素从set中删除,而srandmember命令则不同,只会随机弹出元素,并不会将元素从set中删除。


7.获取所有元素

smembers key

smembers命令虽然能获取当前set中所有的元素,但smembers命令返回元素的顺序与sadd添加元素的顺序不一定相同,这也就是前面提到过的保存在set中的元素是无序的。


二、集合间操作

1.集合的交集

sinter key [key ...]


2.集合的并集

sunion key [key ...]


3.集合的差集

sdiff key [key ...]


4.将集合的交集、并集、差集的结果保存

sinterstore destination key [key ...]
sunionstore destination key [key ...]
sdiffstore destination key [key ...]

为什么Redis要提供了sinterstore、sunionstore、sdiffstore命令来将集合的交集、并集、差集的结果保存起来呢?这是因为Redis在进行上述比较时,会比较耗费时间,所以为了提高性能可以将交集、并集、差集的结果提前保存时来,这样在需要使用时,可以直接通过smembers命令获取。


下面我们看一下set中相关命令的时间复杂度。

命令 时间复杂度
sadd key member [member ...] O(k),k是元素的个数
srem key member [member ...] O(k),k是元素的个数
scard key O(1)
sismember key member O(1)
srandmember key [count] O(count)
spop key [count] O(1)
smembers key O(n),n是元素的总数
sinter key [key ...] O(m * k),k是多个集合中元素最少的个数,m是键个数
sunion key [key ...] O(k),k是多个元素个数和
sdiff key [key ...] O(k),k是多个元素个数和
sinterstore destination key [key ...] O(m * k),k是多个集合中元素最少的个数,m是键个数
sunionstore destination key [key ...] O(k),k是多个元素个数和
sdiffstore destination key [key ...] O(k),k是多个元素个数和

内部编码

intset(整数集合):当集合中的元素都是整数,并且集合中的元素个数小于512个时,Redis会选用intset作为底层内部实现。

hashtable(哈希表):当条件不满足上述时,Redis会采用hashtable作为底层实现。

备注:我们可以通过set-max-intset-entries参数来设置上述中的默认参数。


下面我们看一下具体的事例,来验证我们上面提到的内部编码。

1.当元素个数较少并且都是整数时,内部编码为intset。


2.当元素不全是整数时,内部编码为hashtable。


3.当元素个数超过512个时,内部编码为hashtable。

import redis

r = redis.Redis(host="127.0.0.1", port=6379)

if r.object("encoding", "setkey") != None:
    print("Key为【setkey】的字节编码为【%s】" % r.object("encoding", "setkey").decode("utf-8"))

for i in range(1, 600):
    r.sadd("setkey", i)

if r.object("encoding", "setkey") != None:
    print("Key为【setkey】的字节编码为【%s】" % r.object("encoding", "setkey").decode("utf-8"))
Key为【setkey】的字节编码为【intset】
Key为【setkey】的字节编码为【hashtable】

上述命令就是Redis中的集合相关的知识,如有不正确的地方欢迎指出,谢谢。


原文链接:http://jilinwula.com/article/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/36598.html

相关文章

  • Redis 入门(二):五大类型 4:集合类型

    摘要:本命令的返回值是成功加入的元素数量。获得集合中的所有元素命令会返回集合中的所有元素。判断元素是否在集合中当值存在时返回,不存在时返回。命令用来对多个集合执行并集运算。当为正数时,会随机从集合里获得个不重复的元素。整理自入门指南第二版。 介绍 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在 Redis 内部是使用值为空的散列表实现的,所以这些操作的时间...

    icattlecoder 评论0 收藏0
  • 一看就能懂的Redis基础教程

    摘要:的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。数据类型支持五种数据类型字符串,哈希,列表,集合及有序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是。的成员是唯一的但分数却可以重复。 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个...

    clasnake 评论0 收藏0
  • 一看就能懂的Redis基础教程

    摘要:的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。数据类型支持五种数据类型字符串,哈希,列表,集合及有序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是。的成员是唯一的但分数却可以重复。 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个...

    kel 评论0 收藏0
  • Redis的PHP操作手册(纯手稿版)

    摘要:类型操作是最基本的类型,而且类型是二进制安全的。意思是的可以包含任何数据。的阻塞版本,这个版本有第三个参数用于设置阻塞时间即如果源为空,那么可以阻塞监听的时间,如果有元素了则执行操作。 String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 $redis->set...

    dingding199389 评论0 收藏0
  • Redis的PHP操作手册(纯手稿版)

    摘要:类型操作是最基本的类型,而且类型是二进制安全的。意思是的可以包含任何数据。的阻塞版本,这个版本有第三个参数用于设置阻塞时间即如果源为空,那么可以阻塞监听的时间,如果有元素了则执行操作。 String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 $redis->set...

    Travis 评论0 收藏0
  • redis 学习笔记

    摘要:集合集合是等命令的操作对象它使用和两种方式编码中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是。 这篇 redis 学习笔记主要介绍 redis 的数据结构和数据类型,并讨论数据结构的选择以及应用场景的优化。 redis 是什么? Redis是一种面向键/值对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。 Redis 数据结构 动态字符...

    Batkid 评论0 收藏0

发表评论

0条评论

littlelightss

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<