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

(一)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:6379> sadd myset1 one
(integer) 1

127.0.0.1:6379> sadd myset1 two
(integer) 1

127.0.0.1:6379> sadd myset1 two
(integer) 0

127.0.0.1:6379> smembers myset1
1) "two"
2) "one"

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

srem 方法(rem:remove)

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

【例】

127.0.0.1:6379> smembers myset1
1) "two"
2) "one"

127.0.0.1:6379>  srem myset1 one
(integer) 1

127.0.0.1:6379> smembers myset1
1) "two"

127.0.0.1:6379>  srem myset1 one
(integer) 0

127.0.0.1:6379> smembers myset1
1) "two"

spop 方法

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

【例】

127.0.0.1:6379> smembers myset1
 1) "three"
 2) "five"
 3) "seven"
 4) "one"
 5) "four"
 6) "eight"
 7) "six"
 8) "ten"
 9) "two"
10) "nine"

127.0.0.1:6379> spop myset1
"one"

127.0.0.1:6379> spop myset1
"seven"

127.0.0.1:6379> spop myset1
"five"

127.0.0.1:6379> spop myset1
"ten"

127.0.0.1:6379> smembers myset1
1) "three"
2) "four"
3) "six"
4) "eight"
5) "two"
6) "nine"

sdiff 方法

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

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smembers myset2
1) "two"
2) "three"

127.0.0.1:6379> sdiff myset1 myset2
1) "one"

127.0.0.1:6379> sdiff myset2 myset1
1) "three"

sdiffstore 方法

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

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> sdiffstore myset3 myset1 myset2
(integer) 1

127.0.0.1:6379> smembers myset3
1) "one"

sinter 方法

返回所有给定 set 的交集。

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> sinter myset1 myset2
1) "two"

sinterstore 方法

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

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> sinterstore myset4 myset1 myset2
(integer) 1

127.0.0.1:6379> smembers myset4
1) "two"

sunion 方法

返回所有给定 set 的并集。

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> sunion myset1 myset2
1) "three"
2) "one"
3) "two"

⑩ sunionstore 方法

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

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> sunionstore myset5 myset1 myset2
(integer) 3

127.0.0.1:6379> smembers myset5
1) "three"
2) "one"
3) "two"

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

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

【例】

127.0.0.1:6379> smembers myset1
1) "one"
2) "two"

127.0.0.1:6379> smove myset1 myset6 one
(integer) 1

127.0.0.1:6379> smembers myset6
1) "one"

127.0.0.1:6379> smembers myset1
1) "two"

? scard 方法

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

【例】

127.0.0.1:6379> smembers myset1
1) "two"

127.0.0.1:6379> scard myset1
(integer) 1

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> scard myset2
(integer) 2

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

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

【例】

127.0.0.1:6379> smembers myset2
1) "three"
2) "two"

127.0.0.1:6379> sismember myset2 one
(integer) 0

127.0.0.1:6379> sismember myset2 two
(integer) 1

? srandmember 方法

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

【例】

127.0.0.1:6379> smembers myset5
1) "three"
2) "one"
3) "two"

127.0.0.1:6379> srandmember myset5
"two"

127.0.0.1:6379> srandmember myset5
"two"

127.0.0.1:6379> 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:6379> zadd myzset 1 one
(integer) 1

127.0.0.1:6379> zadd myzset 2 two
(integer) 1

127.0.0.1:6379> zadd myzset 3 three
(integer) 1

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"

127.0.0.1:6379> zadd myzset 4 three
(integer) 0

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "4"

127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "two"
3) "three"

zrem 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"
5) "three"
6) "4"

127.0.0.1:6379> zrem myzset three
(integer) 1

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"

zincrby 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "2"

127.0.0.1:6379> zincrby myzset 2 one
"3"  #one 的顺序号变为3

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "two"
2) "2"
3) "one"
4) "3"

127.0.0.1:6379> zincrby myzset 2 three
"2"

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "2"
3) "two"
4) "2"
5) "one"
6) "3"

【例2】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "2"
3) "two"
4) "2"
5) "one"
6) "3"

127.0.0.1:6379> zincrby myzset -2 three
"0"

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

zrank 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

127.0.0.1:6379> zrank myzset one
(integer) 2 #返回索引

127.0.0.1:6379> zrank myzset two
(integer) 1

127.0.0.1:6379> zrank myzset three
(integer) 0

127.0.0.1:6379> zrank myzset four
(nil)

zrevrank 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

127.0.0.1:6379> zrevrank myzset one
(integer) 0

127.0.0.1:6379> zrevrank myzset two
(integer) 1

127.0.0.1:6379> zrevrank myzset three
(integer) 2

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

zrevrange 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

127.0.0.1:6379> zrevrange myzset 0 -1 withscores
1) "one"
2) "3"
3) "two"
4) "2"
5) "three"
6) "0"

zrangebyscore 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

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

zcount 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

127.0.0.1:6379> zcount myzset 2 3
(integer) 2
127.0.0.1:6379> zcount myzset 0 3
(integer) 3

