一、概要
Redis 支持 5 中数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)。
二、字符串类型操作
1、特点
-
自增、自减
-
位运算
2、常用命令
set/get/decr/incr/mget/incr
3、常用应用场景
-
利用
setbit、getbit、bitcount
统计用户签到、活跃用户(注意:bitcount的start、end参数指的是字符串的位置,不是对应位的位置) -
利用
INCR
做原子计数器,生成唯一序列号 -
设置 key 有效期,上操作锁或者防止短时间内频繁发送短信验证
4、实现原理
String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
5、命令详解
set
-
说明
设置键值
-
方法名
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n31" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">SET key value [EX seconds] [PX milliseconds] [NX|XX]</pre>
-
参数说明
-
EX second
:设置键的过期时间为second
秒。SET key value EX second
效果等同于SETEX key second value
。
-
-
PX millisecond
:设置键的过期时间为millisecond
毫秒。SET key value PX millisecond
效果等同于PSETEX key millisecond value
。-
NX
:只在键不存在时,才对键进行设置操作。SET key value NX
效果等同于SETNX key value
。
-
-
XX
:只在键已经存在时,才对键进行设置操作。
-
栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n48" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">set 1 '小红'
set 2 '小姐姐'
set key-with-expire-time "hello" EX 60</pre>
setnx
-
说明
设置键值(key不存在则设置,否则不做操作)
-
语法格式
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n56" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">setnx(key,value)</pre>
-
参数说明
-
key:键
-
value:值
-
get
-
说明
通过键获取值
-
方法
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n71" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">get(key)</pre>
setbit
-
说明
对二进制表示位进行操作,将值对应的ASCII码变换成二进制后再进行索引
-
命令
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n79" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">setbit key offset value</pre>
-
参数
-
key
键
-
offset
偏移量,也就是位的索引(将值对应的ASCII码变换成二进制后再进行索引)
-
value
值只能是 1 或 0
-
-
栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n94" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;"># 当前的字母是:h, 对应的ASC码是: 104, 对应的二进制数据是: 01101000
当前的字母是:e, 对应的ASC码是: 101, 对应的二进制数据是: 01100101
当前的字母是:l, 对应的ASC码是: 108, 对应的二进制数据是: 01101100
当前的字母是:l, 对应的ASC码是: 108, 对应的二进制数据是: 01101100
当前的字母是:o, 对应的ASC码是: 111, 对应的二进制数据是: 01101111
setbit hello 21 0 # 将第三个l变成h </pre>
getset
-
说明
设置新值,返回原值
-
方法
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n102" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">getset key value</pre>
-
参数
-
key
键
-
value
新的值
-
-
返回值
如果存在返回旧的值,否则返回null
-
举个栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n117" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">getset 'key' '小红'</pre>
incr
-
说明
自增mount对应的值,当mount不存在时,则创建mount=amount,否则,则自增,amount为自增数(整数)
-
方法
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n125" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">incr key amount=1</pre>
-
参数
-
key
键
-
amount
当mount不存在时,则创建mount=amount 默认1,否则,则自增,amount为自增数(整数)
-
-
返回值
返回一个整数,增加后键的值
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="python" cid="n140" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">incr 'count1'
rds.incr 'count2', 2</pre>
getbit
-
说明
获取值
-
命令
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n148" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">getbit key offset</pre>
-
参数
-
key
键
-
offset
偏移量,也就是位的索引(将值对应的ASCII码变换成二进制后再进行索引)
-
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n160" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">"""
hello
01101000|[8]01[10]100101|01101100|01101100|01101111
"""
getbit hello 8 # 0
getbit hello 10 # 1</pre>
bitcount
-
说明
获取Bitmaps指定范围值为1的个数
-
命令
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n168" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">bitcount hello</pre>
三、list操作
1、常用命令
lpush/rpush/lpop/rpop/lrange等;
2、应用场景
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表等都可以用Redis的list结构来实现
3、实现原理
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
4、命令详解
lpush
-
说明
在key对应的list中添加元素,每个新的元素都添加到列表的最左边
-
方法
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n184" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lpush kye values...</pre>
-
参数
-
key
键
-
values
要添加的值
-
-
返回值
值的长度
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n199" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lpush "li" 2 3 4 5</pre>
rpush
-
说明
同lpush,但每个新的元素都添加到列表的最右边
lpushx
-
说明
在key对应的list中添加元素,只有key已经存在时,值添加到列表的最左边
-
方法
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n212" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lpushx key value</pre>
-
参数
同上
-
栗子
-
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n219" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lpushx li 1</pre>
lrange
-
说明
分片获取元素
-
命令
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n227" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lrange key start stop</pre>
-
参数
-
key 键
-
start 开始索引位置
-
stop 结束的索引位置
-
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n239" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lrange li 0 -1</pre>
lpop/rpop
-
说明
移除列表的左侧第一个元素
-
命令
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n247" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lpop key</pre>
-
参数
key 键
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n253" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">lpop li</pre>
四、hash操作
常用命令
hget/hset/hgetall等
应用场景
redis中的Hash在内存中一个键。对应一个map来存储 我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、手机,通过用户ID我们希望获取该用户的姓名或者其它信息
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n260" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit; color: rgb(184, 191, 198); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">user:uid:1 username,hehe
user:uid:1 phone 110
</pre>
实现原理
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
命令详解
hget/hset/hgetall
hset
-
说明
key对应的hash中设置一个键值对(不存在,则创建,否则,修改)
-
语法
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n273" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;"> hset key key value</pre>
-
参数
-
key redis的键
-
key hash的键
-
value hash对应的值
-
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n285" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">hset user userkey qq123456 </pre>
hset
-
说明
获取key对应的hash中值
-
语法
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n293" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;"> hset key key </pre>
-
参数
-
key redis的键
-
key hash的键
-
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n303" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">hget user userkey </pre>
hgetall
-
说明
获取hash中对应值的所有键
-
语法
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n311" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">hgetall key</pre>
-
参数
key: 键
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n317" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">hset user phone 110
hagetall user</pre>
其它
-
hincrby 对应的hash的值递增
-
hlen 获取元素的个数
-
hkeys 是否包含key
-
hvals 是否包含值
-
hdel 删除键支持简单的正则
五 、set相关操作
1、说明
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择
2、常用命令
sadd/spop/smembers/sunion等
3、特点
-
唯一性
-
差集、并集
4、常用应用场景
-
利用交并集操作,可以查找共同好友、好友推荐
-
利用差集操作,可以求出新增用户([利用Redis集合(Set)统计新增用户和次日留存率)
-
利用唯一性,可以统计网站UV
5、命令详解
sadd
-
说明
添加集合
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n358" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">sadd key value.. </pre>
-
参数说明
-
key:键
-
value:值
-
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n368" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">sadd numbers 1 2 3 1 1
sadd k1 "hello" "niuniu"
sadd k2 "jiaojiao" "hello" "world"</pre>
sdiff
-
说明
返回给定键所有集合的差集
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n376" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">SDIFF key [key ...]</pre>
-
参数说明
-
key:键
-
key:键
-
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n386" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">sadd k1 "hello" "niuniu"
sadd k2 "jiaojiao" "hello" "world"
SDIFF k1 k2</pre>
smembers
-
说明
获取集合中的所有的成员。 不存在的集合 key 被视为空集合
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n394" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">SMEMBERS KEY VALUE </pre>
-
参数说明
key:键
value:值
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n401" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">sadd k1 "hello"
sadd k1 "niuniu"
SMEMBERS k1</pre>
spop
-
说明
移除key对应集合中最右边(即最后面)的元素
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n409" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">spop key </pre>
-
参数说明
- key:键
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n417" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">spop k1</pre>
sunion
-
说明
令返回给定集合的并集。不存在的集合 key 被视为空集
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n425" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">SUNION KEY KEY1..KEYN</pre>
-
参数说明
- key:集合的键
-
栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n433" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">sadd k1 "hello"
sadd k1 "niuniu"
sadd k2 "jiaojiao"
sadd k2 "hello"
sadd k2 "world"SUNION k1 k2</pre>
六、有序集合相关操作
1、常用命令
zadd/zrange/zrem/zcard等
2、特点
-
有序,自由实现堆、栈的功能
-
轮询监控
-
索引取区间
3、常用应用场景
-
利用
LTRIM key start stop
获取网站最后5个访问用户、最新消息排行榜 -
利用
PUSH
POP
当成队列,进行多任务处理 -
利用
BRPOPLPUSH key1 key1 time
,使用相同的key作为BRPOPLPUSH的两个参数,无限循环整个列表,比如:一个服务器监控程序,并行检查一组网站,确保网站的可访问性 -
利用
BRPOP key time
进行事件提醒,在新元素到达时立即处理,新元素未到达一直阻塞住,避免轮询占用资源
4、实现原理
set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
5、命令详解
zincrby
-
说明
命令对有序集合中指定成员的分数加上增量 increment
可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
分数值可以是整数值或双精度浮点数。
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n469" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zincrby key increment member</pre>
-
参数说明
-
key:键
-
increment:值
-
amount:分数自增值
-
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n481" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">ZINCRBY hot 1 "华为mate30发布会"
ZINCRBY hot 1 "华为mate30发布会"
ZINCRBY hot 1 "华为mate30发布会"
ZINCRBY hot 1000 "华为mate30发布会"
ZINCRBY hot 1 "杨紫荷叶边半裙"
ZINCRBY hot 1 "杨紫荷叶边半裙"
ZINCRBY hot 1 "杨紫荷叶边半裙"按分数升序
zrange 'hot' 0 -1
按分数降序
zrevrange 'hot' 0 -1
</pre>
zadd
-
说明
在name对应的有序集合中添加元素,分数越小,越靠前
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n489" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;"> zadd key_name score value.. score value</pre>
-
参数说明
-
key_name:键
-
score 分数
-
value
-
-
举个栗子
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n501" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zadd hot 1 "华为mate发布会" 2 "斗鱼三骚"</pre>
zcard
-
说明
获取key对应的有序集合的元素个数
-
语法格式
<pre spellcheck="false" class="md-fences mock-cm md-end-block" lang="" cid="n509" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zcard key</pre>
-
参数说明
key:键
-
举个栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n515" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zcard hot</pre>
zcount
-
说明
获取key对应的有序集合中,min<=分数<=max中的元素个数
-
语法格式
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n523" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zcount key,min,max </pre>
-
参数说明
-
name:键
-
min:小值(分数)
-
max:大值(分数)
-
-
举个栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n535" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zcount hot 1 9 </pre>
zrange
-
说明
获取name对应的有序集合中,start<=下标<=end的所有数据。
-
语法格式
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n543" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">ZRANGE key start stop [WITHSCORES]</pre>
-
参数说明
-
name:键
-
start:起始位置
-
end:结束位置
-
withscores:是否获取分数,默认False
-
-
举个栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n557" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zrange 'hot' 0 -1 WITHSCORES</pre>
zrem
-
说明
移除有序集中的一个或多个成员,不存在的成员将被忽略
-
语法格式
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n565" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zrem key member</pre>
-
参数说明
-
name:键
-
member
-
-
举个栗子
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n575" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; background: rgb(51, 51, 51); position: relative !important; padding: 10px 10px 10px 30px; width: inherit;">zrem hot "华为mate发布会"</pre>
网友评论