Redis 五大数据类型(String、List、Hash、Set 及 Sorted Set)

文章目录


一、String 数据类型

1.概述

  • String 是 redis 最基本的类型
  • 最大能存储 512MB 的数据
  • String 类型是二进制安全的
  • 可以存储任何数据(比如数字、图片、序列化对象等)

2.命令示例

2.1 EXISTE、APPEND、GET、SET、STRLEN

[root@localhost ~]# redis-cli               #执行Redis客户端工具
127.0.0.1:6379> EXISTS mykey                #判断该键是否存在,存在返回1,否则返回0
(integer) 0
127.0.0.1:6379> APPEND mykey "hello"        #若该键并不存在,则创建key,存在则将内容追加,append命令返回当前Value的长度
(integer) 5
127.0.0.1:6379> APPEND mykey " world"
(integer) 11
127.0.0.1:6379> GET mykey                   #通过get命令获取该键,以判断append的结果
"hello world"
127.0.0.1:6379> SET mykey "this is mykey"   #通过set命令为键设置新值,并覆盖原有值,若为字符串需要加双引号或单引号
OK
127.0.0.1:6379> GET mykey
"this is mykey"
127.0.0.1:6379> STRLEN mykey                #获取指定Key的字符长度,等效于C库中strlen函数
(integer) 13

2.2 INCR、DECR、DEL、INCRBY、DECRBY

127.0.0.1:6379> SET mykey 10                #设置Key的值为20
OK
127.0.0.1:6379> INCR mykey                  #该Key的值递增1
(integer) 11
127.0.0.1:6379> DECR mykey                  #该Key的值递减1
(integer) 10
127.0.0.1:6379> DEL mykey                   #删除已有键
(integer) 1
127.0.0.1:6379> DECR mykey                  #对空值执行递减操作,其原值被设定为0,递减后的值为-1
(integer) -1
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> INCR mykey                  #对空值执行递增操作,其原值被设定为0,递增后的值为1
(integer) 1
127.0.0.1:6379> SET mykey hello             ##将该键的Value设置后,将不能转换为整型的普通字符串
OK
127.0.0.1:6379> INCR mykey
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET mykey 10
127.0.0.1:6379> INCRBY mykey 10             #指定增加的整数
(integer) 20
127.0.0.1:6379> DECRBY mykey 10             #指定减少的整数
(integer) 10
127.0.0.1:6379> GET mykey
"10"

2.3 GETSET、SETEX、TTL、SETNX

127.0.0.1:6379> INCR mycounter                  #将计数器的值原子性的递增1
(integer) 1
127.0.0.1:6379> GETSET mycounter 0              #在设置新值得同时,并返回原有值,这两个操作原子性的同时完成
"1"
127.0.0.1:6379> GET mycounter
"0"
127.0.0.1:6379> SETEX mykey 10 "hello world!"   #设置指定Key的过期时间为10秒
OK
127.0.0.1:6379> TTL mykey                       #通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1(-2)表示永不过期
(integer) 8
127.0.0.1:6379> GET mykey                       #在该键的存活期内我们仍然可以获取到它的Value
"hello world!"
127.0.0.1:6379> TTL mykey                       #该ttl命令的返回值显示,该Key已经过期
(integer) -2
127.0.0.1:6379> GET mykey
(nil)
127.0.0.1:6379> DEL mykey                       #删除该键,以便于下面的测试验证
(integer) 1
127.0.0.1:6379> SETNX mykey "hello"             #该键并不存在,因此该命令执行成功,存在则不执行命令
(integer) 1
127.0.0.1:6379> SETNX mykey "world"             #该键已经存在,因此本次设置没有产生任何效果
(integer) 0
127.0.0.1:6379> GET mykey                       #从结果可以确认,返回的值仍为第一次设置的值
"hello"

2.4 SETRANGE、GETRANGE