zcard 方法

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

【例】

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3"

127.0.0.1:6379> zcard myzset
(integer) 3

zremrangebyrank 方法

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

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "two"
4) "2"
5) "one"
6) "3" 

127.0.0.1:6379> zremrangebyrank myzset 1 1 #索引的1到1
(integer) 1 

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
3) "one"
4) "3"

zremrangebyscore 方法

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

127.0.0.1:6379> zrange myzset 0 -1 withscores
 1) "three"
 2) "0"
 3) "two"
 4) "2"
 5) "one"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"

127.0.0.1:6379> zremrangebyscore  myzset 2 5
(integer) 4

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "three"
2) "0"
时间: 2024-10-03 14:45:30

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

Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建

[TOC] Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建 Redis Java API使用(一):单机版本Redis API使用 Redis的Java API通过Jedis来进行操作,因此首先需要Jedis的第三方库,因为使用的是Maven工程,所以先给出Jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactI

redis笔记

redis笔记 下载完redis,执行make命令. 然后启动redis就进src文件夹,执行./redis-server就可以了. 再在文件夹下执行 ./redis-cli 就可以执行redis的命令了. pipelining  一次请求发送多个命令,以提高性能.我们在使用redis时都是向它发送命令,每次都是需要和redis建立tcp连接,然后发送命令信息,redis执行命令后,客户端等待着redis的响应.这个我们当然知道,就像访问db,IO开销都是消耗资源的大头,所以redis提供了pi

点滴记录——学习Redis笔记

转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409 Redis 默认端口6379 Redis适用场景 1. 取最新N个数据的操作 2. 排行榜应用,取TOP N操作 3. 需要精确设定过期时间的应用 4. 计数器应用 5. Uniq操作,获取某段时间所有数据排重值 6. 实时系统,反垃圾系统 7. Pub/Sub构建实时消息系统--消息的发布与订阅 8. 构建队列系统 9. 缓存 Redis数据类型 Strings类型及操作

Redis笔记整理(三):进阶操作与高级部分

[TOC] Redis笔记整理(三):进阶操作与高级部分 Redis发布订阅 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis客户端可以订阅任意数量的频道. 下图展示了频道channel1,以及订阅这个频道的三个客户端--client1,client2,client5之间的关系. 当有新消息通过PUBLISH命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端: 相关操作命令如下: 命令 描述 PSUBS

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

3.事务处理 redis 对事务的支持目前还比较简单. redis 只能保证一个 client 发起的事务中的命令可以连续的执行,而中间不会插入其他 client 的命令. 由于 redis 是单线 程来处理所有 client 的请求的所以做到这点是很容易的.一般情况下redis 在接受到一个 client 发来的命令后会立即处理并 返回处理结果,但是当一个client 在 一个连接中发出 multi 命令时,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中.当

redis(五)、Set类型和zSet类型

一.set集合是String类型的无序集合,set是通过hshatable实现的,对集合可以进行取交集.并集.差集操作. 1.sadd方法:插入元素, 如:sadd set1 aaa:不允许元素重复. smembers set1:查看元素: 2.srem方法:删除set集合元素: 3.spop方法:随机返回删除的key: 4.sdiff方法:返回两个集合的不同元素(哪个集合在前面就以哪个集合为标准): 5.sdiifstore方法:将返回的不同元素存储到另一个集合里: 如:sdiffstore

小贝_redis set/zset类型学习

redis  set.zset类型 一.集合类型 二.查看set.zset集合类型命令 三.set.zset集合类型实例 一.集合类型 1.redis的集合类型,分为两种,即有序和无序. 2.既然是集合类型,因此也要满足集合的特性即 a.集合的确定性: 组成集合的元素的性质必须明确,不允许有模棱两可.含混不清的情况 b.集合的互异性: 对于一个给定的集合,集合中的元素是互异的",就是说,"对于一个给定的集合,它的任何两个元素都是不同的 c.集合的无序性: 指表示一个集合时,构成这个集合

RedisTemplate中zset类型的使用

简述 上一文中简述了使用StringRedisTemplate操作redis中的set类型,今天来记录一下操作zset类型的主要方法 代码 @RunWith(SpringRunner.class) @SpringBootTest public class ZSetDemo { @Autowired private StringRedisTemplate redisTemplate; @Test public void test1() { //向集合中插入元素,并设置分数 redisTemplat

C++ Primer 学习笔记_102_特殊工具与技术 --运行时类型识别[续]

特殊工具与技术 --运行时类型识别[续] 三.RTTI的使用 当比较两个派生类对象的时候,我们希望比较可能特定于派生类的数据成员.如果形参是基类引用,就只能比较基类中出现的成员,我们不能访问在派生类中但不在基类中出现的成员. 因此我们可以使用RTTI,在试图比较不同类型的对象时返回假(false). 我们将定义单个相等操作符.每个类定义一个虚函数 equal,该函数首先将操作数强制转换为正确的类型.如果转换成功,就进行真正的比较:如果转换失败,equal 操作就返回 false. 1.类层次 c