Redis详解:sets数据类型及操作

set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作,操作中key理解为集合的名字。

  系列文章:

  Redis详解:strings数据类型及操作

  Redis详解:hashes数据类型及操作

  Redis详解:lists数据类型及操作

  Redis的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功能。下面详细介绍set相关命令:

  1、sadd

  向名称为key的set中添加元素:

  redis 127.0.0.1:6379> sadd myset "hello"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset "world"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset "world"
  (integer) 0
  redis 127.0.0.1:6379> smembers myset
  1) "world"
  2) "hello"
  redis 127.0.0.1:6379>

  本例中,我们向myset中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以第三个元素没有添加成功,最后我们用smembers来查看myset中的所有元素。

  2、srem

  删除名称为key的set中的元素member:

  redis 127.0.0.1:6379> sadd myset2 "one"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset2 "two"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset2 "three"
  (integer) 1
  redis 127.0.0.1:6379> srem myset2 "one"
  (integer) 1
  redis 127.0.0.1:6379> srem myset2 "four"
  (integer) 0
  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379>

  本例中,我们向myset2中添加了三个元素后,再调用srem来删除one和four,但由于元素中没有four所以,此条srem命令执行失败。

  3、spop

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

  redis 127.0.0.1:6379> sadd myset2 "one"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset2 "two"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset2 "three"
  (integer) 1
  redis 127.0.0.1:6379> srem myset2 "one"
  (integer) 1
  redis 127.0.0.1:6379> srem myset2 "four"
  (integer) 0
  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379>

  本例中,我们向myset3中添加了三个元素后,再调用spop来随机删除一个元素,可以看到three元素被删除了。

  4、sdiff

  返回所有给定key与第一个key的差集:

  redis 127.0.0.1:6379> sadd myset2 "one"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset2 "two"
  (integer) 1
  redis 127.0.0.1:6379> sadd myset2 "three"
  (integer) 1
  redis 127.0.0.1:6379> srem myset2 "one"
  (integer) 1
  redis 127.0.0.1:6379> srem myset2 "four"
  (integer) 0
  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379>

  本例中,我们可以看到myset2中的元素与myset3中不同的只是three,所以只有three被查出来了,而不是three和one,因为one是myset3的元素。

  我们也可以将myset2和myset3换个顺序来看一下结果:

  redis 127.0.0.1:6379> sdiff myset3 myset2
  1) "one"
  redis 127.0.0.1:6379>

  这个结果中只显示了,myset3中的元素与myset2中不同的元素。

  5、sdiffstore

  返回所有给定key与第一个key的差集,并将结果存为另一个key:

  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3
  (integer) 1
  redis 127.0.0.1:6379> smembers myset4
  1) "three"
  redis 127.0.0.1:6379>

  6、sinter

  返回所有给定key的交集:

  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> sinter myset2 myset3
  1) "two"
  redis 127.0.0.1:6379>

  通过本例的结果可以看出, myset2和myset3的交集two被查出来了。

  7、sinterstore

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

  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> sinterstore myset5 myset2 myset3
  (integer) 1
  redis 127.0.0.1:6379> smembers myset5
  1) "two"
  redis 127.0.0.1:6379>

  通过本例的结果可以看出, myset2和myset3的交集被保存到myset5中了

  8、sunion

  返回所有给定key的并集

  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> sunion myset2 myset3
  1) "three"
  2) "one"
  3) "two"
  redis 127.0.0.1:6379>

  通过本例的结果可以看出, myset2和myset3的并集被查出来了

  9、sunionstore

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

  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> sunionstore myset6 myset2 myset3
  (integer) 3
  redis 127.0.0.1:6379> smembers myset6
  1) "three"
  2) "one"
  3) "two"
  redis 127.0.0.1:6379>

  通过本例的结果可以看出, myset2和myset3的并集被保存到myset6中了

  10、smove

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

  redis 127.0.0.1:6379> smembers myset2
  1) "three"
  2) "two"
  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> smove myset2 myset7 three
  (integer) 1
  redis 127.0.0.1:6379> smembers myset7
  1) "three"
  redis 127.0.0.1:6379>

  通过本例可以看到,myset2的three被移到myset7中了

  11、scard

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

  redis 127.0.0.1:6379> scard myset2
  (integer) 1
  redis 127.0.0.1:6379>

  通过本例可以看到,myset2的成员数量为1

  12、sismember

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

  redis 127.0.0.1:6379> smembers myset2
  1) "two"
  redis 127.0.0.1:6379> sismember myset2 two
  (integer) 1
  redis 127.0.0.1:6379> sismember myset2 one
  (integer) 0
  redis 127.0.0.1:6379>

  通过本例可以看到,two是myset2的成员,而one不是。

  13、srandmember

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

  redis 127.0.0.1:6379> smembers myset3
  1) "two"
  2) "one"
  redis 127.0.0.1:6379> srandmember myset3
  "two"
  redis 127.0.0.1:6379> srandmember myset3
  "one"
  redis 127.0.0.1:6379>

