通用命令
Redis
可分为五大数据结构,即string
,hash
,list
,set
,zset
.每种数据类型都有自己的命令,所谓通用命令,就是在任意一个类型中都能使用的命令.
keys
获取所有key,不建议使用.会阻塞其他命令.
127.0.0.1:6379> set sb zcx
OK
127.0.0.1:6379> set xsb sb_zcx
OK
127.0.0.1:6379> set nb gy
OK
127.0.0.1:6379> set angel gy
OK
# 获取所有的key
127.0.0.1:6379> keys *
1) "angel"
2) "nb"
3) "xsb"
4) "sb"
# 获取以b结尾的key
127.0.0.1:6379> keys *b
1) "xsb"
2) "nb"
3) "sb"
# 获取a-s的key
127.0.0.1:6379> keys [a-s]*
1) "angel"
2) "nb"
3) "sb"
# 获取两位长度且最后一位是b的
127.0.0.1:6379> keys ?b
1) "nb"
2) "sb"
dbsize
计算key的总数
127.0.0.1:6379> keys *
1) "angel"
2) "xsb"
3) "nb"
4) "sb"
127.0.0.1:6379> dbsize
(integer) 4
exists key
判断key是否存在.存在返回1,不存在返回0
127.0.0.1:6379> set redis nb
OK
# key存在时
127.0.0.1:6379> exists redis
(integer) 1
127.0.0.1:6379> del redis
(integer) 1
# key不存在时
127.0.0.1:6379> exists redis
(integer) 0
del key
删除键
# 删除成功
127.0.0.1:6379> del redis
(integer) 1
# 删除不存在的key
127.0.0.1:6379> del redis
(integer) 0
# 删除多个key
127.0.0.1:6379> del angel xsb nb sb
(integer) 4
expire key seconds
给健设置过期时
127.0.0.1:6379> set angel qvbilam
OK
127.0.0.1:6379> expire angel 30
(integer) 1
ttl key
查看key剩余过期时间-2
代表key不存在,-1
代表key存在,没有过期时间.
# 返回还要22s过期
127.0.0.1:6379> ttl angel
(integer) 22
127.0.0.1:6379> ttl angel
(integer) -2
persist key
取消key的过期时间
127.0.0.1:6379> set angel qvbilam
OK
127.0.0.1:6379> expire angel 30
(integer) 1
127.0.0.1:6379> persist angel
(integer) 1
127.0.0.1:6379> ttl angel
(integer) -1
type key
获取健的类型.返回值string
,hash
,list
,set
,zset
和none
.
127.0.0.1:6379> sadd angel 1 2 3
(integer) 3
127.0.0.1:6379> type angel
set
# 不存在的key
127.0.0.1:6379> type qwe
none
String
特点
字符串(String):它的value
可以是一个字符串,整型,二进制,json,xml等.但是大小限制是512mb
,感觉已经非常大了.建议存几百k的value
.因为当value
过于大的时候,在读取是非常耗时间和资源的.
常用命令
命令 | 说明 |
---|---|
set key value | 不管key是否存在,都设置value |
setnx key value | 只有key不存在时,才设置value(Create) |
set key value xx | 只有key存在时,才设置value(Update) |
get key | 获取key的value,不存在返回nil |
del key | 删除key-value,返回删除数量. |
示例
# setnx
127.0.0.1:6379> exists qvbilam
(integer) 0
127.0.0.1:6379> setnx qvbilam gy
(integer) 1
127.0.0.1:6379> setnx qvbilam gyy
(integer) 0
# set xx
127.0.0.1:6379> exists qvbilam
(integer) 0
127.0.0.1:6379> set qvbilam gy xx
(nil)
批量操作
命令 | 说明 |
---|---|
mset key1 value1 key2 value2 | 批量设置key-value |
mget key1 key2 | 批量获取value |
示例
127.0.0.1:6379> mset sex 1 age 16 height 175
OK
127.0.0.1:6379> mget sex age height
1) "1"
2) "16"
3) "175"
数值操作
命令 | 说明 |
---|---|
incr key | 将key的value自增1,如果key不存在.会创建key,并以0开始自增1 |
decr key | 将key的value自减少1,如果key不存在.会创建key,并以0开始自减1 |
incrby key n | 将key的value自增x,如果key不存在.会创建key,并以0开始自增n |
decrby key | 将key的value自减少x,如果key不存在.会创建key,并以0开始自减n |
示例
# incr
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> incr hello
(integer) 1
127.0.0.1:6379> get hello
"1"
127.0.0.1:6379> incr hello
(integer) 2
127.0.0.1:6379> get hello
"2"
# decr
127.0.0.1:6379> get hello
(nil)
127.0.0.1:6379> decr hello
(integer) -1
127.0.0.1:6379> get hello
"-1"
127.0.0.1:6379> decr hello
(integer) -2
127.0.0.1:6379> get hello
"-2"
Hash
特点
哈希(Hash):Key = ['field1' => value,'field2'=>value]
.可以理解成一个二维数组,其中field
是不可以重复,value
是可相同的.特点,所有命令都是以h
开头.
常用命令
命令 | 说明 |
---|---|
hset key field value | 设置key对应的field的value |
hget key field | 获取key对应的field的value |
hdel key field | 删除key对应的field的value |
hexists key field | 判断key中是否存在field |
hlen key | 获取key中所有field的总数 |
hmset key feild1 value1 field2 value2 | 批量设置key对应的field的value |
hmget key field1 field2 | 批量获取key对应的field的value |
Hincrby key filed number | 将key对应field的value加上number,可以为负数 |
hetgetall key | 获取key所有field的value |
hvals key | 返回key的所有value |
hkeys key | 返回key的所有field不包括value |
# 设置用户1的属性
127.0.0.1:6379> hset user_1_info age 16 sex 1
(integer) 2
# 获取用户1的年龄
127.0.0.1:6379> hget user_1_info age
"16"
# 获取用户1的所有属性
127.0.0.1:6379> hgetall user_1_info
1) "age"
2) "16"
3) "sex"
4) "1"
# 删除用户1的性别
127.0.0.1:6379> hdel user_1_info sex
(integer) 1
127.0.0.1:6379> hgetall user_1_info
1) "age"
2) "16"
# 获取用户1的信息
127.0.0.1:6379> hexists user_1_info name
(integer) 0
127.0.0.1:6379> hexists user_1_info age
(integer) 1
# 获取用户信息的field
127.0.0.1:6379> hlen user_1_info
(integer) 1
# 计数处理
127.0.0.1:6379> hincrby user_1_info pv 1
(integer) 1
127.0.0.1:6379> hincrby user_1_info pv -2
(integer) -1
Hash Vs String
存储用户信息
ID | 数据类型 | 实现 | 优缺 | 缺点 |
---|---|---|---|---|
1 | string | 一个key. 所有属性写成序列号字符串 每次读写都解序列化字符串 再整体修改存储 | 编程简单,节省内存 | 序列号开销大 设置单个属性,要操作真个数据 |
2 | string | 多个key,每一个key当作一个属性. | 直观 可以部分修改 | 内存占用大 key分散,不利于维护 |
3 | Hash | 将每个用户的属性做成field 每个属性的值就是对应的value | 直观 可部分修改 节省空间 | 只能设置key的ttl(过期时间). |
List
特点
列表(List):是key-value形式的数据类型,但是它的value是一个有序的队列,value列表是个有序的,可以有重复的元素.特点命令大多数是以L
开头.
增
命令 | 说明 | 时间复杂度 | |
---|---|---|---|
rpush key value1 value2 | 从列表右边插入value 插入结果 value1 value2 | O(1) | |
lpush key value1 value2 | 从列表左边插入value 插入结果 value2 value1 | O(1) | |
Linsert key before\ | after value newValue | 在value的之前/之后插入新的value 需要遍历列表,耗时 | O(n) |
删
命令 | 说明 | 时间复杂度 |
---|---|---|
lpop key | 从右侧弹出一个value | O(1) |
rpop key | 从右侧弹出一个value | O(1) |
lrem key count value | count>0,从左到右删除count个值等于value的项 count<0,从右到左删除count个值等于value的项 count=0或者不传,删除所有等于value的项 | O(n) |
ltrim key start end | 保留start到end之间的值,删除其余的 | O(n) |
blpop key time | lpop阻塞版本 time是超时时间,0为用不超时 阻塞就是当没有值时,会一直等到有值插入 | O(1) |
brpop key time | rpop阻塞版本<br/>time是超时时间,0为用不超时<br/>阻塞就是当没有值时,会一直等到有值插入 | O(1) |
改
命令 | 说明 | 时间复杂度 |
---|---|---|
lset key index value | 修改列表指索引的value | O(n) |
查
命令 | 说明 | 时间复杂度 |
---|---|---|
lrange key start end | 获取start到end之间的所有value | O(n) |
lindex key index | 获取指定索引的value | O(n) |
llen key | 获取列表长度 | O(1) |
# 从右到左插入
127.0.0.1:6379> rpush qvbilam 1 2 3
(integer) 3
# 遍历所有数据
127.0.0.1:6379> lrange qvbilam 0 -1
1) "1"
2) "2"
3) "3"
# 从左到右插入
127.0.0.1:6379> lpush qvbilam 0 -1 -2
(integer) 6
# 遍历所有数据
127.0.0.1:6379> lrange qvbilam 0 -1
1) "-2"
2) "-1"
3) "0"
4) "1"
5) "2"
6) "3"
# 弹出右边第一个
127.0.0.1:6379> rpop qvbilam
"3"
# 遍历所有数据
127.0.0.1:6379> lrange qvbilam 0 -1
1) "-2"
2) "-1"
3) "0"
4) "1"
5) "2"
# 修改第三个值
127.0.0.1:6379> lset qvbilam 2 angel
OK
# 遍历所有数据
127.0.0.1:6379> lrange qvbilam 0 -1
1) "-2"
2) "-1"
3) "angel"
4) "1"
5) "2"
使用场景
LPUSH + RPOP = 队列
LPUSH + LTRIM = 有固定数量的列表
LPUSH + BRPOP = 消息队列
Set
特点
集合(Set):它的value就是一堆字符串的集合.不允许出现重复元素
.集合元素时无需,且不能重复.支持集合间的操作.所有命令都是以S
开头.
集合内部操作
命令 | 说明 | 时间复杂度 |
---|---|---|
sadd key member | 向集合key插入value(如果value存在,添加失败) | O(1) |
srem key member | 删除集合key中的value | O(1) |
scard key | 计算集合中的元素 | O(1) |
sismember key member | 判断value是否在key中 | O(n) |
srandmember key count | 随机取出count个元素,默认为1 | O(1) |
smembers key | 取出集合中所有的元素 | O(n) |
spop key count | 从集合中随机弹出count个元素,默认是1 | O(1) |
# 设置集合
127.0.0.1:6379> sadd angel gone gtwo
(integer) 2
# 统计数量
127.0.0.1:6379> scard angel
(integer) 2
# 判断集合中是否存在某值
127.0.0.1:6379> sismember angel gone
(integer) 1
# 随机返回元素
127.0.0.1:6379> srandmember angel 2
1) "gone"
2) "gtwo"
集合之间操作
命令 | 说明 |
---|---|
sdiff key [key...] | 差集 |
sinterkey [key...] | 交集 |
sunionkey [key...] | 并集 |
# 查询集合qvbilam元素
127.0.0.1:6379> smembers qvbilam
1) "gthree"
2) "gone"
# 查询集合angel元素
127.0.0.1:6379> smembers angel
1) "gone"
2) "gtwo"
# 求差集
127.0.0.1:6379> sdiff angel qvbilam
1) "gtwo"
# 求交集
127.0.0.1:6379> sinter angel qvbilam
1) "gone"
# 求并集
127.0.0.1:6379> sunion angel qvbilam
1) "gthree"
2) "gone"
3) "gtwo"
使用场景
SADD = 标签,使用技能
SPOP + SRADNMEMBER = 随机数
SADD + SINTER = 共同好友
Zset
有序集合(Zset):和集合类似,一个key对应多个value的集合,但是每个value都会有一个score,用于排序.其中value是不可重复的,score是可以重复的.并且有序.命令特点都是以"Z"开头.
常用命令
命令 | 说明 | 时间复杂度 |
---|---|---|
zadd key score element | 对应的key添加score和element | o(logN) |
zrem key element | 删除element | O(1) |
zscore key element | 获取element的score | O(1) |
zincrby key incrbyscore element | 增加或减少element的score | O(1) |
zcard key | 返回element的个数 | O(1) |
zrank/zrevrank key element | 通过scroe生序/降序排名 返回element的排名 | o(logN) |
zrange key start end [WITHSCORES] | 返回start到end之间的升序元素 [是否打印score] | O(log(n) + m) n = 集合个数 m=获取元素个数 |
zrangebyscore key minScore maxScore[WITHSCORES] | 获取Score之内的升序元素<br/>[是否打印score] | O(log(n) + m)<br/>n = 集合个数<br/>m=获取元素个数 |
zcount key minScore maxScore | 获取Score之内的元素个数 | O(log(n) + m)<br/>n = 集合个数<br/>m=获取元素个数 |
zremrangebyrank key start end | 按照升序删除前start到end个元素 | O(log(n) + m)<br/>n = 集合个数<br/>m=获取元素个数 |
zremrangebyscore key minScore maxScore | 删除指定分数内的元素 | O(log(n) + m)<br/>n = 集合个数<br/>m=获取元素个数 |
# 添加元素
127.0.0.1:6379> zadd qvbilam 125 gy 100 zcx
(integer) 2
# 获取gy的score
127.0.0.1:6379> zscore qvbilam gy
"125"
# 返回有序集合的个数
127.0.0.1:6379> zcard qvbilam
(integer) 2
# 按生序,降序获取排名
127.0.0.1:6379> zrange qvbilam 0 -1
1) "gy"
2) "gyy"
3) "gyyy"
127.0.0.1:6379> zrevrange qvbilam 0 -1
1) "gyyy"
2) "gyy"
3) "gy"
# 获取所有元素
127.0.0.1:6379> zrange qvbilam 0 -1
1) "zcx"
2) "gy"
# 删除元素
127.0.0.1:6379> zrem qvbilam zcx
(integer) 1
# 给元素加分值
127.0.0.1:6379> zincrby qvbilam 100 gyyy
"227"
127.0.0.1:6379> zincrby qvbilam -100 gy
"25"
# 获取0-200之间的元素
127.0.0.1:6379> zrangebyscore qvbilam 0 200 withscores
1) "gy"
2) "25"
3) "gyy"
4) "126"
使用场景
常见的使用常见:网站的排行榜,可以对一个物品的时间戳做有序集合,做最新排行榜,对观看量做集合实现最热视频等.