127.0.0.1:6379> SET mykey "hello world"         #设定初始值
OK
127.0.0.1:6379> SETRANGE mykey 6 dd             #从第六个字节开始替换2个字节(dd只有2个字节)
(integer) 11
127.0.0.1:6379> GET mykey                       #查看替换后的值
"hello ddrld"
127.0.0.1:6379> SETRANGE mykey 20 dd            #offset已经超过该Key原有值的长度了,该命令将会在末尾补0
(integer) 22
127.0.0.1:6379> GET mykey                       #查看补0后替换的结果
"hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd"
127.0.0.1:6379> del mykey                       #删除该Key
(integer) 1
127.0.0.1:6379> SETRANGE mykey 2 dd             #替换空值
(integer) 4
127.0.0.1:6379> GET mykey                       #查看替换空值后的结果
"\x00\x00dd"
127.0.0.1:6379> SET mykey "0123456789"          #设置新值
OK
127.0.0.1:6379> GETRANGE mykey 1 2              #截取该键的Value,从第一个字节开始,到第二个字节结束
"12"
127.0.0.1:6379> GETRANGE mykey 1 20             #20已经超过Value的总长度,因此将截取第一个字节后面的所有字节
"123456789"

2.5 MSET、MGET、MSETNX

127.0.0.1:6379> MSET key1 "hello" key2 "world"      #批量设置了key1和key2两个键,如果有旧值会被新值覆盖
OK
127.0.0.1:6379> MGET key1 key2                      #批量获取了key1和key2两个键的值
1) "hello"
2) "world"
127.0.0.1:6379> MSETNX key2 "hello" key3 "world"    #批量设置了key2和key3两个键,但是key2已经存在,所以该命令执行失败并返回0
(integer) 0
127.0.0.1:6379> MGET key2 key3                      #批量获取key2和key3,由于key3没有设置成功,所以返回nil
1) "world"
2) (nil)

二、List 数据类型

1.概述

  • 列表的元素类型为 String
  • 按照插入顺序排序
  • 在列表的头部或尾部添加元素

2.命令示例

2.1 LPUSH、LPUSHX、LRANGE、LPOP/LIEN

127.0.0.1:6379> LPUSH cloud a b c d     #创建该键及与其关联的List,之后在将参数中的values从左到右依次插入到表头
(integer) 4
127.0.0.1:6379> LRANGE cloud 0 -1       返回列表中指定区间内的元素,0表示第一个元素,1表示第二个元素,-1表示最后一个元素
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> LPUSHX cloud e          #仅当key存在时,将value值插入表头
(integer) 5
127.0.0.1:6379> LRANGE cloud 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> LPOP cloud              #移除并返回第一个元素,从头开始
"e"
127.0.0.1:6379> LPOP cloud
"d"
127.0.0.1:6379> LPOP cloud
"c"
127.0.0.1:6379> LLEN cloud              #查看列表中元素个数
(integer) 2
127.0.0.1:6379> LRANGE cloud 0 -1       #查看列表中的所有元素
1) "b"
2) "a"

2.2 LREM、LSET、LINDEX、LTRIM

127.0.0.1:6379> DEL cloud
(integer) 1
127.0.0.1:6379> LPUSH cloud a b c d b a     #该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入到表头
(integer) 6
127.0.0.1:6379> LRANGE cloud 0 -1           #返回列表中指定区间内的元素
1) "a"
2) "b"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> LREM cloud 2 b              #从头部(left)向尾部(right)变量链表,删除2个值等于b的元素,返回值为实际删除的数量
(integer) 2
127.0.0.1:6379> LRANGE cloud 0 -1
1) "a"
2) "d"
3) "c"
4) "a"
127.0.0.1:6379> LSET cloud 1 b              #将索引值为1的元素值设置为新值b
OK
127.0.0.1:6379> LRANGE cloud 0 -1
1) "a"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379> LINDEX cloud 1              #获取索引值为1的元素值
"b"
127.0.0.1:6379> LTRIM cloud 0 2             #仅保留索引值0到2的元素
OK
127.0.0.1:6379> LRANGE cloud 0 -1
1) "a"
2) "b"
3) "c"

