Redis 笔记与总结4 set 和 zset 类型

时间:2021-09-05 00:42:14

(一)set 类型

set 是集合是 string 类型的无序集合。 set 元素最大可以包含(2 的 32 次方)个元素。set 的是通过 hash table 实现的,所以添加、删除和查找的复杂度都

是O(1)。 hash table 会随着添加或者删除自动的调整大小。需要注意的是调整 hash table 大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久

后就会改用跳表( skip list)来实现,跳表已经在 sorted set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集

(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns 中的好友推荐和 blog 的 tag 功能。

sadd 方法

向名称为 key 的 set 中添加方法。

smembers 方法

查看 set 中的元素。

【例】

sadd “集合的名称” “集合的元素”

127.0.0.1:> sadd myset1 one
(integer) 127.0.0.1:> sadd myset1 two
(integer) 127.0.0.1:> sadd myset1 two
(integer) 127.0.0.1:> smembers myset1
) "two"
) "one"

注意:集合中不允许有重复的元素。

srem 方法(rem:remove)

删除名称为 key 的 set 中的元素。

【例】

127.0.0.1:> smembers myset1
) "two"
) "one" 127.0.0.1:> srem myset1 one
(integer) 127.0.0.1:> smembers myset1
) "two" 127.0.0.1:> srem myset1 one
(integer) 127.0.0.1:> smembers myset1
) "two"

spop 方法

随机返回并删除名称为 key 的 set 中的一个元素。

【例】

127.0.0.1:> smembers myset1
) "three"
) "five"
) "seven"
) "one"
) "four"
) "eight"
) "six"
) "ten"
) "two"
) "nine" 127.0.0.1:> spop myset1
"one" 127.0.0.1:> spop myset1
"seven" 127.0.0.1:> spop myset1
"five" 127.0.0.1:> spop myset1
"ten" 127.0.0.1:> smembers myset1
) "three"
) "four"
) "six"
) "eight"
) "two"
) "nine"

sdiff 方法

返回所有给定 set 与第一个 set 的差集(与 PHP 中 array_diff() 方法类似)。

【例】

127.0.0.1:> smembers myset1
1) "one"
2) "two" 127.0.0.1:> smembers myset2
) "two"
) "three" 127.0.0.1:> sdiff myset1 myset2
) "one" 127.0.0.1:> sdiff myset2 myset1
) "three"

sdiffstore 方法

返回所有给定 set 与第一个 set 的差集(和 sdiff 一样),并将结果存为另一个 set。

【例】

127.0.0.1:> smembers myset1
) "one"
) "two" 127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> sdiffstore myset3 myset1 myset2
(integer) 127.0.0.1:> smembers myset3
) "one"

sinter 方法

返回所有给定 set 的交集。

【例】

127.0.0.1:> smembers myset1
) "one"
) "two" 127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> sinter myset1 myset2
) "two"

sinterstore 方法

返回所有给定 set 的交集,并将结果存为另一个 set。

【例】

127.0.0.1:> smembers myset1
) "one"
) "two" 127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> sinterstore myset4 myset1 myset2
(integer) 127.0.0.1:> smembers myset4
) "two"

sunion 方法

返回所有给定 set 的并集。

【例】

127.0.0.1:> smembers myset1
) "one"
) "two" 127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> sunion myset1 myset2
) "three"
) "one"
) "two"

⑩ sunionstore 方法

返回所有给定 set 的并集,并将结果存为另一个 set。

【例】

127.0.0.1:> smembers myset1
) "one"
) "two" 127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> sunionstore myset5 myset1 myset2
(integer) 127.0.0.1:> smembers myset5
) "three"
) "one"
) "two"

smove 方法(从第一个集合中剪切、粘贴到第二个集合中)

从第一个 key 对应的 set 中移除 member 并添加到第二个对应的 set 中。

【例】

127.0.0.1:> smembers myset1
) "one"
) "two" 127.0.0.1:> smove myset1 myset6 one
(integer) 127.0.0.1:> smembers myset6
) "one" 127.0.0.1:> smembers myset1
) "two"

scard 方法

返回名称为 key 的set 的元素个数。

【例】

127.0.0.1:> smembers myset1
) "two" 127.0.0.1:> scard myset1
(integer) 127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> scard myset2
(integer)

sismember 方法(类似 PHP 中的 in_array() 方法)

测试 member 是否是名称为 key 的 set 的元素。

【例】

127.0.0.1:> smembers myset2
) "three"
) "two" 127.0.0.1:> sismember myset2 one
(integer) 127.0.0.1:> sismember myset2 two
(integer)

srandmember 方法

