Redis的五种基本数据类型:String、List 、Hash、Set 、Zset (Sorted Set)

① String (字符串)

在redis 中所有的key都是字符串,对象要序列化才能存储,对象序列化后就是字符串。不同的 key 对应的 value 则具备不用的数据结构。五种基本数据类型,其实是指 value 的数据类型不同。Redis 中的字符串是动态字符串,内部是可以修改的,类似于 Java 中的 StringBuffer,它采用分配冗余空间的方式来减少内存的频繁分配。

在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符串小于 1M 时,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 的空间,最大是 512M。( 能存的字符串最大为512M )

应用场景

  • 可替换 memcached ,存储简单k-v 键值对
  • 计数器功能:如视频播放次数,点赞次数,访问次数等。
  • 缓存:将数据以字符串方式存储
  • 分布式锁(秒杀系统有应用)
  • 数据共享的功能,redis作为单独的应用软件用来存储一些共享数据供多个实例访问,存储热点数据

常用的字符串操作命令

  • set <key> <value> set 就是给一个 key 赋值
127.0.0.1:6379> set k3 100
OK
  • append <key> <value> 如果 key 已经存在,则直接在对应的 value 后面追加值,否则就创建新的键值对。
127.0.0.1:6379> append k1 jaylee
(integer) 6
127.0.0.1:6379> append k1 .com
(integer) 11
  • get <key> 获取 key 的 value
127.0.0.1:6379> get k1
"jaylee.com"
  • decr <key> 可以实现对 value 的减1 操作(前提 value 是个数字),如果 value 不是数字,就会报错,如果 value 不存在,则会给一个默认值为 0 ,在默认值的基础上减1
127.0.0.1:6379> decr k2
(integer) -1
127.0.0.1:6379> decr k2
(integer) -2
  • decrby <key> <decrement> 类似于 decr ,可以设置步长。 decrement参数是步长
127.0.0.1:6379> get k3
"94"
127.0.0.1:6379> decrby k3 5
(integer) 89
  • getrange <key> <start> <end> 可以用来返回 key 对应的 value 的子串,类似于 Java 中的 subString
    end 是 -1 表示最后一个字符,-2表示倒数第二个字符
127.0.0.1:6379> set k4 "hello world"
OK
127.0.0.1:6379> getrange k4 0 4
"hello"
127.0.0.1:6379> getrange k4 0 -1
"hello world"
127.0.0.1:6379> getrange k4 0 -2
"hello worl"
  • setrange <key> <offset> <value> 覆盖一个已经存在的 key 的 value 中的字符
    offset 偏移量若超过长度,会用0补齐
    offset 偏移量若等于字符串长度,相当于追加
127.0.0.1:6379> get k6
"good"
127.0.0.1:6379> setrange k6 0 55
(integer) 4
127.0.0.1:6379> get k6
"55od"
127.0.0.1:6379> setrange k6 2 6
(integer) 4
127.0.0.1:6379> get k6
"556d"
127.0.0.1:6379> setrange k6 6 MMM
(integer) 9
127.0.0.1:6379> get k6
"556d\x00\x00MMM"
  • getset <key> <value> 获取并更新某一个 key
127.0.0.1:6379> get k3
"89"
127.0.0.1:6379> getset k3 100
"89"
127.0.0.1:6379> get k3
"100"
  • incr <key> 给某一个 key 的 value 自增,如果 value 不是数字,就会报错,如果 value 不存在,则会给一个默认值为 0 ,在默认值的基础上加1
127.0.0.1:6379> incr k5
(integer) 1
  • incrby <key> <increment> 类似于 incr ,可以设置步长。 increment参数是步长
127.0.0.1:6379> incrby k5 100
(integer) 101
  • incrbyfloat <key> <increment> 类似于 incrby ,自增步长可以设置浮点数