2.4 LINSERT

127.0.0.1:6379> DEL could
(integer) 1
127.0.0.1:6379> LPUSH could a b c d e
(integer) 5
127.0.0.1:6379> LRANGE could 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> LINSERT could before a 0        #在元素a之前插入新元素0
(integer) 6
127.0.0.1:6379> LINSERT could after e 1         #在元素e之后插入新元素1
(integer) 7
127.0.0.1:6379> LRANGE could 0 -1
1) "e"
2) "1"
3) "d"
4) "c"
5) "b"
6) "0"
7) "a"

2.5 RPUSH、RPUSHX

127.0.0.1:6379> del key1 key2
(integer) 0
127.0.0.1:6379> RPUSH key1 a b c d e    #将值从左往右依次插入到表尾
(integer) 5
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> RPUSH key1 f
(integer) 6
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> RPUSHX key2 f           #指定键存在时执行,否则不执行
(integer) 0
127.0.0.1:6379> KEYS key?
1) "key1"

2.6 RPOP、RPOPLPUSH

127.0.0.1:6379> RPOP key1               #移除并返回键的第一个元素,从尾开始
"f"
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> RPOPLPUSH key1 key2     #将键1尾部元素xxx弹出,同时再插入到键2的头部(原子性的完成这两步操作)
"e"
127.0.0.1:6379> KEYS key?               #可以看到有key2了
1) "key2"
2) "key1"
127.0.0.1:6379> LRANGE key2 0 -1
1) "e"
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> RPOPLPUSH key1 key1
"d"
127.0.0.1:6379> LRANGE key1 0 -1
1) "d"
2) "a"
3) "b"
4) "c"

三、Hash 数据类型(散列类型)

1.概述

  • Hash 用于存储对象
  • 可以采用这样的命名方式:对象类别和 ID 构成键名,使用字段表示对象的属性,而字段值则存储属性值
    Redis 五大数据类型(String、List、Hash、Set 及 Sorted Set)
  • 如果 Hash 中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间
  • 每一个 Hash 可以存储大约 42 亿个键值对

2.命令示例

2.1 HEST、HGET、HDEL、HEXISTS

127.0.0.1:6379> HSET hash field1 a field2 b field3 c    #给hash键创建三个字段及对应字段值
(integer) 3
127.0.0.1:6379> HGET hash field1                        #获取hash键,字段为field1的值
"a"
127.0.0.1:6379> HDEL hash field2                        #删除hash键,字段为field2的值,成功返回1
(integer) 1
127.0.0.1:6379> HEXISTS hash field2                     #盘点hash键中字段为field2的值是否存在,存在返回1
(integer) 0

2.2 HLEN/HSETNX、HINCRBY

127.0.0.1:6379> HLEN hash                           #获取hash键的字段数量
(integer) 2
127.0.0.1:6379> HSETNX hash1 field3 z               #给hash1键添加新字段field3,值为z,是否执行基于此字段是否存在,不管键是否存在,返回1表示执行成功
(integer) 1
127.0.0.1:6379> KEYS hash*                          #添加新数据后,hash1键存在了
1) "hash1"
2) "hash"
127.0.0.1:6379> HSETNX hash field3 d                #此字段不存在,所以执行吗不成功        
(integer) 0
127.0.0.1:6379> HINCRBY hash3 field1 1              #给hash3键的field1字段值加1
(integer) 1
127.0.0.1:6379> HGET hash3 field1                   #确认值为1
"1"
127.0.0.1:6379> HINCRBY hash3 field1 -10            #字段值减10
(integer) -9
127.0.0.1:6379> HGET hash3 fiel                     #1-10=-9
d1
"-9"

2.3 HGETALL、HKEYS、HVALS、HVALS、HMGET、HMSET