随机返回名称为 key 的 set 的一个元素,但不删除元素。

【例】

127.0.0.1:> smembers myset5
) "three"
) "one"
) "two" 127.0.0.1:> srandmember myset5
"two" 127.0.0.1:> srandmember myset5
"two" 127.0.0.1:> srandmember myset5
"three"

(二)sorted set 类型

sorted set 是 set 的一个升级版本, 它在 set 的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后, zset 会自动重新按

新的值调整顺序。可以理解为有两列的 mysql 表,一列存 value,一列存顺序。操作中 key 理解为 zset 的名字。

和 set 一样 sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double 类型的 score。 sorted set 的实现是 skip list 和 hash

table 的混合体。

当元素被添加到集合中时,一个元素到 score 的映射被添加到 hash table 中,所以给定一个元素获取 score 的开销是 O(1),另一个 score 到元素的映射被

添加到 skip list,并按照 score 排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list 的开销一致,redis 的 skip list

实现用的是双向链表,这样就可以逆序从尾部取元素。 sorted set 最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的

id 当元素存储。

zadd 方法

向名称为 key 的zset 中添加元素 member,score 用于排序。如果该元素存在,则更新其顺序。

【例】

127.0.0.1:> zadd myzset  one
(integer) 127.0.0.1:> zadd myzset two
(integer) 127.0.0.1:> zadd myzset three
(integer) 127.0.0.1:> zrange myzset - withscores
) "one"
) ""
) "two"
) ""
) "three"
) "" 127.0.0.1:> zadd myzset three
(integer) 127.0.0.1:> zrange myzset - withscores
) "one"
) ""
) "two"
) ""
) "three"
) "" 127.0.0.1:> zrange myzset -
) "one"
) "two"
) "three"

zrem 方法

删除名称为 key 的 zset 中的元素 member。

【例】

127.0.0.1:> zrange myzset  - withscores
) "one"
) ""
) "two"
) ""
) "three"
) "" 127.0.0.1:> zrem myzset three
(integer) 127.0.0.1:> zrange myzset - withscores
) "one"
) ""
) "two"
) ""

zincrby 方法

如果存在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则向该集合中添加该元素,其 score 值为 increment。

【例】

127.0.0.1:> zrange myzset  - withscores
) "one"
) ""
) "two"
) "" 127.0.0.1:> zincrby myzset one
"" #one 的顺序号变为3 127.0.0.1:> zrange myzset - withscores
) "two"
) ""
) "one"
) "" 127.0.0.1:> zincrby myzset three
"" 127.0.0.1:> zrange myzset - withscores
) "three"
) ""
) "two"
) ""
) "one"
) ""

【例2】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zincrby myzset - three
"" 127.0.0.1:> zrange myzset - withscores
) "three"
) ""
) "two"
) ""
) "one"
) ""

zrank 方法

返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序),即下标。

【例】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zrank myzset one
(integer) #返回索引 127.0.0.1:> zrank myzset two
(integer) 127.0.0.1:> zrank myzset three
(integer) 127.0.0.1:> zrank myzset four
(nil)

zrevrank 方法

rev :翻转。返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序),即下标。

【例】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zrevrank myzset one
(integer) 127.0.0.1:> zrevrank myzset two
(integer) 127.0.0.1:> zrevrank myzset three
(integer)

说明:zrevrank 先降序排序,再找索引。

zrevrange 方法

返回名称为 key 的 zset(按 score 从大到小顺序)中的 index 从 start 到 end 的所有元素(按照索引 score 降序排序)。

【例】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zrevrange myzset - withscores
) "one"
) ""
) "two"
) ""
) "three"
) ""

zrangebyscore 方法

返回集合中 score 在给定区间的元素。

【例】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zrangebyscore myzset withscores #找到索引2-3范围内的所有元素
) "two"
) ""
) "one"
) ""

zcount 方法

返回集合中 score 在给定区域的数量。

【例】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zcount myzset
(integer)
127.0.0.1:> zcount myzset
(integer)

zcard 方法

返回 zset 中所有元素的个数。

【例】

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zcard myzset
(integer)

zremrangebyrank 方法

删除集合中排名在给定区间的元素(按索引删除)。

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) "" 127.0.0.1:> zremrangebyrank myzset 1 #索引的1到1
(integer) 127.0.0.1:> zrange myzset - withscores
) "three"
) ""
) "one"
) ""

⑪ zremrangebyscore 方法

删除集合中 score 在给定区间的元素(按顺序删除)。

