通用命令

  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,zsetnone.

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数据类型实现优缺缺点
1string一个key.
所有属性写成序列号字符串
每次读写都解序列化字符串
再整体修改存储
编程简单,节省内存序列号开销大
设置单个属性,要操作真个数据
2string多个key,每一个key当作一个属性.直观
可以部分修改
内存占用大
key分散,不利于维护
3Hash将每个用户的属性做成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从右侧弹出一个valueO(1)
rpop key从右侧弹出一个valueO(1)
lrem key count valuecount>0,从左到右删除count个值等于value的项
count<0,从右到左删除count个值等于value的项
count=0或者不传,删除所有等于value的项
O(n)
ltrim key start end保留start到end之间的值,删除其余的O(n)
blpop key timelpop阻塞版本
time是超时时间,0为用不超时
阻塞就是当没有值时,会一直等到有值插入
O(1)
brpop key timerpop阻塞版本<br/>time是超时时间,0为用不超时<br/>阻塞就是当没有值时,会一直等到有值插入O(1)

命令说明时间复杂度
lset key index value修改列表指索引的valueO(n)

命令说明时间复杂度
lrange key start end获取start到end之间的所有valueO(n)
lindex key index获取指定索引的valueO(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中的valueO(1)
scard key计算集合中的元素O(1)
sismember key member判断value是否在key中O(n)
srandmember key count随机取出count个元素,默认为1O(1)
smembers key取出集合中所有的元素O(n)
spop key count从集合中随机弹出count个元素,默认是1O(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和elemento(logN)
zrem key element删除elementO(1)
zscore key element获取element的scoreO(1)
zincrby key incrbyscore element增加或减少element的scoreO(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"

使用场景

  常见的使用常见:网站的排行榜,可以对一个物品的时间戳做有序集合,做最新排行榜,对观看量做集合实现最热视频等.

Last modification:February 18th, 2020 at 10:19 pm