127.0.0.1:6379> incrby k5 0.5
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrbyfloat k5 0.5
"101.5"
  • mset <key> <value> [ <key> <value> ...] 批量存储键值对
127.0.0.1:6379> mset k6 nice k7 vue k8 100
OK
  • mget <key> [ <key> ... ] 批量获取键值对
127.0.0.1:6379> mget k1 k2 k3 k4 k5 k6 k7 k8
1) "jaylee.comm"
2) "-2"
3) "100"
4) "hello world"
5) "101.5"
6) "nice"
7) "vue"
8) "100"
  • ttl <key> 查看 key 的有效期 ,-1 表示 key 永远不过期
127.0.0.1:6379> ttl k1
(integer) -1
  • setex <key> <seconds> <value> 给 key 设置 value 的同时,设置过期时间。 ttl 返回 -2 表示key已经过期
    seconds 秒数
127.0.0.1:6379> setex k8 10 50
OK
127.0.0.1:6379> ttl k8
(integer) -2
127.0.0.1:6379> get k8
(nil)
  • psetex <key> <milliseconds> <value> 类似于 setex , 但时间单位是毫秒milliseconds
127.0.0.1:6379> psetex k8 10000 nice
OK
127.0.0.1:6379> get k8
"nice"
127.0.0.1:6379> ttl k8
(integer) 4
127.0.0.1:6379> ttl k8
(integer) -2
127.0.0.1:6379> get k8
(nil)
  • setnx <key> <value> set if not exist 的简写,默认情况下,set 命令会覆盖已经存在的key,setnx 则不会
    key 不存在则修改, 存在则不修改
127.0.0.1:6379> get k6
"nice"
127.0.0.1:6379> set k6 good
OK
127.0.0.1:6379> get k6
"good"
127.0.0.1:6379> setnx k6 perfect
(integer) 0
127.0.0.1:6379> get k6
"good"
127.0.0.1:6379> setnx k8 666
(integer) 1
127.0.0.1:6379> get k8
"666"
  • msetnx <key> <value> [<key> <value> ...] 批量设置,若其中一个 key 存在,整个操作都会失败
127.0.0.1:6379> get k8
(nil)
127.0.0.1:6379> get k7
"vue"
127.0.0.1:6379> msetnx k7 nice k8 666
(integer) 0
127.0.0.1:6379> get k7
"vue"
127.0.0.1:6379> get k8
(nil)
  • strlen <key> 查看字符串总长度
127.0.0.1:6379> strlen k6
(integer) 9

② List (列表)

使用场景

  • 使用redis做消息队列,lpush + brpop或rpop命令,实现先进先出,如果消费失败客户端把key再放回,消费成功直接remove掉
  • lpush + lpop 栈
    lpush + rpop 队列
    lpush + ltrim = 有限集合
    lpush + brpop = 消息队列

常用的列表操作命令

  • lpush <key> <value> [<value> ...] 将 value 的值从左到右依次插入表头位置,类似于栈,先放的反而在栈底
127.0.0.1:6379> lpush k1 nice good perfect
(integer) 3
  • lrange <key> <start> <stop> 返回列表指定区间内的元素
127.0.0.1:6379> lrange k1 0 1
1) "perfect"
2) "good"
  • rpush <key> <value> [<value> ...] 和 lpush 类似,不同的是 rpush 是从右往左依次插入表头位置。
127.0.0.1:6379> rpush k2 nice good perfect
(integer) 3
127.0.0.1:6379> lrange k2 0 1
1) "nice"
2) "good"
  • rpop <key> 移除并返回列表的尾元素
127.0.0.1:6379> rpop k2
"perfect"
127.0.0.1:6379> rpop k2
"good"
127.0.0.1:6379> rpop k2
"nice"
127.0.0.1:6379> rpop k2
(nil)
  • lpop <key> 移除并返回列表的头元素