127.0.0.1:6379> HGETALL hash1           #返回hash1键的所有字段及其值,是逐对列出的
1) "field3"
2) "z"
127.0.0.1:6379> HGETALL hash3
1) "field1"
2) "-9"
127.0.0.1:6379> HKEYS hash1             #仅获取hash1键中所有字段名
1) "field3"
127.0.0.1:6379> HKEYS hash3
1) "field1"
127.0.0.1:6379> HVALS hash1             #仅获取hash1键中所有字段值
1) "z"
127.0.0.1:6379> HVALS hash3
1) "-9"

四、Set 数据类型(无序集合)

1.概述

  • 无序集合,元素类型为 String 类型
  • 元素具有唯一性,不允许存在重复的成员
  • 多个集合类型之间可以进行并集、交集和差集运算

2.应用范围

  • 可以使用 Redis 的 Set 数据类型跟踪一些唯一性数据
    • 比如访问某一博客的唯一 IP 地址信息
    • 对于此场景,我们仅需在每次访问该博客时将访问者的 IP 存入 Redis 中,Set 数据类型会自动保证 IP 地址的唯一性
  • 充分利用 Set 类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系
    • 比如所有购买某一电子设备的客户 ID 被存储在一个指定的 Set 中,而购买另外一种电子产品的客户 ID 被存储在另外一个 Set 中
    • 如果此时我们想获取有哪些客户同时购买了这两种商品时,Set 的 intersections 命令就可以充分发挥它的方便和效率的优势了

3.命令示例

3.1 SADD、SMEMBERS、SCARD、SISMEMBER

127.0.0.1:6379> SADD myset a b c d e        #将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略,假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合
(integer) 5
127.0.0.1:6379> SMEMBERS myset              #查看插入的结果,输出的顺序与插入顺序无关
1) "b"
2) "a"
3) "d"
4) "c"
5) "e"
127.0.0.1:6379> SCARD myset                 #获取集合中成员的数量
(integer) 5
127.0.0.1:6379> SISMEMBER myset d           #判断键中成员是否存在,返回0表示不存在,1表示存在
(integer) 1
127.0.0.1:6379> SISMEMBER myset f
(integer) 0

3.2 SPOP、SREM、SRANDMEMBER、SMOVE

127.0.0.1:6379> SPOP myset                  #随机的移除并返回键中的某一成员
"a"
127.0.0.1:6379> SMEMBERS myset              #查看结果,输出的顺序与插入顺序无关
1) "b"
2) "c"
3) "e"
4) "d"
127.0.0.1:6379> SPOP myset
"e"
127.0.0.1:6379> SMEMBERS myset
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> SREM myset a b e            #从键中移出a/b/e,并返回移除成员个数,a/e刚已被移除了,所以返回1
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "c"
2) "d"
127.0.0.1:6379> SRANDMEMBER myset           #该命令随机的返回某一成员
"c"
127.0.0.1:6379> SRANDMEMBER myset
"c"
127.0.0.1:6379> SRANDMEMBER myset
"d"
127.0.0.1:6379> SMOVE myset myset1 c        将键myset的c成员移到键myset1,成功返回1,失败返回0
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "d"
127.0.0.1:6379> SMEMBERS myset1
1) "c"

五、Sorted Set 数据类型(Zset、有序集合)

1.概述

  • a,有序集合,元素类型为 Sting,元素具有唯一性,不能重复
  • b,每个元素都会关联一个 double 类型的分数 score(表示权重),可以通过权重的大小排序,元素的 score 可以相同

2.应用范围

  • 可以用于一个大型在线游戏的积分排行榜
    • 每当玩家的分数发生变化时,可以执行 ZADD 命令更新玩家的分数,此后再通过 ZRANGE 命令获取积分 TOP10 的用户信息
    • 每当玩家的分数发生变化时,可以执行ZADD命令更新玩家的分数,此后再通过ZRANGE命令获取积分TOP10的用户信息

3.命令示例

