string字符串类型

string适合做单值缓存,对象缓存,分布式锁等

命令名称 命令格式 命令描述
set set key value 赋值
get get key 取值
getset getset key value 取值并赋值
setnx setnx key value 当value不存在时采用赋值 set key value NX PX 3000 原子操作,px 设置毫秒数
append append key value 向尾部追加值
strlen strlen key 获取字符串长度
incr incr key 递增数字
incrby incrby key increment 增加指定的整数
decr decr key 递减数字
decrby decrby key decrement 减少指定的整数
mset mset key value key value 批量赋值
mget mget key key 批量取值

接下来,我们执行以下Redis的这些命令

set命令:

  1. 127.0.0.1:6379> set name liuxixi
  2. OK

get命令:

  1. 127.0.0.1:6379> set name liuxixi
  2. OK
  3. 127.0.0.1:6379> get name
  4. "liuxixi"

getset命令:

  1. 127.0.0.1:6379> getset name lixixi
  2. "liuxixi"
  3. 127.0.0.1:6379> get name
  4. "lixixi"

setnx命令:

  1. 127.0.0.1:6379> setnx age 12
  2. (integer) 1 //第一次返回1代表设置成功
  3. 127.0.0.1:6379> setnx age 13
  4. (integer) 0 //第二次返回0代表没有设置成功

append命令:

  1. 127.0.0.1:6379> append name xi
  2. (integer) 8 //返回的8是value的长度
  3. 127.0.0.1:6379> get name
  4. "lixixixi"
  5. 复制代码

strlen命令:

  1. 127.0.0.1:6379> strlen name
  2. (integer) 8

incr命令:

  1. 127.0.0.1:6379> incr age //可以用来做点赞功能
  2. (integer) 14
  3. 127.0.0.1:6379> get age
  4. "14"

incrby命令:

  1. 127.0.0.1:6379> incrby age 3
  2. (integer) 17
  3. 127.0.0.1:6379> get age
  4. "17"
  5. 复制代码

decr命令:

  1. 127.0.0.1:6379> decr age
  2. (integer) 16
  3. 127.0.0.1:6379> get age
  4. "16"

decrby命令:

  1. 127.0.0.1:6379> decrby age 3
  2. (integer) 13
  3. 127.0.0.1:6379> get age
  4. "13"

hash散列类型

命令名称 命令格式 命令描述
hset hset key field value 赋值,不区别新增或修改
hmset hmset field1 value1 field2 value2 批量赋值
hsetnx hsetnx key field value 赋值,如果filed存在则不操作
hexists hexists key filed 查看某个field是否存在
hget hget key field 获取一个字段值
hmget hmget key field1 field2 … 获取多个字段值
hgetall hgetall key
hdel hdel key field1 field2.. 删除指定字段
hincrby hincrby key field increment 指定字段自增increment
hlen hlen key 获得字段数量

应用场景:可以做电商购物车

电商购物车:

  1. 以用户id为key
  2. 商品id为field
  3. 商品数量为value

购物车操作:

  1. 添加商品:hset cart:1001 10088 1
  2. 增加数量:hincrby cart:1001 10088 1
  3. 商品总数:hlen cart:1001
  4. 删除商品:hdel cart:1001 10088
  5. 获取购物车所有商品:hgetall cart:1001

hash结构的优缺点

优点
  1. 同类数据归类整合存储,方便数据管理
  2. 相比string操作消耗内存与cpu更小
  3. 相比string存储更节省空间

    缺点
  4. 过期功能不能使用在field上,只能用在key上

  5. Redis集群架构下不适合大规模使用

list列表类型

list列表类型可以存储有序,可重复的元素
获取头部或尾部附近的记录是极快的
list的元素个数最多为2^31-1个(20亿)

常见操作命令如下:

命令名称 命令格式 命令描述
lpush lpush key v1 v2 v3 … 从左侧插入列表
lpop lpop key 从列表左侧取出
rpush rpush key v1 v2 v3 … 从右侧插入列表
rpop rpop key 从列表右侧取出
lpushx lpushx key value 将值插入到列表头部
rpushx rpushx key value 将值插入到列表尾部
blpop blpop key timeout 从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时 间,单位为秒
brpop blpop key timeout 从列表右侧取出,当列表为空时阻塞,可以设置最大阻塞时 间,单位为秒
llen llen key 获得列表中元素个数
lindex lindex key index 获得列表中下标为index的元素 index从0开始
lrange lrange key start end 返回列表中指定区间的元素,区间通过start和end指定
lrem lrem key count value 删除列表中与value相等的元素 当count>0时, lrem会从列表左边开始删除;当count<0时, lrem会从列表后边开始删除;当count=0时, lrem删除所有值 为value的元素
lset lset key index value 将列表index位置的元素设置成value的值
ltrim ltrim key start end 对列表进行修剪,只保留start到end区间
rpoplpush rpoplpush key1 key2 从key1列表右侧弹出并插入到key2列表左侧
brpoplpush brpoplpush key1 key2 从key1列表右侧弹出并插入到key2列表左侧,会阻塞
linsert linsert key BEFORE/AFTER pivot value 将value插入到列表,且位于值pivot之前或之后