127.0.0.1:6379> lpush k1 nice good perfect
(integer) 3
127.0.0.1:6379> lpop k1
"perfect"
127.0.0.1:6379> lpop k1
"good"
127.0.0.1:6379> lpop k1
"nice"
127.0.0.1:6379> lpop k1
(nil)
  • lindex <key> <index> 返回列表中,下表为 index 的元素
127.0.0.1:6379> lpush k1 nice good perfect
(integer) 3
127.0.0.1:6379> lindex k1 2
"nice"
127.0.0.1:6379> lindex k1 0
"perfect"
  • ltrim <key> <start> <stop> 可以对列表进行修剪
127.0.0.1:6379> lpush k1 nice good perfect
(integer) 3
127.0.0.1:6379> ltrim k1 0 1
OK
127.0.0.1:6379> lrange k1 0 -1
1) "perfect"
2) "good"
  • blpop <key> [<key> ...] <timeout> 阻塞式的弹出,相当 lpop 的阻塞版 timeout 超时时长
    如果 timeout (s) 时间后,key 内没有值,命令自动结束
127.0.0.1:6379> blpop k1 60
1) "k1"
2) "perfect"
127.0.0.1:6379> blpop k1 60
1) "k1"
2) "good"
127.0.0.1:6379> blpop k1 60
# 如果60秒内 k1 内没值,该命令自动结束
# -------------------------------
# 新建窗口 给 k1 存储值
[root@sinohut ~]# redis-cli
127.0.0.1:6379> lpush k1 666
(integer) 1
# -------------------------------
127.0.0.1:6379> blpop k1 60
1) "k1"
2) "666"
(45.83s)
# 此时阻塞时长为 45.83s
127.0.0.1:6379> blpop k1 5
1) "k1"
2) "666"
127.0.0.1:6379> blpop k1 5
(nil)
(5.05s)
# 5s 内 k1 没有值,命令自动结束

③ Hash (哈希)

在 hash 结构中, key 是一个字符串,value 是一个 key-value 键值对
应用场景

  • 假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。

常用的哈希操作命令

  • hset <key> <field> <value> 添加值
127.0.0.1:6379> hset k1 name lee
(integer) 1
127.0.0.1:6379> hset k1 age 105
(integer) 1
127.0.0.1:6379> hset k1 gender man
(integer) 1
  • hget <key> <field> 获取值
127.0.0.1:6379> hget k1
# 注意:hget 命令要指定 value 中的 key ,否则会报错
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget key name
(nil)
127.0.0.1:6379> hget k1 name
"lee"
127.0.0.1:6379> hget k1 gender
"man"
127.0.0.1:6379> hget k1 age
"105"
  • hmset <key> <field> <value> [<field> <value> ...] 批量添加值
127.0.0.1:6379> hmset k2 name jay age 108 gender man
OK
  • hmget <key> <field> [<field> ...] 批量获取值
127.0.0.1:6379> hmget k2 name age gender
1) "jay"
2) "108"
3) "man"
  • hdel <key> <field> [<field> ...] 删除指定的 field (也就是value 中指定的 key-value 键值对)
127.0.0.1:6379> hdel k2 age
(integer) 1
127.0.0.1:6379> hmget k2 name age gender
1) "jay"
2) (nil)
3) "man"
  • hsetnx <key> <field> <value> 默认情况下,如果 key 中 field存在值 会覆盖掉已有的value,hsetnx 则不会
127.0.0.1:6379> hmget k1 name age gender
1) "lee"
2) "105"
3) "man"
127.0.0.1:6379> hset k1 age 16
# 默认会覆盖
(integer) 0
127.0.0.1:6379> hmget k1 name age gender
1) "lee"
2) "16"
3) "man"
127.0.0.1:6379> hsetnx k1 age 30
(integer) 0
127.0.0.1:6379> hmget k1 name age gender
1) "lee"
2) "16"
3) "man"
127.0.0.1:6379> hmget k1 name nickname age gender
1) "lee"
2) (nil)
3) "16"
4) "man"
127.0.0.1:6379> hsetnx k1 nickname "good boy"
(integer) 1
127.0.0.1:6379> hmget k1 name nickname age gender
1) "lee"
2) "good boy"
3) "16"
4) "man"
  • hkeys <key> 获取所有的key