127.0.0.1:> zrange myzset  - withscores
) "three"
) ""
) "two"
) ""
) "one"
) ""
) "four"
) ""
) "five"
) "" 127.0.0.1:> zremrangebyscore myzset
(integer) 127.0.0.1:> zrange myzset - withscores
) "three"
) ""

Redis 笔记与总结4 set 和 zset 类型的更多相关文章

  1. Redis学习篇(六)之ZSet类型及其操作

    ZADD 作用: 将元素及其分数添加到集合中 语法: ZADD key score membre [score member] 当集合元素已经存在时,再次添加会更新其分数 当score是 +inf 时 ...

  2. Redis自学笔记–Zset类型及管理简述

    Zset类型                                                                                               ...

  3. 7、Redis中对ZSet类型的操作命令

    写在前面的话:读书破万卷,编码如有神 --------------------------------------------------------------------   ---------- ...

  4. 【Redis笔记(四)】 Redis数据结构 - list链表

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605 经过前面的介绍,我们学习了Redis中string字符串.hash ...

  5. 点滴记录——学习Redis笔记

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409 Redis 默认port6379 Redis适用场景 1. 取最新N个数据的操 ...

  6. Redis笔记1-Redis介绍及数据类型使用场景

    Redis介绍:C语言开发.单线程操作.高性能.键值对.可持久化的数据库.Redis采用redisObject结构来统一五种数据类型,redisObject是五种类型的父类,可以在函数间传递时隐藏具体 ...

  7. redis笔记之一

    NoSQL简介 全称是Not Only SQL,泛指菲关系型数据库,它是通过键值对存储数据并且将数据存储在内存中.而像mysql,sql server这些通过关系表存数据的就叫关系型数据库 为什么需要 ...

  8. Redis 笔记与总结6 Redis 高级应用之 事务处理、持久化操作、pub_sub、虚拟内存

    3.事务处理 redis 对事务的支持目前还比较简单. redis 只能保证一个 client 发起的事务中的命令可以连续的执行,而中间不会插入其他 client 的命令. 由于 redis 是单线 ...

  9. Redis笔记(六):Java中使用Redis

    Java程序使用Redis 添加依赖包 Maven依赖方式 <dependency> <groupId>redis.clients</groupId> <ar ...

随机推荐

  1. 设置 tableview 的背景颜色&comma;总是有蒙层

    1.给tableview添加了背景图片后, cell 总是有一层蒙层蒙着,很阴暗. 2.实验以后才发现背景图片被放在了 cell 的后面.

  2. Delphi窗体最大化按钮不可用情况下的最大化

    最大化按钮不可用,而且窗体最大化,我以前一直这样设置:在Object Inspector下把BorderIcons属性下的biMaximize属性设置为False,然后把WindowState属性设置 ...

  3. 转载 C&num; 序列化与反序列化意义详解

    C# 序列化与反序列化意义详解 总结: ①序列化基本是指把一个对象保存到文件或流中,比如可以把文件序列化以保存到Xml中,或一个磁盘文件中②序列化以某种存储形式使自定义对象持久化: ③将对象从一个地方 ...

  4. aix上使用裸设备安装oracle10g数据库

    一.检查系统信息 [root@aix222 /]# oslevel -r 5300-08 [root@aix222 /]# prtconf | grep -i mem Memory Size: 190 ...

  5. C&num; devExpress BandedGridView属性 备忘

    BandedGridView属性备忘 StringBuilder sb = new StringBuilder(); DevExpress.XtraGrid.Views.BandedGrid.Band ...

  6. English Learn

    English Learn 一直决定好好学习英语.越来越觉得英语的重要性,解决日常问题.学习新东西.使用google时都经常碰到英文.所以觉得在blog上记录些学习英语的文章,也算是对自己的一种监督. ...

  7. 【原创】python基于大数据现实双色球预测

    前提准备:利用sql筛选出每个球出现概率最高的前5个数 原理:先爬出所有的历史数据,然后模拟摇奖机出球的机制并大量模拟计算,直到出现列表中的某一个数后即停 注意事项:由于计算过程数据量很大,需要加入内 ...

  8. 使用Idea初始化SpringMvc项目

    (1) (2) (3) (4) (5)感谢http://www.cnblogs.com/feiyujun/p/6537510.html (6)

  9. scanf清除缓存区

    为什么需要清除scanf缓存区呢?看一个例子: int main() { int a,b; scanf("%d",&a); scanf("%d",&am ...

  10. js单例模式详解实例

    这篇文章主要介绍了什么是单例单例模式.使用场景,提供了3个示例给大家参考 什么是单例? 单例要求一个类有且只有一个实例,提供一个全局的访问点.因此它要绕过常规的控制器,使其只能有一个实例,供使用者使用 ...