3.1 ZADD、ZRANK、ZCARD、ZRANK、ZCOUNT

127.0.0.1:6379> ZADD zset 1 a 2 b 3 c 4 d 5 e       #将一个或多个成员元素及其分数值加入到有序集当中
(integer) 5
127.0.0.1:6379> ZRANGE zset 0 -1                    #查看成员
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> 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"
127.0.0.1:6379> ZCARD zset                          #获取键中成员的数量
(integer) 5
127.0.0.1:6379> ZRANK zset e                        #获取成员的位置索引值
(integer) 4
127.0.0.1:6379> ZRANK zset a
(integer) 0
127.0.0.1:6379> ZCOUNT zset 2 4                     #分数满足表达式[x <= score <= x]的成员的数量
(integer) 3

3.2 ZREM、ZSCOREZINCRBY

127.0.0.1:6379> ZREM zset a b                       #删除成员,返回实际删除成员的数量
(integer) 2
127.0.0.1:6379> ZSCORE zset d                       #获取成员的分数
"4"
127.0.0.1:6379> ZINCRBY zset 2 a                    #若成员不存在,则zincrby命令将添加该成员分数为2(并假设其初始分数为0)
"2"
127.0.0.1:6379> ZINCRBY zset -1 a
"1"
127.0.0.1:6379> ZRANGE zset 0 -1 withscores         #a=2-1=1
1) "a"
2) "1"
3) "c"
4) "3"
5) "d"
6) "4"
7) "e"
8) "5"

3.3 ZRANGEBYSCORE、ZREMRRANGEBYSCORE、ZREMRANGEBYRANK

127.0.0.1:6379> DEL zset
(integer) 1
127.0.0.1:6379> ZADD zset 1 a 2 b 3 c 4 d 5 e               #将一个或多个成员元素及其分数值加入到有序集当中
(integer) 5
127.0.0.1:6379> ZRANGEBYSCORE zset 2 4                      #获取分数满足表达式[x <= score <= x]的成员,即 2 3 4
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf limit 2 3      #-inf和+inf表示第一个和最后一个成员,limit 2 3表示索引为2开始的三个成员(a0、b1、c2、d3、e4,即c、d、e)
1) "c"
2) "d"
3) "e"
127.0.0.1:6379> ZREMRANGEBYSCORE zset 1 3                   #删除分数满足表达式[x <= score <= x]的成员,并返回实际删除的数量
(integer) 3
127.0.0.1:6379> ZRANGE zset 0 -1                            #查看,确认结果
1) "d"
2) "e"
127.0.0.1:6379> ZREMRANGEBYRANK zset 1 2                    #删除位置索引满足表达式[x <= rank <= x]的成员,即(0d、1e,删除1和2索引值,结果只删了1e)
(integer) 1
127.0.0.1:6379> ZRANGE zset 0 -1                            #查看,确认结果,仅剩d
1) "d"

3.3 ZREVRANGE、ZREVRANGEBYSCORE、ZREVRANK

127.0.0.1:6379> DEL zset
(integer) 0
127.0.0.1:6379> ZADD zset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> ZRANGE zset 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ZREVRANGE zset 0 -1                         #以位置索引从高到低的方式获取并返回此区间内的成员
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> ZREVRANK zset a                             #获取成员索引,该用法是是反向索引排序
(integer) 4
127.0.0.1:6379> ZREVRANK zset e
(integer) 0
127.0.0.1:6379> ZRANK zset a                                #正向为0
(integer) 0
127.0.0.1:6379> ZRANK zset e
(integer) 4
127.0.0.1:6379> ZREVRANGEBYSCORE zset 5 3                   #获取分数满足表达式[x >= score >= x]的成员,并以从高到底的顺序输出
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> ZREVRANGEBYSCORE zset 3 1 limit 1 2         #分数1-3,且索引为1-2的成员
1) "b"
2) "a"
上一篇:Redis windows环境下的主从复制


下一篇:使用frp进行内网穿透