Redis的五个基本类型(2)
Redis 的五个基本类型
Redis-key
命令 | 说明 |
---|---|
SET | 设置 key |
GET | 查看 key 的值 |
EXPIRE | 设置 key 的过期时间 |
TTL | 查看 key 剩余的时间 |
EXISTS | 判断当前的 key 是否存在 |
KEYS * | 查看当前所有的 key |
DEL key | 删除当前的 key |
TYPE | 查看 key 存储的 value 的类型 |
字符串 string
set get
设置值和获取值:
- 格式:
set key value
、get key
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 #获得值
"v1"
exists
判断 key 是否存在,格式:exists key
127.0.0.1:6379> EXISTS key1 #判断key是否存在
(integer) 1
append
追加字符串,如果 key 不存在,相当于 set 命令,格式:append key value
127.0.0.1:6379> APPEND key1 hello #追加字符串,如果当前key不存在,相当于set命名
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
strlen
获取字符串的长度,格式:strlen key
127.0.0.1:6379> STRLEN key1 #获得字符串的长度
(integer) 7
127.0.0.1:6379> append key1 wang
(integer) 11
127.0.0.1:6379> strlen key1
(integer) 11
127.0.0.1:6379> get key1
"v1hellowang"
incr decr
对 value 进行自增 1 和自减 1 操作,格式:incr key
、decr key
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> INCR views # i++操作
(integer) 1
127.0.0.1:6379> INCR views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> DECR views # i--操作
(integer) 1
127.0.0.1:6379> get views
"1"
127.0.0.1:6379> DECR views
(integer) 0
127.0.0.1:6379> get views
"0"
incrby decrby
设置加减的步长,格式:incrby key num
、decrby key num
127.0.0.1:6379> INCRBY views 10 # 设置自增的步长
(integer) 10
127.0.0.1:6379> INCRBY views 10
(integer) 20
127.0.0.1:6379> get views
"20"
127.0.0.1:6379> DECRBY views 5 # 设置自减的步长
(integer) 15
127.0.0.1:6379> DECRBY views 5
(integer) 10
127.0.0.1:6379> get views
"10"
getrange
获取给定范围的字符串值,格式:getrange key start stop
127.0.0.1:6379> set key1 hello,wang
OK
127.0.0.1:6379> get key1
"hello,wang"
127.0.0.1:6379> GETRANGE key1 0 3 # 查看给定范围的字符串
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 # 类似于 get 命令,查看所有的字符串
"hello,wang"
setrange
从指定位置开始替换字符串的值,格式:setrange key offset value
127.0.0.1:6379> GETRANGE key1 0 -1
"hello,wang"
127.0.0.1:6379> SETRANGE key1 2 xxx # 替换指定位置开始的字符串
(integer) 10
127.0.0.1:6379> GETRANGE key1 0 -1
"hexxx,wang"
setex ttl
设置过期时间,查看剩余时间,格式:setex key seconds value
、ttl key
127.0.0.1:6379> setex key2 30 v2
OK
127.0.0.1:6379> TTL key2
(integer) 21
127.0.0.1:6379> TTL key2
(integer) 20
127.0.0.1:6379> TTL key2
(integer) 18
setnx
如果 key 不存在则设置,负责失败,格式:setnx key value
#setnx 如果当前值不存在,则设置(在分布式锁中经常使用)
127.0.0.1:6379> setnx mykey redis #如果值不存在,则创建成功
OK
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> setnx mykey mongodb #如果值存在,则创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
mset mget
同时设置或者获取多个值,格式:mset key1 value1 key2 value2 ...
、mget key1 key2...
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset key1 v1 key2 v2 key3 v3 #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key2"
3) "key1"
127.0.0.1:6379> mget key1 key2 key3 #同时获取多个值
1) "v1"
2) "v2"
3) "v3"
getset
先 get 再 set,如果不存在,则返回 nil;如果存在,获取原来的值,并设置新的值
#getset 先get在set
127.0.0.1:6379> getset db redis #如果不存在,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果存在,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
小结
String 类似的使用场景:value 除了是字符串也可以是数字!
- 计数器
- 统计多单位的数量
- 对象缓存存储
列表 list
在 Redis 中,我们可以把 list 完成栈、队列、阻塞队列。
所有的 list 命令都是用 l
开头的。
lpush rpush lrange
从 list 的左边或者右边插入值,格式:lpush key value
、rpush key value
;lrange
获取指定范围的值,格式:lrange key start stop
127.0.0.1:6379> LPUSH list one # 将一个值或者多个值,插入到列表头部(左)
(integer) 1
127.0.0.1:6379> LPUSH list two
(integer) 2
127.0.0.1:6379> LPUSH list three
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1 # 获取 list 中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> LRANGE list 0 1 # 通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> RPUSH list right # 将一个值或者多个值,插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
lpop rpop
从列表的左边或者右边移除值,格式:lpop key
、rpop key
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> LPOP list #移除 list 的第一个元素
"three"
127.0.0.1:6379> RPOP list #移除 list 的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
lindex
获取指定下标的值,格式:lindex key index
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LINDEX list 0 #通过下标获取一个值
"two"
127.0.0.1:6379> LINDEX list 1
"one"
llen
获取列表中的元素个数,格式:llen key
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LLEN list
(integer) 2
ltrim
通过下标截取指定的长度,这个 list 已经改变了,截断了只剩下截取的元素,格式:ltrim key start stop
127.0.0.1:6379> LPUSH list hello hellol hello2 hello3
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "hello3"
2) "hello2"
3) "hellol"
4) "hello"
127.0.0.1:6379> LTRIM list 1 2 # 通过下标截取指定的长度,这个 list 已经改变了,截断了只剩下截取的元素!
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
2) "hellol"
rpoplpush
移除列表中最后一个元素,将它添加到另一个列表中,格式:rpoplpush key1 key2
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
2) "hellol"
127.0.0.1:6379> RPOPLPUSH list list2 # 移除列表的最后一个元素,将它移动到新的列表中
"hellol"
127.0.0.1:6379> LRANGE list 0 -1 # 查看原来的列表
1) "hello2"
127.0.0.1:6379> LRANGE list2 0 -1 # 查看目标列表,确实存在该值
1) "hellol"
lset
根据下标替换列表中的值,格式:lset key index value
#LSET 将列表中指定下标的值替换为另外一个值,相当于更新操作
127.0.0.1:6379> LRANGE list 0 -1
1) "hello2"
127.0.0.1:6379> LSET list 0 world # 将0号下标的值替换为world
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "world"
127.0.0.1:6379> LSET list 1 other # 修改不存在的下标,报错
(error) ERR index out of range
linsert
在列表中插入值,格式:linsert key before|after value new_value
#LINSERT 将某个具体的value插入到列表中某个值的前面或后面
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> LINSERT list before world other
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> LINSERT list after world "new"
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
小结
- 他实际上是一个链表,
before
orafter
,left
,right
都可以插入值 - 如果 key 不存在,创建新的链表
- 如果 key 存在,新增内容
- 如果移除了所有的值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
队列:LPOP RPUSH
栈:LPOP LPUSH
集合 set
set 中的值是不能重复的。
sadd
给 set 中添加值,格式:sadd key value1 value2 ...
127.0.0.1:6379> sadd myset hello #set集合中添加值
(integer) 1
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> sadd myset wang
(integer) 1
127.0.0.1:6379> sadd myset hello #设置重复值时,失败
(integer) 0
smembers
获取 set 中的所有值,格式:smembers key
127.0.0.1:6379> SMEMBERS myset #获取set的所有值
1) "hello"
2) "world"
3) "wang"
哈希 hash
可以将哈希看成是一个 Map 集合,key-value
中的 value
是一个 map 集合。
hset hget
设置或者获取一个 hash 的值:
- 格式:
hset key field1 value1
、hget key field
127.0.0.1:6379> hset myhash field1 wang #设置一个hash的值
(integer) 1
127.0.0.1:6379> hget myhash field1 #获取一个hash的值
"wang"
hmset hmget
设置或者获取 hash 的值(多个字段):
- 格式:
hmset key field1 value1 field2 value2 ...
、hmget key field1 field2...
127.0.0.1:6379> hmset myhash field2 chen field3 hello #同时设置多个hash的值
OK
127.0.0.1:6379> hmget myhash field1 field2 field3 #同时获取多个hash值
1) "wang"
2) "chen"
3) "hello"
hgetall
获取 hash 中的所有值:
127.0.0.1:6379> hgetall myhash #获取hash中的所有的键值对
1) "field1"
2) "wang"
3) "field2"
4) "chen"
5) "field3"
6) "hello"
hdel
删除指定 field
的 hash 键值对:
- 格式:
hdel key field
127.0.0.1:6379> hdel myhash field2 #删除指定的hash值,对应的value值也就删除了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "wang"
3) "field3"
4) "hello"
hlen
获取 hash 的键值对的个数:
- 格式:
hlen key
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "wang"
3) "field3"
4) "hello"
127.0.0.1:6379> hlen myhash #获取hash的键值对的个数
(integer) 2
hexists
判断 hash 中的字段是否存在:
- 格式:
hexists key field
127.0.0.1:6379> hgetall myhash
1) "field1"
2) "wang"
3) "field3"
4) "hello"
127.0.0.1:6379> HEXISTS myhash field1 #判断hash中指定的字段是否存在
(integer) 1
127.0.0.1:6379> HEXISTS myhash field2
(integer) 0
127.0.0.1:6379> HEXISTS myhash field3
(integer) 1
hkeys hvals
获取 hash 中所有的字段或者值:
- 格式:
hkeys key
、hvals
127.0.0.1:6379> hkeys myhash #获取hash中所有的字段
1) "field1"
2) "field3"
127.0.0.1:6379> hvals myhash #获取hash中所有的值
1) "wang"
2) "hello"
hincrby
给 hash 中指定字段的值加上一个增量:
127.0.0.1:6379> hset myhash field4 5
(integer) 1
127.0.0.1:6379> HINCRBY myhash field4 2 #给hash的值一个增量
(integer) 7
127.0.0.1:6379> HINCRBY myhash field4 -1 #给hash的值一个减量
(integer) 6
hsetnx
如果不存在,则添加;如果存在,则失败:
- 格式:
hsetnx key field value
127.0.0.1:6379> hkeys myhash
1) "field1"
2) "field3"
3) "field4"
127.0.0.1:6379> hsetnx myhash field5 zhang #如果不存在,则添加
(integer) 1
127.0.0.1:6379> hsetnx myhash field5 yang #如果存在,则不能添加
(integer) 0
hash 的应用
hash 中存储经常变更的值(比如用户信息:user: name-value, age-value, sex-value
),更适合对象的存储;而 String
更适合字符串存储。
有序集合 zset
有序集合 zset
中的元素带有 分数(score),可按分数排序。
zadd
添加一个值(可批量添加):
- 格式:
zadd key scores value
127.0.0.1:6379> zadd myset 1 wang #添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 yang 3 zhang #添加多个值
(integer) 2
zrange
获取 zset
中一个范围的值:
- 格式:
zrange key start stop
127.0.0.1:6379> ZRANGE myset 0 -1 #获取zset中的所有元素
1) "wang"
2) "yang"
3) "zhang"
zrangebyscore
将 zset
中的值按照 score
从小到大排序输出:
- 格式:
zrangebyscore key min max
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf #按照从小到大排序
1) "wang"
2) "yang"
3) "zhang"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf withscores #排序并显示scores
1) "wang"
2) "1"
3) "yang"
4) "2"
5) "zhang"
6) "3"
zrem
移除 zset
中指定的元素:
- 格式:
zrem key value
127.0.0.1:6379> ZRANGE myset 0 -1
1) "wang"
2) "yang"
3) "zhang"
127.0.0.1:6379> zrem myset yang #移除zset中指定的元素
(integer) 1
127.0.0.1:6379> zrange myset 0 -1
1) "wang"
2) "zhang"
zcard
查看 zset
中的元素个数:
- 格式:
zcard key
127.0.0.1:6379> ZRANGE myset 0 -1
1) "wang"
2) "yang"
3) "zhang"
127.0.0.1:6379> ZCARD myset #查看set中有几个元素
(integer) 3
根据 score
的值统计在给定区间的元素个数:
- 格式:
zcount key min max
127.0.0.1:6379> zrange myset 0 -1
1) "yang"
2) "zhang"
3) "wang"
127.0.0.1:6379> zcount myset 1 3 #统计scores在1 到 3 区间内元素的个数
(integer) 3
127.0.0.1:6379> zcount myset 1 2 #统计scores在1 到 2 区间内元素的个数
(integer) 2