最近我问了很多小伙伴,他们对 Redis(远程字典服务) 大多数还是停留在String 类型上的使用【80%,还是有点可怕】
Redis 设计出了其他类型的数据类型,一定是有他的道理和使用场景的,大家还是多去了解一下其他的数据类型的使用和场景。
不要做一个简单的 API 工程师。
好了,废话少说,开始正文。请跟着 示例 亲自敲代码!不然一会就忘了。。
Redis 5种 基本数据类型
序号 | 类型 | 存储的值 | 说明 |
---|---|---|---|
1 | 字符串(STRING) | 可以是保存字符串、整数和浮点数 | 可以对字符串进行操作,比如增加字符串或者求字串;如果是整数或者是浮点数,可以实现计算,比如自增等 |
2 | 列表(LIST) | 他是一个链表,他的每一个节点都包含一个字符串 | Redis 支持从连边的两端插入或着弹出节点,或着通过偏移对他进行建材,还可以读取一个或多个节点,根据条件删除或着查找结点等 |
3 | 集合(SET) | 他是一个收集器,但是是无序的,在他的每个元素都是一个字符串,而且是独一无二的,各不相同的 | 可以新增、读取、删除单个元素;检测一个元素是否在集合中;计算它和其他集合的交集、并集和差集等;随即从集合中读取元素 |
4 | 哈希散列表(HASH) | 类似于Java的 HashMap ,是一个键值对应的无序列表 | 可以增、删、改、查单个键值对,也可以获取所有的键值对 |
5 | 有序集合(ZSET) | 是一个有序的集合,可以包含字符串、证书、浮点数、分值(score),元素的排序是根据分值的大小来决定的 | 可以增、删、改、查元素,根据分值的范围或着成员来获取对应的元素 |
是否开启缓存的因素
我们通常是将Redis 作为缓存在使用,是因为我们知道缓存能降低 IO 的高消耗,提高系统的效率。
但是不是什么都需要进行缓存的:体积过大的数据(图片、视频) 、 用的很少的数据 等,这些并不是很需要缓存
首先我们要了解,缓存是在内存上运行的,而内存也是很昂贵的!!在你准备做缓存之前一定要思考,那些数据是有需要的,再开启缓存
思考因素
-
缓存的数据的命中率,如果命中率不必做成缓存。
-
业务的类型:读多写少就要使用缓存
-
业务数据的大小,如果存储内容过大,就不用缓存
1、Redis字符串(String)
基本命令
命令 | 说明 | 备注 |
---|---|---|
set KEY value | 设置键值对 | 最常用的写入命令 |
get KEY | 通过键值获取值 | 最常用的读取命令 |
del KEY | 通过key,删除键值对 | 删除命令,返回删除树,注意,他是个通用的命令,换句话说,在其他的数据结构中,也可以使用它 |
strlen KEY | 求 key 执行字符串的长度 | 返回长度 |
getset KEY value | 修改原来 key 对应的值,并将旧值返回 | 如果原值为空,则返回空,并设置新值 |
getrange KEY start end | 获取子串 | 记字符串的长度为len ,吧字符串看作一个数组,而 Redis 是以0开始计数的,所以 start,end 范围为 [0,length-1] |
append KEY value | 将新的符串 value ,加入到原来key指向的字符串末 | 返回key 指向新字符串的长度 |
SETEX KEY SECONDS VALUE | 设置字符串键值,并且设置过期时间 | |
SETNX KEY VALUE | 如果键不存在,设置值;存在则失败 | 成功返回1,失败返回0【分布式锁中经常使用】 |
使用示例
SET KEY VALUE
设置 a [Key] - 1 [Value]
centos7-server:0>set a 1
"OK"
GET KEY
获取 a 的值
centos7-server:0>get a
"1"
TYPE KEY
查看 a 类型
centos7-server:0>type a
"string"
APPEND KEY VALUE
给 a 后面追加 字符串
centos7-server:0>append a 2
"2"
centos7-server:0>get a
"12"
STRLEN KEY
查看 a 键值的长度
centos7-server:0>strlen a
"2"
GETSET KEY VALUE
获取 键值 并设置新值
centos7-server:0>getset a 123
"12"
centos7-server:0>get a
"123"
GETRANGE KEY START END
获取字符串的子字符串
centos7-server:0>getrange a 1 1
"2"
centos7-server:0>getrange a 1 -1
"23"
SETRANGE KEY START VALUE
替代指定位置开始的字符串
centos7-server:0>setrange a 1 4
"3"
centos7-server:0>get a
"143"
centos7-server:0>setrange a 1 456
"4"
centos7-server:0>get a
"1456"
DEL KEY
删除一个键值对
centos7-server:0>del a
"1"
centos7-server:0>get a
null
SETEX KEY SECONDS VALUE 设置键值对,并且设置生存时间
centos7-server:0>setex b 30 2
"OK"
centos7-server:0>get b
"2"
centos7-server:0>ttl b
"24"
SETNX KEY VALUE 不存在键的话就设置键值,存在就失败
centos7-server:0>keys *
1) "a"
2) "wxz"
centos7-server:0>setnx a 1
"0"
centos7-server:0>setnx b 1
"1"
EXPIRE KEY SECONDS
设置键值的生存时间
centos7-server:0>expire a 30
"1"
centos7-server:0>ttl a
"27"
运算命令
但是 Redis 除了这些之外还提供了对整数和浮点型数字的功能。如果字符串是数字(整数或者浮点数),那么 Redis 还能支持简单的运算。不过它的运算能力比较弱,目前版本只能支持简单的加减法运算
命令 | 说明 | 备注 |
---|---|---|
INCR KEY | 值+1 | 只能对整数操作 |
INCRBY KEY INCREMENT | 值+INCREMENT | 只能对整数操作 |
DECR KEY | 值-1 | 只能对整数操作 |
DECRBY KEY DECREMENT | 值-INCREMENT | 只能对整数操作 |
INCRBYFLOAT KEY INCREMENT | 值+INCREMENT | 可操作浮点数或整数 |
运算使用示例
INCR KEY
值+1
centos7-server:0>set a 12
"OK"
centos7-server:0>incr a
"13"
INCR KEY INCREMENT
值+INCREMENT
centos7-server:0>incrby a 2
"15"
DECR KEY
值-1
centos7-server:0>decr a
"14"
DECRBY KEY DECREMENT
值-INCREMENT
centos7-server:0>decrby a 2
"12"
INCRBYFLOAT KEY INCREMENT
值+INCREMENT(浮点数)
centos7-server:0>INCRBYFLOAT a 0.1
"12.1"
centos7-server:0>INCRBYFLOAT a -0.1
"12"
centos7-server:0>incr a
"13"
批量操作命令
命令 | 说明 |
---|---|
MSET KEY1 VALUE1 KEY2 VALUE2 ... | 批量设置键值对 |
MGET KEY1 KEY2 ... | 获取多个键值对 |
MSETNX KEY1 VALUE1 KEY2 VALUE2 | 如果不存在设置键值对,有一个失败,全部失败(原子性) |
使用示例
MSET KEY1 VALUE1 KEY2 VALUE2 ... 批量设置键值对
centos7-server:0>MSET a 1 b 2 c 3
"OK"
centos7-server:0>keys *
1) "c"
2) "a"
3) "b"
MGET KEY1 KEY2 ... 批量获得键值对
centos7-server:0>MGET a b c
1) "1"
2) "2"
3) "3"
MSETNX KEY1 VALUE1 KEY2 VALUE2 批量设置键值对,如果有一个键已经存在,就全部失败
centos7-server:0>MSETNX c 4 d 5
"0"
centos7-server:0>MGET a b c d
1) "1"
2) "2"
3) "3"
4) null
使用场景
-
计数器
-
统计多单位的数量
-
粉丝数
-
对象缓存存储
2、Redis 列表(Lists)
(双向)列表结构是 Redis 中一个常用的结构,它可以存储多个字符串,而且它是有序的,能够存储 2 的 32 次方减 1 个节点(超过 40 亿个节点)。
因为是双向链表结构,所以 Redis 链表命令分为左操作和右操作两种命令,左操作就意味着是从左到右,右操作就意味着是从右到左。
操作过程如图
基本命令
命令 | 说明 |
---|---|
LPUSH LIST node1 node2 ... | 向链表中头部(左)添加节点 node1,node2,...,列表顺序 nodeN,...node2,node1 |
RPUSH LIST node1 node2 ... | 向链表中尾部(右)添加节点 node1,node2,...,列表顺序 node1,node2,...nodeN |
LINDEX LIST INDEX | 从左读取索引为 INDEX 的节点数据 |
LLEN LIST | 查看列表 LIST 的长度 |
LPOP LIST | 删除头部(左)第一个节点,并将其返回 |
RPOP LIST | 删除尾部(右)第一个节点,并将其返回 |
使用示例
LPUSH LIST NODE1 NODE2 ... 从头部(左)新增节点node1 node2 ..
RPUSH LIST NODE1 NODE2 ... 从尾部(右)新增节点node1 node2 ..
# 从头部添加节点
centos7-server:0>LPUSH list 1 2 3
"3"
centos7-server:0>LRANGE list 0 -1
1) "3"
2) "2"
3) "1"
# 从尾部添加节点
centos7-server:0>rpush list 4 5 6
"6"
centos7-server:0>LRANGE list 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
5) "5"
6) "6"
LINDEX LIST INDEX 从左开始查找索引为 Index 的值
centos7-server:0>lindex list 0
"3"
LLEN LIST 查看 LIST 的长度
centos7-server:0>llen list
"6"
LPOP LIST 从头部删除一个元素,并返回其值
centos7-server:0>lpop list
"3"
centos7-server:0>lrange list 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
5) "6"
RPOP LIST 从尾部删除一个元素,并返回其值
centos7-server:0>rpop list
"6"
centos7-server:0>lrange list 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
进阶命令
命令 | 说明 |
---|---|
LINSERT LIST BEFORR|AFTER PIVOT NODE | 插如一个节点 NODE ,并且可以指定为 pivot 的节点(第一个)的前面(BEFORE)或者后面(AFTER)。LIST 不存在报错;如果没有值为 PIVOT的,失败返回-1 |
LPUSHX LIST node1 node2 ... | 向 LIST 头部插入节点 node1,node2,.... ,成功返回列表长度;列表不存在失败返回0 |
RPUSHX LIST node node2 ... | 向 LIST 尾部插入节点 node1,node2,.... ,成功返回列表长度;列表不存在失败返回0 |
LREM LIST COUNT VALUE | 从左往右删除 |COUNT| 个列表中值等于VALUE 的值,如果 count 大于存在个数,删除所有等于 value 的值 |
LSET LIST INDEX VALUE | 从左往右将列表中索引为 INDEX 的值改为 VALUE |
LTRIM LIST START END | 修剪list 中 start end 部分。删除 start-end 部分 |
RPOPLPUSH LIST LIST2 | 从 LIST 中尾部 pop 一个元素 添加到 LIST2 中的头部 |
使用示例
首先查看当前 list
centos7-server:0>lrange list 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
添加重复节点 2
centos7-server:0>lpush list 2
"5"
centos7-server:0>lrange list 0 -1
1) "2"
2) "2"
3) "1"
4) "4"
5) "5"
LINSERT LIST BEFORR|AFTER PIVOT NODE
插如一个节点 NODE ,并且可以指定为 pivot 的节点(第一个)的前面(BEFORE)或者后面(AFTER)。LIST 不存在报错;如果没有值为 PIVOT的,失败返回-1
centos7-server:0>linsert list after 2 3
"6"
centos7-server:0>lrange list 0 -1
1) "2"
2) "3"
3) "2"
4) "1"
5) "4"
6) "5"
LPUSHX LIST node1 node2 ...
向 LIST 头部插入节点 node1,node2,.... ,成功返回列表长度;列表不存在失败返回0
centos7-server:0>lpushx list 1
"7"
centos7-server:0>lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "2"
5) "1"
6) "4"
7) "5"
# 向不存在的 listx 中插入数据 —> 失败
centos7-server:0>lpushx listx 1
"0"
centos7-server:0>lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "2"
5) "1"
6) "4"
7) "5"
RPUSHX LIST node1 node2 ...
向 LIST 尾部插入节点 node1,node2,.... ,成功返回列表长度;列表不存在失败返回0
centos7-server:0>rpushx list 1 2
"9"
centos7-server:0>lrange list 0 -1
1) "1"
2) "2"
3) "3"
4) "2"
5) "1"
6) "4"
7) "5"
8) "1"
9) "2"
LREM LIST COUNT VALUE
从左往右删除 |COUNT| 个列表中值等于VALUE 的值,如果 count 大于存在个数,删除所有等于 value 的值
centos7-server:0>lrem list -4 1
"3"
centos7-server:0>lrange list 0 -1
1) "2"
2) "3"
3) "2"
4) "4"
5) "5"
6) "2"
LSET LIST INDEX VALUE
从左往右将列表中索引为 INDEX 的值改为 VALUE
centos7-server:0>lset list 1 11
"OK"
centos7-server:0>lrange list 0 -1
1) "2"
2) "11"
3) "2"
4) "4"
5) "5"
6) "2"
LTRIM LIST START END
修剪list 中 start end 部分。删除 start-end 部分
centos7-server:0>ltrim list 1 3
"OK"
centos7-server:0>lrange list 0 -1
1) "11"
2) "2"
3) "4"
RPOPLPUSH LIST LIST2
从 LIST 中尾部 pop 一个元素 添加到 LIST2 中的头部
centos7-server:0>rpoplpush list listx
"4"
centos7-server:0>lrange listx 0 -1
1) "4"
centos7-server:0>lrange list 0 -1
1) "11"
2) "2"
线程安全命令
需要指出的是,之前这些操作链表的命令都是进程不安全的,因为当我们操作这些命令的时候,其他 Redis 的客户端也可能操作同一个链表,这样就会造成并发数据安全和一致性的问题,尤其是当你操作一个数据量不小的链表结构时,常常会遇到这样的问题。
为了克服这些问题,Redis 提供了链表的阻塞命令,它们在运行的时候,会给链表加锁,以保证操作链表的命令安全性:
命令 | 说明 |
---|---|
BLPOP LIST TIMEOUT | 移除并获取列表的第一个元素,如果列表没有元素或阻塞到等待超时时间 |
BLPOP LIST TIMEOUT | 移除并获取列表的最后一个元素,如果列表没有元素或阻塞到等待超时时间 |
BRPOPLPUSH LIST LIST1 TIMEOUT | 从 LIST 中尾部 pop 一个元素 添加到 LIST2 中的头部, 如果 LIST 中没有元素阻塞到超出等待时间 |
当使用这些命令时,Redis 就会对对应的链表加锁,加锁的结果就是其他的进程不能再读取或者写入该链表,只能等待命令结束。加锁的好处可以保证在多线程并发环境中数据的一致性,保证一些重要数据的一致性,比如账户的金额、商品的数量。
使用场景
- 作为栈使用
- 作为队列使用(消息队列等)
3、Redis 集合(Set)
Redis 的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来存储和查找数据,理论上一个集合可以存储 2 的 32 次方减 1 个节点(大约 42 亿)个元素,因为采用哈希表结构,所以对于 Redis 集合的插入、删除和查找的复杂度都是 0(1),只是我们需要注意 3 点。
-
对于集合而言,它的每一个元素都是不能重复的,当插入相同记录的时候都会失败。
-
集合是无序的。
-
集合的每一个元素都是 String 数据结构 类型。
基本命令
命令 | 说明 |
---|---|
SADD SET V1 V2 V3 ... | 向集合 SET 中添加元素 |
SCARD SET | 统计 SET 中的元素数量 |
SISMEMBER SET V | 查看 SET 中是否有 V 元素 |
SREM SET V1 V2 ... | 移除 SET 中的元素 |
SRANDMEMBER SET COUNT | 随机获取 SET 中的 COUNT 个元素 |
SPOP SET | 随机删除 SET 中的一个元素 |
SMOVE SET SET1 V | 将 SET 中的 V 元素取出,放到 SET1 中 |
使用示例
SADD SET V1 V2 V3 ...
向集合 SET 中添加元素
centos7-server:0>sadd set 1 2 3
"3"
centos7-server:0>smembers set
1) "1"
2) "2"
3) "3"
SCARD SET
统计 SET 中的元素数量
centos7-server:0>SCARD set
"3"
SISMEMBER SET V
查看 SET 中是否有 V 元素
centos7-server:0>sismember set 1
"1"
SREM SET V1 V2 ...
移除 SET 中的元素
centos7-server:0>SMEMBERS set
1) "1"
2) "2"
3) "3"
centos7-server:0>SREM set 2
"1"
centos7-server:0>SMEMBERS set
1) "1"
2) "3"
SRANDMEMBER SET COUNT
随机获取 SET 中的 COUNT 个元素
centos7-server:0>SMEMBERS set
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
centos7-server:0>SRANDMEMBER set 1
"1"
centos7-server:0>SRANDMEMBER set 1
"3"
SPOP SET
随机删除 SET 中的一个元素
centos7-server:0>spop set
"5"
centos7-server:0>SMEMBERS set
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
SMOVE SET SET1 V
将 SET 中的 V 元素取出,放到 SET1 中
centos7-server:0>smove set set1 1
"1"
centos7-server:0>SMEMBERS set
1) "2"
2) "3"
3) "4"
4) "6"
centos7-server:0>SMEMBERS set1
1) "1"
运算命令
集合的运算一般有: 求两个集合的 交集、并集、补集
命令 | 说明 |
---|---|
SUNION SET SET1 | 求两个集合的并集 |
SINTER SET SET1 | 求两个集合的交集 |
SDIFF SET SET1 | 求 SET 比 SET1 中多的东西 |
SUNIONSTORE RESULT SET SET1 | 求两个集合的并集,并存储到 RESULT 中 |
SINTERSTORE RESULT SET SET1 | 求两个集合的交集,并存储到 RESULT 中 |
SDIFFSTORE RESULT SET SET1 | 求 SET 比 SET1 中多的东西,并存储到 RESULT 中 |
使用示例
开始之前,我们先创建两个集合 set set1
centos7-server:0>SADD set 1 2 3 4 5 6
"6"
centos7-server:0>SADD set1 4 5 6 7 8 9
"6"
SUNION SET SET1
求两个集合的并集
centos7-server:0>sunion set set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"
SINTER SET SET1
求两个集合的交集
centos7-server:0>sinter set set1
1) "4"
2) "5"
3) "6"
SDIFF SET SET1
求 SET 比 SET1 中多的东西
centos7-server:0>sdiff set set1
1) "1"
2) "2"
3) "3"
centos7-server:0>sdiff set1 set
1) "7"
2) "8"
3) "9"
使用场景
-
类似于 QQ 中共同好友、共同群聊等
-
微薄的共同关注等
-
随机获取元素
4、Redis 有序集合(Sorted sets)
有序集合和集合类似,只是说它是有序的,和无序集合的主要区别在于每一个元素除了值之外,它还会多一个分数。分数是一个浮点数,在 Java 中是使用双精度表示的,根据分数,Redis 就可以支持对分数从小到大或者从大到小的排序。
这里和无序集合一样,对于每一个元素都是唯一的,但是对于不同元素而言,它的分数可以一样。元素也是 String 数据类型,也是一种基于 hash 的存储结构。
有序集合是依赖 key 标示它是属于哪个集合,依赖分数进行排序,所以值和分数是必须的,而实际上不仅可以对分数进行排序,在满足一定的条件下,也可以对值进行排序。
Value 不可重复
基本命令
命令 | 说明 |
---|---|
ZADD ZSET SCORE1 V1 SCORE2 V2 ... | 向 ZSET 中添加 SCORE1 V1 SCORE2 V2 ... |
ZCARD ZSET | 查看 ZSET 中的数据数量 |
ZRANGE ZSET START END [WITHSCORES] | 查看 ZSET 中 START~END 个中的元素【ZSET默认升序】 |
ZREVRANGE ZSET START END [WITHSCORES] | 查看 ZSET 中 START~END 个中的元素,按Score降序 |
ZSCORE ZSET VALUE | 查看 ZSET 中 VALUE 的分数值 |
ZRANGEBYSCORE ZSET MIN MAX [WITHSCORES] | 查看分数在 MIN 到 MAX Value; 使用 ( 可设置为开区间 |
ZCOUNT ZSET MIN MAX | 查看分数在 MIN ~ MAX 中的 Value 个数;使用 ( 可设置为开区间 |
ZREVRANGEBYSCORE ZSET MAX MIN [WITHSCORES] | 查看分数在 MAX 到 MIN 的 Value; 使用 ( 可设置为开区间 |
ZRANK ZSET VALUE | 从小到大查看比 VALUE 小的 数量 |
ZREVRANK ZSET VALUE | 从大到小查看比 VALUE 大的 数量 |
使用示例
ZADD ZSET SCORE1 V1 SCORE2 V2 ...
向 ZSET 中添加 SCORE1 V1 SCORE2 V2 ...
centos7-server:0>zadd zset 1 a 2 b 3 c
"3"
centos7-server:0>zrange zset 0 -1
1) "a"
2) "b"
3) "c"
########## 添加 Score 已经存在,但是 Value 不存在的数据,能添加
centos7-server:0>zadd zset 2 d
"1"
centos7-server:0>zrange zset 0 -1
1) "a"
2) "b"
3) "d"
4) "c"
centos7-server:0>zadd zset 6 f
"1"
centos7-server:0>zrange zset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "d"
6) "2"
7) "c"
8) "3"
9) "f"
10) "6"
通过软件可以看到
我们继续添加 2 a
########### 添加 Value 存在的数据,不能添加,原有数据被覆盖
centos7-server:0>zadd zset 3 a
"0"
centos7-server:0>zrange zset 0 -1 withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "a"
6) "3"
7) "c"
8) "3"
9) "f"
10) "6"
可以看到 value 的 score 被覆盖了,所以 value 是 不可重复的。自动根据 Score 排序[升序]
ZCARD ZSET
查看 ZSET 中的数据数量
centos7-server:0>zcard zset
"5"
ZRANGE ZSET START END
查看 ZSET 中 START~END 个中的元素【ZSET默认按 Score 升序】
centos7-server:0>zrange zset 0 -1 withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "a"
6) "3"
7) "c"
8) "3"
9) "f"
10) "6"
ZREVRANGE ZSET START END
查看 ZSET 中 START~END 个中的元素,按Score降序
centos7-server:0>zrevrange zset 0 -1 withscores
1) "f"
2) "6"
3) "c"
4) "3"
5) "a"
6) "3"
7) "d"
8) "2"
9) "b"
10) "2"
ZSCORE ZSET VALUE
查看 ZSET 中 VALUE 的分数值
centos7-server:0>zscore zset a
"2"
ZRANGEBYSCORE ZSET MIN MAX
查看分数在 MIN 到 MAX 的 Value
##### 添加 withscores 方便查看效果 -inf:负无穷 +inf:正无穷
centos7-server:0>zrangebyscore zset -inf +inf withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "a"
6) "3"
7) "c"
8) "3"
9) "f"
10) "6"
官方文档上写道 ( 可以设置为开区间
######### 同样可以使用 ( 来指定不包括当前值
centos7-server:0>zrangebyscore zset 2 (3 withscores
1) "b"
2) "2"
3) "d"
4) "2"
centos7-server:0>zrangebyscore zset 2 3 withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "a"
6) "3"
7) "c"
8) "3"
ZCOUNT ZSET MIN MAX
查看分数在 MIN ~ MAX 中的 Value 个数;使用 (
可设置为开区间
####### 结果对应上面的 zrange 的开闭区间结果的数量
centos7-server:0>zcount zset 2 3
"4"
centos7-server:0>zcount zset 2 (3
"2"
ZREVRANGEBYSCORE ZSET MAX MIN [WITHSCORES]
查看分数在 MAX 到 MIN 的 Value; 使用 (
可设置为开区间
centos7-server:0>zrevrangebyscore zset 3 2 withscores
1) "c"
2) "3"
3) "a"
4) "3"
5) "d"
6) "2"
7) "b"
8) "2"
ZRANK ZSET VALUE
从小到大查看比 VALUE 小的 数量
centos7-server:0>zrange zset 0 -1 withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "a"
6) "3"
7) "c"
8) "3"
9) "f"
10) "6"
centos7-server:0>zrank zset a
"2"
ZREVRANK ZSET VALUE
从大到小查看比 VALUE 大的 数量
centos7-server:0>zrevrank zset a
"2"
删除命令
命令 | 说明 |
---|---|
ZREM ZSET VALUE | 删除 VALUE 对应的数据 |
ZREMRANGEBYRANK ZSET START END | 删除 ZSET 中 START-END 名 (排名从 0 开始) |
使用示例
ZREM ZSET VALUE
删除 VALUE 对应的数据
centos7-server:0>zrem zset a
"1"
centos7-server:0>zrange zset 0 -1 withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "c"
6) "3"
7) "f"
8) "6"
ZREMRANGEBYSCORE ZSET MIN MAX
删除 ZSET 中 score 为 2-2 之间的数据
centos7-server:0>zrange zset 0 -1 withscores
1) "b"
2) "2"
3) "d"
4) "2"
5) "c"
6) "3"
7) "f"
8) "6"
###### 删除 score 为 2-2 之间的数据
centos7-server:0>zremrangebyscore zset 2 2
"2"
centos7-server:0>zrange zset 0 -1 withscores
1) "c"
2) "3"
3) "f"
4) "6"
ZREMRANGEBYRANK ZSET START END
删除 ZSET 中 3-4 名 (排名从 0 开始)
centos7-server:0>zrange zset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"
11) "f"
12) "6"
###### 删除 3-4 名 (排名从 0 开始)
centos7-server:0>zremrangebyrank zset 2 3
"2"
centos7-server:0>zrange zset 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "e"
6) "5"
7) "f"
8) "6"
运算命令
命令 | 说明 |
---|---|
ZINCRBY ZSET INCREMENT MEMBER | 将 ZSET 中 MEMBER 的score +INCREMENT |
ZINTERSTORE NEW_ZSET ZSET_COUNT ZSET ZSET1 | 求 ZSET 和 ZSET1 的交集,并将其存储到 NEW_ZSET 中 |
ZUNIONSTORE NEW_ZSET ZSET_COUNT ZSET ZSET1 | 求 ZSET 和 ZSET1 的并集,并将其存储到 NEW_ZSET 中 |
使用示例
ZINCRBY ZSET INCREMENT MEMBER
将 ZSET 中 MEMBER 的score +INCREMENT
centos7-server:0>zscore zset a
"1"
######### a-> score+1
centos7-server:0>zincrby zset 1 a
"2"
centos7-server:0>zscore zset a
"2"
ZINTERSTORE NEW_ZSET ZSET_COUNT ZSET ZSET1
求 ZSET 和 ZSET1 的交集,并将其存储到 NEW_ZSET 中
首先创建 第二个 ZSET1
centos7-server:0>zadd zset1 6 e 7 f 8 g
"3"
查看 ZSET
centos7-server:0>zrange zset 0 -1 withscores
1) "a"
2) "2"
3) "b"
4) "2"
5) "e"
6) "5"
7) "f"
8) "6"
求两个 zset 中 value 的交集,并存储在 ZSET2 中,value 对应的 score 会进行相加
centos7-server:0>zinterstore zset2 2 zset zset1
"2"
centos7-server:0>zrange zset2 0 -1 withscores
1) "e"
2) "11"
3) "f"
4) "13"
ZUNIONSTORE NEW_ZSET ZSET_COUNT ZSET ZSET1
求 ZSET 和 ZSET1 的并集,并将其存储到 NEW_ZSET 中
查看 zset
centos7-server:0>zrange zset 0 -1 withscores
1) "a"
2) "2"
3) "b"
4) "2"
5) "e"
6) "5"
7) "f"
8) "6"
查看 zset1
centos7-server:0>zrange zset1 0 -1 withscores
1) "e"
2) "6"
3) "f"
4) "7"
5) "g"
6) "8"
求 zset 和 zset1 的 value 的并集,并存储在 zset3 中,相交的 value 的 score 部分会进行相加
centos7-server:0>zunionstore zset3 2 zset zset1
"5"
centos7-server:0>zrange zset3 0 -1 withscores
1) "a"
2) "2"
3) "b"
4) "2"
5) "g"
6) "8"
7) "e"
8) "11"
9) "f"
10) "13"
###### 可以看到 e 和 f 变成了 5+6=11 6+7=13
5、Hash
Redis 中哈希结构就如同 Java的 map 一样,一个对象里面有许多键值对,它是特别适合存储对象的,如果内存足够大,那么一个 Redis 的 hash 结构可以存储 2 的 32 次方减 1 个键值对(40 多亿)。
当然,键值是不能重复的
基本命令
命令 | 说明 |
---|---|
HGETALL MAP | 获取 MAP 中所有键值对 |
HVALS MAP | 获取 MAP 中所有的值 |
HSET MAP K V | 在 MAP 中设置键值对 |
HMSET MAP K1 V1 K2 V2 | 在 MAP 中设置多个键值对 |
HGET MAP K | 获取 MAP 中键为 K 的值 |
HMGET MAP K1 K2 | 获取 MAP 中键为 K1,K2... 的值 |
HEXISTS MAP K | 判断 MAP 中是否有 K |
HKEYS MAP | 查看 MAP 中的所有 K |
HLEN MAP | 查看 MAP 中键值对的数量 |
HSETNX MAP K V | 如果存在键值对,就失败;没有就添加 |
HDEL MAP K1 K2 | 删除 MAP 中 K1 K2 的键值对,返回删除条数 |
使用示例
HSET MAP K V
在 HASH 中设置键值对
centos7-server:0>hset map a 1
"1"
centos7-server:0>hset map b 2
"1"
centos7-server:0>hset map c 3
"1"
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
HGETALL MAP
获取 MAP 中所有键值对
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
HVALS MAP
获取 MAP 中所有的值
centos7-server:0>hvals map
1) "1"
2) "2"
3) "3"
HMSET MAP K1 V1 K2 V2 ...
在 HASH 中设置多个键值对
centos7-server:0>hmset map d 4 e 5 f 6
"OK"
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"
11) "f"
12) "6"
HGET MAP K
获取 HASH 中键为 K 的值
centos7-server:0>hget map a
"1"
HMGET MAP K1 K2 ...
获取 HASH 中键为 K1,K2... 的值
centos7-server:0>hmget map a b
1) "1"
2) "2"
HEXISTS MAP K
判断 MAP 中是否有 K
centos7-server:0>hexists map a
"1"
HKEYS MAP
查看 MAP 中的所有 K
centos7-server:0>hkeys map
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
HLEN MAP
查看 MAP 中键值对的数量
centos7-server:0>hlen map
"6"
HSETNX MAP K V
如果存在键值对,就失败;没有就添加
centos7-server:0>hsetnx map g 7
"1"
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"
11) "f"
12) "6"
13) "g"
14) "7"
######## 失败的情况 ###########
centos7-server:0>hsetnx map g 8
"0"
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"
11) "f"
12) "6"
13) "g"
14) "7"
HDEL MAP K1 K2
删除 MAP 中 K1 K2 的键值对,返回删除条数
centos7-server:0>hdel map b c
"2"
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "d"
4) "4"
5) "e"
6) "5"
7) "f"
8) "6"
9) "g"
10) "7"
运算命令
命令 | 说明 |
---|---|
HINCRBY MAP K INCREMENT | 给 MAP 中指定的 K 的值 +INCREMENT ,要求是整数 |
HINCRBYFLOAT MAP K INCREMENT | 给 MAP 中指定的 K 的值 +INCREMENT ,要求是整数或浮点数 |
使用示例
首先查看 MAP 中数据
centos7-server:0>hgetall map
1) "a"
2) "1"
3) "d"
4) "4"
5) "e"
6) "5"
7) "f"
8) "6"
9) "g"
10) "7"
HINCRBY MAP K INCREMENT
给 MAP 中指定的 K 的值 +INCREMENT ,要求是整数
centos7-server:0>hINCRBY map a 1
"2"
centos7-server:0>hget map a
"2"
############### +负数 -1
centos7-server:0>hINCRBY map a -1
"1"
centos7-server:0>hget map a
"1"
HINCRBYFLOAT MAP K INCREMENT
给 MAP 中指定的 K 的值 +INCREMENT ,要求是整数或浮点数
centos7-server:0>hINCRBYFLOAT map a 0.1
"1.1"
centos7-server:0>hget map a
"1.1"
################ +负数 -0.1
centos7-server:0>hINCRBYFLOAT map a -0.1
"1"
centos7-server:0>hget map a
"1"
使用场景
-
存储对象(经常变更的数据)
[持续更新中.....]