127.0.0.1:6379> hkeys k1
1) "name"
2) "age"
3) "gender"
4) "nickname"
  • hvals <key> 获取所有的value
127.0.0.1:6379> hvals k1
1) "lee"
2) "16"
3) "man"
4) "good boy"
  • hgetall <key> 同时获取所有的 key 和 value
127.0.0.1:6379> hgetall k1
1) "name"
2) "lee"
3) "age"
4) "16"
5) "gender"
6) "man"
7) "nickname"
8) "good boy"
  • hexists <key> <field> 返回 field 是否存在
127.0.0.1:6379> hexists k1 gender
(integer) 1
127.0.0.1:6379> hexists k1 QQ
(integer) 0
  • hincrby <key> <field> <increment> 给指定的 field 按 increment 步长自增
  • hincrbyfloat <key> <field> <increment> 给指定的 field 按浮点数步长自增
127.0.0.1:6379> hget k1 age
"21.5"
127.0.0.1:6379> hincrby k1 age 2
# 浮点数不能用整数自增
(error) ERR hash value is not an integer
127.0.0.1:6379> hincrby k1 age 0.5
# 自增浮点数  方法为:hincrbyfloat
(error) ERR value is not an integer or out of range
# 浮点数自增
127.0.0.1:6379> hincrbyfloat k1 age 0.5
"22"
# 整数自增
127.0.0.1:6379> hincrby k1 age 3
(integer) 25
  • hlen <key> 返回某一个 key 中 value 的数量 ( value 中 键值对的数量 )
127.0.0.1:6379> hlen k1
(integer) 4
  • hstrlen <key> <field> 返回某一个 key 中某一个 field 的字符串长度
127.0.0.1:6379> hget k1 nickname
"good boy"
127.0.0.1:6379> hstrlen k1 nickname
(integer) 8

④ Set (集合)

应用场景

  • 有求并集、交集、差集操作,可实现 共同关注、共同爱好、二度好友等功能
  • 微博的关注的人,粉丝,可分别放在一个set中

常用的集合操作命令

  • sadd <key> <member> [<member> ...] 添加一个元素到 key 中
127.0.0.1:6379> sadd k1 a b c d 
(integer) 3
  • smembers 获取一个 key 下的所有元素
127.0.0.1:6379> smembers k1
1) "d"
2) "c"
3) "b"
4) "a"
  • srem <key> <member> [<member> ...] 移除指定的元素
127.0.0.1:6379> srem k1 b c
(integer) 2
127.0.0.1:6379> smembers k1
1) "d"
2) "a"
  • sismember <key> <member> 返回某一个元素是否在该集合中
127.0.0.1:6379> sismember k1 a
(integer) 1
127.0.0.1:6379> sismember k1 c
(integer) 0
  • scard <key> 返回集合中元素的数量
127.0.0.1:6379> scard k1
(integer) 2
  • srandmember <key> [count] 随机返回 count 个元素,count 可以选填
    如果 count 大于集合中元素总数,则会显示全部元素
127.0.0.1:6379> srandmember k1 
"a"
127.0.0.1:6379> srandmember k1 
"d"
127.0.0.1:6379> srandmember k1 10
1) "a"
2) "d"
  • spop <key> [count] 随机返回并且出栈一个元素,出一个少一个
127.0.0.1:6379> sadd k1 a b c d 
(integer) 4
127.0.0.1:6379> smembers k1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> spop k1 2
1) "d"
2) "b"
127.0.0.1:6379> smembers k1
1) "c"
2) "a"
  • smove <source> <destination> <member> 把一个元素从一个集合移到另一个集合中去
    • source: 原始集合
    • destination: 目标集合
    • member : 被移动的元素
