Redis学习(4)-数据类型set和zset

Set数据类型及操作

Set集合是通过hash table实现的,所以添加、删除和查找的复杂度都是O(1),hash table会随着添加或者删除自动的调整大小,需要注意的是 hash table大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在sorted set中使用了,关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersetion),差集(difference),通过这些操作可以很容易的实现sns中的好友推荐和blog的tag功能,下面详细介绍set相关命令:

1.sadd
向名称为key的set中添加元素:
命令:
  sadd myset "hello"
  1
  sadd myset "world"
  1
  sadd myset "world"
  0
  smembers myset
  1)"world"
  2)"hello"
本例中,我们向myset中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以第三个元素没有添加成功,最后我们用smembers来查看myset中的所有元素。

2.srem
删除名称为key的set中的元素member:
命令:
  sadd myset2 "one"
  1
  sadd myset2 "two"
  1
  sadd myset2 "three"
  1
  srem myset2 "one"
  1
  srem myset2 "four"
  0
  smembers myset2
  1)"three"
  2)"two"
本例中,我们向myset2中添加了三个元素后,再调用srem 来删除one和four,但由于元素
中没有four所以,此条srem命令执行失败

3.spop
随机返回并删除名称为key的set中一个元素
命令:
  sadd myset2 "one"
  1
  sadd myset2 "two"
  1
  sadd myset2 "three"
  1
  spop myset2
  1
  smembers myset2
  1)"one"
  2)"two"
本例中,我们向myset3中添加了三个元素后,再调用spop来随机删除一个元素,可以看到three元素被删除了。

4.sdiff
返回所有给定key与第一个key的差集

命令:
  sadd myset2 "one"
  1
  sadd myset2 "two"
  1
  sadd myset3 "one"
  1
  sadd myset3 "three"
  1
  sdiff myset2 myset3
  1)"one"

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

命令:
  smembers myset2
  1)"three"
  2)"two"
  smembers myset3
  1)"two"
  2)"one"
  sdiffstore myset4 myset2 myset3
  1
  smembers myset4
  1)"three"

6.sinter
返回所有给定key的交集

命令:
  smembers myset2
  1)"three"
  2)"two"
  smembers myset3
  1)"two"
  2)"one"
  sinter myset2 myset3
  1)"two"
本例的结果可以看出 myset2和myset3的交集two被查出来了

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

命令:
  smembers myset2
  1)"three"
  2)"two"
  smembers myset3
  1)"two"
  2)"one"
  sinterstore myset5 myset2 myset3
  1
  smembers myset5
  1)"two"
8.sunion
返回所有给定的key的并集

命令:
  smember myset2
  1)"three"
  2)"two"
  smembers myset3
  1)"two"
  2)"one"
  sunion myset2 myset3
  1)"three"
  2)"one"
  3)"two"

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

命令:
  smembers myset2
  1)"three"
  2)"two"
  smembers myset3
  1)"two"
  2)"one"
  sunionstore myset6 myset2 myset3
  3
  smembers myset6
  1)"three"
  2)"one"
  3)"two"
通过本例的结果可以看出,myset2和myset3的并集被保存到myset6中

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

命令:
  smembers myset2
  1)"three"
  2)"two"
  smembers myset3
  1)"two"
  2)"one"
  smove myset2 myset7 three
  1
  smembers myset7
  1)"three"
通过本例可以看到,myset2的three被移到myset7中了

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

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

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

命令:
  smember myset2
  1)"two"
  sismember myset2 two
  1
  sismember myset2 one
  0
通过本例可以看到,two是myset2的成员,而one不是

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

命令:
  smembers myset3
  1)"two"
  2)"one"
  srandmember myset3
  "two"
  srandmember myset3
  "one"

sorted sets数据类型及操作
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当元素存储。下面是sorted set相关命令

1.zadd
向名称为key的zset中添加元素member,score用于排序,如果该元素已经存在,则根据score更新该元素的顺序
命令:
  zadd myzset 1 "one"
  1
  zadd myzset 2 "two"
  1
  zadd myzset 3 "two"
  0
  zrange myzset 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"3"
 本例中我们向myzset中添加了one和two,并且two被设置了2次,那么将以最后一次的设置为准,最后我们将所有元素都显示出来并显示出了元素的score。

2.zrem
删除名称为key的zset中的元素member
命令:

  zrange myzset 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"3"
  zrem myzset two
  1
  zrange myzset 0 -1 withcscores
  1)"one"
  2)"1"
可以看到two被删除了

3.zincrby
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
命令:
  zadd myzset2 1 "one"
  1
  zadd myzset2 2 "two"
  1
  zincrby myzset2 2 "one"
  "3"
  zrange myzset2 0 -1 withscores
  1)"two"
  2)"2"
  3)"one"
  4)"3"
本例中将one的score从1增加了2,增加到了3

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

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zrank myzset3 two
  1
本例中将two下标是1,我这里取的是下标,而不是score

5.zrevrank
返回名称为key的zset中member元素的排名(按score从大到小排序)
即下标
命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zrank myzset3 two
按从大到小排序的话two是第三个元素,下标是2

6.zrevrange
返回名称为key的zset(按score从大到小排序)
中的index从start到end的所有元素

命令:
  zrevrange myzset3 0 -1 withscores
  1)"five"
  2)"5"
  3)"three"
  4)"3"
  5)"two"
  6)"2"
  7)"one"
  8)"1"
首先按score从大到小排序,再取出全部元素