常用数据结构

Stack(栈)=LPUSH+LPOP
Queue(队列)=LPUSH+RPOP
BlockingMQ(阻塞队列)=LPUSH+BRPOP

set集合类型

set:无序,唯一元素
集合中最大的成员数为2^32-1(40亿)

常见操作命令如下表:

命令名称 命令格式 命令描述
sadd sadd key mem1 mem2 …. 为集合添加新成员
srem srem key mem1 mem2 …. 删除集合中指定成员
smembers smembers key 获得集合中所有元素
spop spop key 返回集合中一个随机元素,并将该元素删除
srandmember srandmember key 返回集合中一个随机元素,不会删除该元素
scard scard key 获得集合中元素的数量
sismember sismember key member 判断元素是否在集合内
sinter sinter key1 key2 key3 求多集合的交集
sdiff sdiff key1 key2 key3 求多集合的差集
sunion sunion key1 key2 key3 求多集合的并集

应用场景:

适用于不能重复的且不需要顺序的数据结构

比如:关注的用户,还可以通过spop进行随即抽奖

微信抽奖小程序:

  1. 点击参与抽奖加入集合
    SADD key {userId}
  2. 查看参与抽奖所有用户
    SMEMBERS key
  3. 抽取count名中奖者
    SRANDMEMBER key [count] / SPOP key [count]

Redis命令必知必会 - 图1

微信微博点赞,收藏,标签

  1. 点赞
    SADD like:{消息ID} {用户ID}
  2. 取消点赞
    SREM like:{消息ID} {用户ID}
  3. 检查用户是否点过赞
    SISMEMBMR like:{消息ID} {用户ID}
  4. 获取点赞的用户列表
    SMEMBERS like:{消息ID}
  5. 获取点赞用户数
    SCARD like:{消息ID}

Redis命令必知必会 - 图2

集合操作实现微博微信关注模型

  1. 你关注的人
    xx -> {x , xxx}
  2. 我关注的人
    Ll -> {xx , xxx}
  3. 我和你关注的人
    SINTER xx LI -> {xxx}
  4. 我关注的人也关注他:
    SISMEMBER xx LI
  5. 我可能认识的人:
    SDIFF xx LI -> {xx}

zset有序集合类型

元素本身是无序不重复的,每一个元素关联一个分数(score)可按分数排序,分数可重复

常见操作命令如下表:

命令名称 命令格式 命令描述
zadd zadd key score1 member1 score2 member2 … 为有序集合添加新成员
zrem zrem key mem1 mem2 …. 删除有序集合中指定成员
zcard zcard key 获得有序集合中的元素数量
zcount zcount key min max 返回集合中score值在[min,max]区间 的元素数量
zincrby zincrby key increment member 在集合的member分值上加increment
zscore zscore key member 获得集合中member的分值
zrank zrank key member 获得集合中member的排名(按分值从 小到大)
zrevrank zrevrank key member 获得集合中member的排名(按分值从大到小)
zrange zrange key start end 获得集合中指定区间成员,按分数递增 排序
zrevrange zrevrange key start end 获得集合中指定区间成员,按分数递减 排序

应用场景:

由于可以按照分值排序,所以适用于各种排行榜。比如:点赞排行榜,销量排行榜,关注排行榜等。

举例:

  1. 127.0.0.1:6379> zadd hit:1 100 item1 20 item2 45 item3
  2. (integer) 3
  3. 127.0.0.1:6379> zcard hit:1
  4. (integer) 3
  5. 127.0.0.1:6379> zscore hit:1 item3
  6. "45"
  7. 127.0.0.1:6379> zrevrange hit:1 0 -1
  8. 1) "item1"
  9. 2) "item3"
  10. 3) "item2"
  11. 127.0.0.1:6379>
  12. 复制代码

zset集合操作实现排行榜

  1. 点击新闻
    ZINCRBY hotNews:20190819 1 守护香港
  2. 展示当日排行前十
    ZREVRANGE hotNews:20190819 0 9 WITHSCORES
  3. 七日搜索榜单计算
    ZUNIONSTORE hotNews:20190813-20190819 7
    hotNews:20190813 hotNews:20190814… hotNews:20190819
  4. 展示七日排行前十
    ZREVRANGE hotNews:20190813-201908109 0 9 WITHSCORES

Redis命令必知必会 - 图3