127.0.0.1:6379> smembers k1
1) "c"
2) "a"
127.0.0.1:6379> smembers k1
1) "c"
2) "a"
127.0.0.1:6379> smembers k2
(empty list or set)
127.0.0.1:6379> smove k1 k2 c
(integer) 1
127.0.0.1:6379> smembers k1
1) "a"
127.0.0.1:6379> smembers k2
1) "c"
  • sdiff <key> [<key> ...] 返回两个集合的差集 ( 顺序很关键 )
127.0.0.1:6379> smembers k1
1) "a"
127.0.0.1:6379> smembers k2
1) "c"
# 注意: sdiff 命令中 集合的顺序很关键
127.0.0.1:6379> sdiff k1 k2
1) "a"
# 以 k1 为准,从 k1 中除去 k2
127.0.0.1:6379> sdiff k2 k1
1) "c"
# 以 k2 为准,从 k2 中除去 k1
  • sdiffstore <destination> <key> [<key> ...] 类似于 sdiff , 不同的是 sdiffstore 计算出的结果会保存在一个新的集合中
127.0.0.1:6379> smembers k1
1) "b"
2) "a"
127.0.0.1:6379> smembers k2
1) "b"
2) "c"
127.0.0.1:6379> sdiffstore k3 k1 k2
# k1 和 k2 的差集会保存在 k3 中
(integer) 1
127.0.0.1:6379> smembers k3
1) "a"
  • sinter <key> [<key> ...] 返回两个集合的交集 ,与集合的顺序没有关系
127.0.0.1:6379> sinter k1 k2
# k1 和 k2 集合没有并集
(empty list or set)
127.0.0.1:6379> sadd k1 b
(integer) 1
127.0.0.1:6379> sadd k2 b
(integer) 1
127.0.0.1:6379> sinter k1 k2
# k1 和 k2 集合有并集
1) "b"
  • sinterstore <destination> <key> [<key> ...] 类似于 sinter ,只是将计算出来的交集结果保存在新的集合总
127.0.0.1:6379> smembers k1
1) "b"
2) "a"
127.0.0.1:6379> smembers k2
1) "b"
2) "c"
127.0.0.1:6379> sinterstore k4 k1 k2
# k1 和 k2 的交集会保存在 k4 中
(integer) 1
127.0.0.1:6379> smembers k4
1) "b"
  • sunion <key> [<key> ...] 求两个集合的并集
127.0.0.1:6379> smembers k1
1) "b"
2) "a"
127.0.0.1:6379> smembers k2
1) "b"
2) "c"
127.0.0.1:6379> sunion k1 k2
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> sunion k2 k1
1) "a"
2) "c"
3) "b"
  • sunionstore <destination> <key> [<key> ...] 求并集然后将结果保存到新的集合中
127.0.0.1:6379> sunionstore k5 k1 k2
(integer) 3
127.0.0.1:6379> smembers k5
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> sunionstore k6 k2 k1
(integer) 3
127.0.0.1:6379> smembers k6
1) "a"
2) "c"
3) "b"

⑤ Zset (Sorted Set)(有序集合)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。

应用场景

  • 有序集合可做用户的积分等排行榜需求
  • 可以通过Sorted Set实现有优先级或按权重的消息队列

常用的有序集合操作命令

  • zadd <key> [NX|XX] [CH] [INCR] <score> <member> [score member ...] 将指定的元素添加到有序集合中
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> zadd k1 60 v1
(integer) 1
  • zscore <key> <member> 返回 member 的 score 值
127.0.0.1:6379> zscore k1 v1
"60"
  • zrange <key> <start> <stop> [WITHSCORES] 返回集合中的一组元素,若命令中带有 withscores 连同 score 一起返回
127.0.0.1:6379> zrange k1 0 2
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrange k1 0 2 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
  • zrevrange <key> <start> <stop> [WITHSCORES] 返回一组 倒序的元素