7.zrangebyscore
返回集合中score在给定区间的元素

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zrangebyscore myzset3 2 3 withscores
  1)"two"
  2)"2"
  3)"three"
  4)"3"
本例中,返回了score在2-3区间的元素

8.zcount
返回集合中score在给定区间的数量

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zcount myzset3 2 3
  2
本例中,计算了score在2~3之间的元素数目

9.zcard
返回集合元素个数

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zcard myzset3
  4
从本例看出myzset3这个集合的元素数量是4

10.zscore
返回给定元素对应的score

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zscore myzset3 two
  "2"
此例中我们成功的将two的score取出来了。

11.zremrangebyrank
删除集合中排名在给定区间的元素

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  7)"five"
  8)"5"
  zremrangebyrank myzset3 3 3
  1
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
在本例中我们将myzset3中按从小到大排序结果的下标为3的元素删除了。

12.zremrangebyscore
删除集合中score在给定区间的元素

命令:
  zrange myzset3 0 -1 withscores
  1)"one"
  2)"1"
  3)"two"
  4)"2"
  5)"three"
  6)"3"
  zremrangebyscore myzset3 1 2
  2
  zrange myzset3 0 -1 withscores
  1)"three"
  2)"3"
在本例中我们将myzset3中按从小到大排序结果的score在1~2之间的元素删除了

时间: 2024-10-10 10:44:17

Redis学习(4)-数据类型set和zset的相关文章

Redis 学习(二) —— 数据类型及操作

Redis支持string.list.set.zset.hash等数据类型,这一篇学习redis的数据类型.命令及某些使用场景. 一.String,字符串 字符串是 Redis 最基本的数据类型.一个字符串最大为 512M 字节.字符串数据类型适用于很多场景,例如,缓存 HTML 片段或者页面. Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串可以包含任意类型的数据,例如一张 JPEG 图像,或者一个序列化的对象. 我们可以把字符串当做位数组(位图)来处理,很容易统计一些基于

redis学习-sds数据类型

今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 <Redis 设计与实现(第一版)> 于是决定从这个开始入门. 1.数据类型定义 typedef char *sds; struct sdshdr { // buf 已占用长度 int len; // buf 剩余可用长度 int free; // 实际保存字符串数据的地方 char buf[]; }; 2.重新计算新的长度 newlen = sdshdr.len + required_len if n

Redis学习之数据类型List详解

本文和大家分享的主要是redis数据类型中的list相关内容,一起来看看吧,希望对大家学习redis有所帮助. list即链表,它是一个能维持数据先后顺序的列表,便于在表的两端追加和删除数据,中间位置的存取具有O(N)的时间复杂度,是一个双向链表. 一.内部原理 redis内部实现代码在quicklist.c(注释:A doubly linked list of ziplists)中,它确实是一个双向链表,并且是一个ziplist双向列表. ziplist是什么? 一个经过特殊编码的的双向链表,

Redis 学习子数据类型

该文使用centos6.5 64位 redis-3.2.8 [[email protected] bin]# netstat -tunpl |grep 6379  查看redis 是否启动成功 一.String类型 String是最简单的类型,一个key对应一个Value,string类型是二进制安全的.redis的string可以包含任何数据类型,比如jpg图片或者序列化的对象. 1.set方法:设置key对应的值为string类型的value,如果该key已经存在,则覆盖key对应的valu

Redis学习笔记——数据类型及操作

数据操作 redis是key-value的数据,所以每个数据都是一个键值对 键的类型是字符串 值的类型分为五种: 字符串string 哈希hash 列表list 集合set 有序集合zset 数据操作的全部命令,可以查看http://redis.cn/commands.html 接下来逐个介绍操作各类型的命令 string string是redis最基本的类型 最大能存储512MB数据 string类型是二进制安全的,即可以为任何数据,比如数字.图片.序列化对象等 命令 设置 设置键值 set

Redis学习(2)-数据类型String和Hashes

Redis的数据类型 (1)Strings类型及操作String是最简单的类型,一个Key对应一个Value,string类型是二进制安全的,Redis的string可以包含任何数据,比如jpg图片或者序列化的对象 1.Set 设置key对应的值为string类型的value 例如:我们添加一个name=hello的键值对 命令:set name hello2.Get 获取key对应value的值 命令:get name3.Setnx 设置key对应的值为string类型的value,如果key

redis学习笔记——数据类型

对象处理机制 Redis 构建了自己的类型系统,这个系统的主要功能包括:• redisObject 对象.• 基于redisObject 对象的类型检查.• 基于redisObject 对象的显式多态函数.• 对redisObject 进行分配.共享和销毁的机制. (redisObject 实际上是只是一个结构类型.) redisObject 的定义位于redis.h :/** Redis 对象*/typedef struct redisObject {// 类型unsigned type:4;

Redis学习(3)-数据类型List

list类型及操作List是一个链表结构,主要的功能是push.pop获取一个范围的所有值等等,操作中key理解为链表的名字,Redis的list类型其实就是一个每子元素都是string类型的双向链表,我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列 1.lpush 在key对应list的头部添加字符串元素 在此处我们先插入一个world,然后在world的头部插入一个hello,其中lrange是用于取mylist的内容. 命令: lp

Redis学习三:Redis数据类型

一.Redis的五大数据类型 1.String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 .string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M 2.Hash(哈希,类似java里的Map) Redis hash 是一个键值对集合.Redis hash是一个s