五种基本数据类型及常用操作命令和使用场景"/>
Redis的五种基本数据类型及常用操作命令和使用场景
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 withscores1) "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 withscores1) "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
参考文献:
- 江南一点雨 Redis讲解视频
- Redis数据类型及使用场景
- redis学习-数据类型详解-各使用场景(一)
ps:如有错误,欢迎批评指正,谢谢
更多推荐
Redis的五种基本数据类型及常用操作命令和使用场景
发布评论