127.0.0.1:6379> zrevrange k1 0 3
1) "v5"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> zrevrange k1 0 3 withscores
1) "v5"
2) "100"
3) "v4"
4) "90"
5) "v3"
6) "80"
7) "v2"
8) "70"
  • zcard <key> 返回元素的个数
127.0.0.1:6379> zcard k1
(integer) 5
  • zcount <key> <min> <max> 返回 score 在某一个区间内的元素,默认是闭区间
    开区间:zcount <key> (<min> (<max> 不包含 min 和 max
127.0.0.1:6379>  zrange k1 0 -1 withscores
 1) "v1"
 2) "60"
 3) "v2"
 4) "70"
 5) "v3"
 6) "80"
 7) "v4"
 8) "90"
 9) "v5"
10) "100"
# 默认是闭区间
127.0.0.1:6379> zcount k1 60 90
(integer) 4
127.0.0.1:6379> zcount k1 (60 90
(integer) 3
# 开区间的写法
127.0.0.1:6379> zcount k1 (60 (90
(integer) 2
  • zrangebyscore <key> <min> <max> [WITHSCORES] [LIMIT offset count] 按照 score 的范围返回元素
127.0.0.1:6379> zrangebyscore k1 60 90
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrangebyscore k1 60 90 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"
127.0.0.1:6379> zrangebyscore k1 (60 90 withscores
1) "v2"
2) "70"
3) "v3"
4) "80"
5) "v4"
6) "90"
127.0.0.1:6379> zrangebyscore k1 (60 (90 withscores
1) "v2"
2) "70"
3) "v3"
4) "80"
  • zrank <key> <member> 返回指定元素的排名 (排名从小到大)
127.0.0.1:6379> zrank k1 v1
(integer) 0
127.0.0.1:6379> zrank k1 v4
(integer) 3
127.0.0.1:6379> zrank k1 v5
(integer) 4
  • zrevrank <key> <member> 返回指定元素的排名 (排名从大到小)
127.0.0.1:6379> zrevrank k1 v1
(integer) 4
127.0.0.1:6379> zrevrank k1 v4
(integer) 1
127.0.0.1:6379> zrevrank k1 v5
(integer) 0
  • zincrby <key> <increment> <member> 给指定元素的 score 按步长自增
127.0.0.1:6379> zrangebyscore k1 70 90 withscores
1) "v2"
2) "70"
3) "v3"
4) "80"
5) "v4"
6) "90"
# 给 v3 增加 5
127.0.0.1:6379> zincrby k1 5 v3
"85"
  • zinterstore <destination> <numkeys> <key> [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] 给两个集合求交集并保存到新的集合( 求元素的交集并将相同元素的score求和 )
127.0.0.1:6379> zadd k2  70 v1 80 v2
(integer) 2
127.0.0.1:6379> zrange k1 0 -1 withscores
 1) "v1"
 2) "60"
 3) "v2"
 4) "70"
 5) "v3"
 6) "85"
 7) "v4"
 8) "90"
 9) "v5"
10) "100"

127.0.0.1:6379> zrange k2 0 -1 withscores
1) "v1"
2) "70"
3) "v2"
4) "80"
127.0.0.1:6379>  zinterstore k3 2 k1 k2
(integer) 2
127.0.0.1:6379> zrange k3 0 -1 
1) "v1"
2) "v2"
127.0.0.1:6379> zrange k3 0 -1 withscores
# 相同元素的 score 求和
# 60 + 70 = 130 ; 70 + 80 = 150
1) "v1"
2) "130"
3) "v2"
4) "150"
  • zrem <key> <member> [<member> ...] 删除一个元素