时间: 2025-01-06 23:54:30

Redis详解:sets数据类型及操作的相关文章

Redis详解:sorted sets数据类型及操作

sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序.可以理解为有两列的mysql表,一列存value,一列存顺序.操作中key理解为zset的名字. 系列文章: Redis详解:strings数据类型及操作 Redis详解:hashes数据类型及操作 Redis详解:lists数据类型及操作 Redis详解:sets数据类型及操作 和set一样sorted set也是string类

Redis详解:strings数据类型及操作

Redis的作者antirez(Salvatore Sanfilippo)曾经发表了一篇名为Redis宣言(Redis Manifesto)的文章,文中列举了Redis 的七个原则,以向大家阐明Redis 的思想. 1.Redis是一个操作数据结构的语言工具,它提供基于TCP的协议以操作丰富的数据结构.在Redis中,数据结构这个词的意义不仅表示在某种数据结构上的操作,更包括了结构本身及这些操作的时间空间复杂度. 2.Redis定位于一个内存数据库,正是由于内存的快速访问特性,才使得Redis能

Spring Data操作Redis详解

Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis进行了很好的封装,用起来也是十分的得心应手.Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted se

使用Python操作Redis详解

之前的五天,过了个愉快的周末,然后将公司AbaseDump的调度部分代码看懂并且在此之上完成了OnlyDump的功能代码,代码不可以公开,今天完工,明天测试,晚上来总结一下这几天学到的一点应用. 使用Python操作Redis详解 ------------------------------------------------------------------------------------------------- 一. 文档说明 本文档仅介绍Redis在Python中的使用,Redis

基础拾遗------redis详解

基础拾遗 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗------接口详解 基础拾遗------泛型详解 前言 这篇文章和以往的基础拾遗有所不同,以前的介绍的都是c#基础,今天介绍的是redis.因为项目中一只在使用,我想现在大部分项目中都会用到nosql,缓存,今天就介绍一下redis..废话少说下面开始正题. 1.redis是什么? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 对的redi

.Net使用Redis详解之ServiceStack.Redis(七)

原文:.Net使用Redis详解之ServiceStack.Redis(七) 序言 本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习. Redis官方推荐的.NET驱动类库为Service.Stack.Redis.然而网上对这个类库的中文文档不是很全面与合理,这篇文章主要就对这个类库做注释展现.不足遗漏之处还望见谅,海涵. .Net使用Redis是非常方便与快捷与

Redis详解(一)——RDB

Redis详解(一)--RDB 前言 由于 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率).但是保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失. 为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能.Redis 支持两种形式的

Redis详解(二)——AOF

Redis详解(二)--AOF 前言 RDB 持久化存在一个缺点是一定时间内做一次备份,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失).对于数据完整性要求很严格的需求,怎么解决呢? 本篇博客接着来介绍Redis的另一种持久化方式--AOF. 1.AOF简介 Redis的持久化方式之一RDB是通过保存数据库中的键值对来记录数据库的状态.而另一种持久化方式 AOF 则是通过保存Redis服务器所执行的写命令来记录数据库状态. 比如对于如下命令: RDB 持久化方式就

Redis详解(八)——企业级解决方案

Redis详解(八)--企业级解决方案 缓存预热 缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统.避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 缓存预热解决方案: 缓存雪崩 缓存雪崩就是在一个较短的时间内,缓存中较多的key集中过期 假设我们的缓存是在同一时间创建(如天猫双十一),然后设置的缓存时间是一置的, 这样到特定的时间就会出现缓存雪崩的情况, 此时若是有大量访问量的操作就会造成数据库服务器的压力过大. 缓存雪崩解决方案: