Redis-基本数据类型

最近我问了很多小伙伴,他们对 Redis(远程字典服务) 大多数还是停留在String 类型上的使用【80%,还是有点可怕】

Redis 设计出了其他类型的数据类型,一定是有他的道理和使用场景的,大家还是多去了解一下其他的数据类型的使用和场景。

不要做一个简单的 API 工程师。

好了,废话少说,开始正文。请跟着 示例 亲自敲代码!不然一会就忘了。。

 

 

Redis 5种 基本数据类型

序号类型存储的值说明
1字符串(STRING)可以是保存字符串、整数和浮点数可以对字符串进行操作,比如增加字符串或者求字串;如果是整数或者是浮点数,可以实现计算,比如自增等
2列表(LIST)他是一个链表,他的每一个节点都包含一个字符串Redis 支持从连边的两端插入或着弹出节点,或着通过偏移对他进行建材,还可以读取一个或多个节点,根据条件删除或着查找结点等
3集合(SET)他是一个收集器,但是是无序的,在他的每个元素都是一个字符串,而且是独一无二的,各不相同的可以新增、读取、删除单个元素;检测一个元素是否在集合中;计算它和其他集合的交集、并集和差集等;随即从集合中读取元素
4哈希散列表(HASH)类似于Java的 HashMap ,是一个键值对应的无序列表可以增、删、改、查单个键值对,也可以获取所有的键值对
5有序集合(ZSET)是一个有序的集合,可以包含字符串、证书、浮点数、分值(score),元素的排序是根据分值的大小来决定的可以增、删、改、查元素,根据分值的范围或着成员来获取对应的元素

 

是否开启缓存的因素

我们通常是将Redis 作为缓存在使用,是因为我们知道缓存能降低 IO 的高消耗,提高系统的效率。

但是不是什么都需要进行缓存的:体积过大的数据(图片、视频) 、 用的很少的数据 等,这些并不是很需要缓存

首先我们要了解,缓存是在内存上运行的,而内存也是很昂贵的!!在你准备做缓存之前一定要思考,那些数据是有需要的,再开启缓存

思考因素

  1. 缓存的数据的命中率,如果命中率不必做成缓存。

  2. 业务的类型:读多写少就要使用缓存

  3. 业务数据的大小,如果存储内容过大,就不用缓存

 

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

 

使用场景

  1. 计数器

  2. 统计多单位的数量

  3. 粉丝数

  4. 对象缓存存储

 

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 就会对对应的链表加锁,加锁的结果就是其他的进程不能再读取或者写入该链表,只能等待命令结束。加锁的好处可以保证在多线程并发环境中数据的一致性,保证一些重要数据的一致性,比如账户的金额、商品的数量。

 

使用场景

  1. 作为栈使用
  2. 作为队列使用(消息队列等)

 

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"

 

使用场景

  1. 类似于 QQ 中共同好友、共同群聊等

  2. 微薄的共同关注等

  3. 随机获取元素

 

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"

 

使用场景

  1. 存储对象(经常变更的数据)

 

[持续更新中.....]

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值