Redis基本使用

前言:

Redis有五种的数据结构分别是:(字符串)string、(哈希)hash、(列表)list、(集合)set、(有序集合)zset

java redis获取键的数量 redis获取所有键值对_redis

一:Sting结构

字符串常用操作:

  1. 存入字符串键值对:set key value
  2. 批量存储字符串键值对:mset key value [key1 value1 …]
  3. 存入一个不存在的字符串键值对:setnx key value
  4. 获取一个字符串键值:get key
  5. 批量获取字符串键值:mget key [key1…]
  6. 删除一个键:del key [key1…]
  7. 设置一个键的过期时间(秒):expipe key seconds

原子加减:

  1. 将key中存储的数字值加1:incr key
  2. 将key中存储的数字值减1:decr key
  3. 将key中所存储的值加上increment:incrby key increment
  4. 将key中所存储的值减去increment:decrby key increment

操作实例:

  1. 单值缓存
  2. 对象缓存
    set name:2 value(json格式数据)

    mset user:1:username 相当于关系数据库中 操作 user 表的id为1的username字段值赋值为 zhugeling;把user表id为1的age字段赋值为2000

应用场景:

微信文章阅读量,每次打开文章,阅读量都会+1

java redis获取键的数量 redis获取所有键值对_java redis获取键的数量_02


计数器:

incr key

java redis获取键的数量 redis获取所有键值对_redis_03

二:Hash结构

Hash常用操作:

  1. 存储一个哈希表key的键值:hset key field value
  2. 存储一个不存在的哈希表key的键值:hsetnx key field value
  3. 在一个哈希表key中存储多个键值对:hmset key field value [field1 value1 …]
  4. 获取哈希表key对应的field键值:hget key field
  5. 批量获取哈希表key中多个field键值对:hmget key field [field1 …]
  6. 删除哈希表key中field键值:hdel key field [field1 …]
  7. 返回哈希表key中field的数量:hlen key
  8. 返回哈希表key中所有键值:hgetall key
  9. 为哈希表key中field键的值增加increment:hincrby key field increment

操作实例:

  1. 存储结构为:

应用场景:

java redis获取键的数量 redis获取所有键值对_有序集合_04


电商购物车:以用户id为key,商品id为field,商品数量为value

购物车操作:

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

优点:

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

缺点:

  1. 过期功能不能使用在field上,只能使用在key上
  2. Redis 集群架构下不适合大规模使用

三:List结构

List常用操作:

  1. 将一个或者多个值value插入到key列表的表头(最左边):lpush key value [value1 …]
  2. 将一个或者多个值value插入到key列表的表尾(最右边):rpush key value [value1 …]
  3. 移除并返回key列表的头元素:lpop key
  4. 移除并返回key列表的尾元素:rpop key
  5. 返回列表key中指定区间内的元素,区间以偏移量start和stop指定:lrange key start stop
  6. 从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待:blpop key [key …] timeout
  7. 从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待:blpop key [key …] timeout

    Stack(栈) = lpush + lpop -> FILO
    Queue(队列) = lpush + rpop
    Blocking MQ(阻塞队列) = lpush + brpop

应用场景:

java redis获取键的数量 redis获取所有键值对_redis_05


微博消息、微信公众号消息

13. 微信公众号发送消息,消息id为:32001

lpush msg:{人员id} 32001

14. 查看最新消息:lrange msg{人员id} 0 5

java redis获取键的数量 redis获取所有键值对_中间件_06

四:Set 结构

Set常用操作:

  1. 往集合key中存入元素,元素存在则忽略,若key不存在则新建:sadd key member [member …]
  2. 从集合key中删除元素:srem key member [member …]
  3. 获取集合key中所有元素:smembers key
  4. 获取集合key的元素个数:scard key
  5. 判断member元素是否存在于集合key中:sismember key member
  6. 从集合key中随机选出count个元素,元素不从key中删除:srandmember key [count]
  7. 从集合key中随机选出count个元素,元素从key中删除:spop key count

Set 运算操作

  1. 交集运算:sinter key [key …]
  2. 将交集结果存入新集合destination中:sinterstore destination key [key …]
  3. 并集运算:sunion key [key …]
  4. 将并集结果存入新集合destination中:sunionstore destination key [key …]
  5. 差集运算:sdiff key [key …]
  6. 将差集结果存入新集合destination中:sdiffstore destination key [key …]

应用场景:

java redis获取键的数量 redis获取所有键值对_中间件_07


微信抽奖小程序:

  1. 点击参与抽奖加入集合:sadd key {userId}
  2. 查看参与抽奖的所有用户:smembers key
  3. 抽取count名中奖者:srandmember key [count] / spop key [count]

微信微博点赞收藏标签:

java redis获取键的数量 redis获取所有键值对_分布式_08

  1. 点赞:sadd like:{消息id} {用户id}
  2. 取消点赞:srem like:{消息id} {用户id}
  3. 检查用户是否点过赞:sismember like:{消息id} {用户id}
  4. 获取点赞的用户列表:smembers like:{消息id}
  5. 获取点赞用户数:scard like:{消息id}

集合操作:

java redis获取键的数量 redis获取所有键值对_有序集合_09

  1. sinter set1 set2 set3 -> {c}
  2. sunion set1 set2 set3 -> {a,b,c,d}
  3. sdiff set1 set2 set3 -> {a}

    集合操作实现微博微信关注模型:
  4. 张飞关注的人:zhangfeiSet -> {liubei,guanyu,zhaoyun,sunce}
  5. 关羽关注的人:gaunyuSet -> {zhangfei,liubei,zhaoyun,sunce,caocao}
  6. 刘备关注的人:liubeiSet-> {zhangfei,guanyu,zhaoyu,sunce}
  7. 张飞和关羽共同关注的人:sinter zhangfeiSet guanyuSet -->{liubei,zhaoyun,sunce}
  8. 刘备关注的人也关注了孙策:
    sismember guanyuSet sunce
    sismember zhangfeiSet sunce

五:ZSet有序集合结构

ZSet常用操作:

  1. 忘有效集合key中加入带分值元素:zadd key score member [[score member] …]
  2. 从有序集合key中删除元素:zrem key member [member …]
  3. 返回有序集合key中元素member的分值:zscore key member
  4. 为返回有序集合key中元素member的分值加上increment:zincrby key increment member
  5. 返回有序集合key中的元素:zcard key
  6. 正序获取有序集合key从start下标到stop下标的元素:zrange key start stop [withscores]
  7. 倒叙获取有序集合key从start下标到stop下标的元素:zrevrange key start stop [withscores]

ZSet 集合操作:

  1. 并集计算:zunionstore destkey numkeys key[key1 …]
  2. 交集计算:zinterstore destkey numbers key[key1 …]

应用场景:

java redis获取键的数量 redis获取所有键值对_分布式_10


Zset集合操作实现排行榜:

  1. 点击新闻:zincrby hotNews:20200913 1 守护香港
  2. 展示当日排行前十:zrevrange hotNews:20200913 0 10 withscores
  3. 七日搜索榜单计算:zunionstore hotNews:20200907-20200913 7
    hotNews:20200907 hotNews:20200908 hotNews:20200909 …hotNews:20200913
  4. 展示七日排行前十:zrevrange hotNews:20200907-20200913 0 10 withscores