127.0.0.1:6379> zcard k1 
(integer) 5
127.0.0.1:6379> zrange k1 0 -1 
1) "v1"
2) "v2"
3) "v3"
4) "v4"
5) "v5"
127.0.0.1:6379> zrem k1 v1
(integer) 1
127.0.0.1:6379> zcard k1 
(integer) 4
127.0.0.1:6379> zrange k1 0 -1 
1) "v2"
2) "v3"
3) "v4"
4) "v5"
  • zlexcount <key> <min> <max> 计算有序集合中成员数量
    • 最小值 - 表示 ;最大值 + 表示
    • 某两个元素之间,元素要闭区间
127.0.0.1:6379> zrange k1 0 -1
1) "v2"
2) "v3"
3) "v4"
4) "v5"
# 最小值 - 表示 ; 最大值 + 表示
127.0.0.1:6379> zlexcount k1 - +
(integer) 4
# 某两个元素之间,元素要闭区间
127.0.0.1:6379> zlexcount k1 [v2 [v4
(integer) 3
  • zrangebylex <key> <min> <max> [LIMIT offset count] 返回指定区间内的成员
127.0.0.1:6379> zrangebylex k1 - +
1) "v2"
2) "v3"
3) "v4"
4) "v5"
127.0.0.1:6379> zrangebylex k1 [v2 [v4
1) "v2"
2) "v3"
3) "v4"

补充

  • 四种数据类型(list / set / zset / hash),在第一次使用时,如果容器不存在,Redis 会自动创建一个
  • 四种数据类型(list / set / zset / hash),一旦容器中不存在元素,容器会被立即删除,释放内存

关于 key 的常用操作命令

  • del <key> [key ...] 删除一个 key-value ,Redis中所有数据类型通用
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> zadd k2 80 v1
(integer) 1
127.0.0.1:6379> del k2
(integer) 1
127.0.0.1:6379> get k2
(nil)
  • dump <key> 序列化指定的 key
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> dump k1
"\x00\x02v1\t\x00\x8f\x17\xe1\x92\x9f\xd6\x1a\xea"
  • exists <key> [key ...] 判断一个 key 是否存在
127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k4
(integer) 0
  • expire <key> <seconds> 给指定的 key 设置有效期
    注意: 如果 key 在过期时间之前被重新 set ,则过期时间会失效
127.0.0.1:6379> set k1 abc
OK
# 给 k1 设置过期时间
127.0.0.1:6379> expire k1 60
(integer) 1
# 查看 k1 剩余过期时间
127.0.0.1:6379> ttl k1
(integer) 56
# 查看 k1 对应的值
127.0.0.1:6379> get k1
"abc"
# k1 被重新 set
127.0.0.1:6379> set k1 def
OK
127.0.0.1:6379> get k1
"def"
# 此时过期时间失效, k1 永不过期
127.0.0.1:6379> ttl k1
(integer) -1
  • ttl <key> 查看一个 key 的有效期(单位是秒)
    • 默认 -1 表示永不过期;-2 表示已经过期
  • pttl <key> 查看一个 key 的有效期(单位是毫秒)
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> ttl k2
(integer) -2
# 设置 10s 的过期时间
127.0.0.1:6379> expire k1 10
(integer) 1
# 查看剩余过期时间 (秒)
127.0.0.1:6379> ttl k1
(integer) 6
# 查看剩余过期时间 (毫秒)
127.0.0.1:6379> pttl k1
(integer) 1860
# 十秒后查看,已过期
127.0.0.1:6379> pttl k1
(integer) -2
  • persist 移除一个 key 的过期时间
  • keys * 查看所有的 key
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> ttl k1
(integer) -1
# 设置 k1 的过期时间为 360s
127.0.0.1:6379> expire k1 360
(integer) 1
# 查看 k1 的剩余过期时间
127.0.0.1:6379> ttl k1
(integer) 354
# 移除 K1 的过期时间
127.0.0.1:6379> persist k1
(integer) 1
127.0.0.1:6379> ttl k1
# 此时 k1 永不过期
(integer) -1