Redis中的集合类型

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
611
文章
12
评论
2017年11月25日22:05:06 评论

一、概念和原理

集合是redis中的基本数据类型之一,redis中的集合可以用来存储一堆无序的元素,集合内的元素不会重复,只有存在或者不存在两种属性。

redis集合内部是由intsethashtable实现的,当条件不满足时redis会自动转换内部编码。集合中使用intset的条件:

  1. 集合的所有的元素都是整数
  2. 集合中元素的个数不超过512个

一旦两者的任一条件不满足时,就会转换成hashtable编码。

以下是一个转换示例:

使用intset编码的优点是节省内存,缺点就是插入、更新和查找等操作相对费时,因为数组元素的更新和插入都无法在O(1)的时间复杂度内完成,而哈希表可以在O(1)时间内完成。

两种不同编码的表现形式

使用intset编码:

Redis中的集合类型

使用hashtable

Redis中的集合类型

二、集合的操作

2.1 增加元素

返回成功添加的元素个数,如果key不存在会自动创建

示例:

2.2 删除元素

返回成功删除的元素个数。

示例:

2.3 获取集合元素

返回集合中的所有元素。

示例:

2.4 判断元素是否存在

判断member是否存在于key 中,存在返回1,不存在返回0

示例:

2.5 获取集合的元素个数

返回集合中的元素个数,如果集合不存在或者为空返回0。

示例:

2.6 随机返回元素

在集合中随机返回一定数量的元素,默认返回1个:

当count<0 时返回的元素可能会重复,当count>0时不会重复。

示例:

2.7 随机移除元素

在集合中随机移除指定数量的元素,返回被移除的元素:

示例:

2.8 集合间运算

移动一个集合的元素到另外一个集合:

如果src中包含item元素,移除并添加到dest中去。成功移除返回1,否则返回0

示例:

求差集

求差集有两个命令:

第一个是集合间做差值运算,计算存在于第一个集合不存在于其他集合中的元素。

第二个是把存在于第一个集合但不存在于其他集合的元素储存到dest 中,返回元素的个数。

要注意的是这里只会返回存在于第一个集合但是不存在于其他集合的元素,并不会把所有集合的差值都显示出来。

示例:

求交集

第一个是计算交集,返回两个集合中同时存在的元素。第二个是把交集的结果存到另外一个结果中去。

示例:

计算并集

第一个是求并集,返回两个集合中所有的元素。第二个是求并集并把结果保存到dest中。

示例:

马谦马谦马谦
  • 本文由 发表于 2017年11月25日22:05:06
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/redis/redis-set.html
redis源码分析:链表实现 Redis

redis源码分析:链表实现

一、链表定义 链表在redis中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。redis中链表在adlist.h和adlist.c中实现,只用了300+行代码...
redis中的发布和订阅 Redis

redis中的发布和订阅

一、发布和订阅 除了任务队列以外,redis还有一种基于“发布/订阅”模式的消息传递,使得客户端可以订阅某个频道,当频道有消息产生时,会把消息传递到所有的订阅者。和列表不一样的是,发布和订阅可以是一对...
Redis小案例(二):redis实现消息队列 Redis

Redis小案例(二):redis实现消息队列

一、任务队列概述 消息队列,顾名思义就是一个用来传递任务的队列。消息队列在开发中十分常见,经常用在页面后台处理需要很长时间的操作时,例如发送邮件、短信以及进行复杂数据运算操作等,这些操作通常会阻塞页面...
Redis小案例(一):实现网站访问频率限制 Redis

Redis小案例(一):实现网站访问频率限制

网站中经常需要用到网站限流,例如限制用户恶意爬虫获取网页信息以及在网站访问流量大时限制访问频率等等,这里使用redis做一个简单的网站登录限制案例。 一、使用EXPIRE进行访问频率限制 逻辑:用户登...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: