redis常用数据类型和应用场景

2021-01-07 17:08:18 浏览数 (1)

数据类型

1. String

HashMap<String,Object> Object可用类型

  • String
  • Number
  • bit

操作

  • SET 存入字符串键
  • SETNX 存入字符串键,如果已存在则失败 应用场景:分布式锁
  • GET 获取
  • MSET 批量存入
  • MGET 批量获取
  • DEL
  • EXPIRE 设置过期时间 应用场景:分布式锁有效期(在压测中根据极限情况设置时长) SET K V ex 20 NX jeids.set(k,v,“NX”,“EX”,expireSeconds);
  • redis操作事务性 通过lua脚本吧多个操作包装成一个操作来保证事务完整性

缓存设计

  • 存入结构化(序列化)数据,json,xml,protobuf 缺点:不适合大量修改(删除,重新创建)
  • 合理的key设计配合批处理API 结构:表名:PK:字段名=字段值 存:MSET 取:MGET

数值操作

  • INCRBY key increment
  • INCR key increment
  • DECR key
  • DECRBY 可以保证原子操作 应用场景:
  1. 计数器 替代数据库行锁特性
  2. 分布式序列 分库后替代数据库自增ID 可以通过一次拿一批ID,减少redis交互量

bit操作

GETBIT key offset SETBIT key offset value BITCOUNT key [start] [end] 统计下标范围内值为1的数量 BITOPS op destkey [key…] 多个KEY位运算 OP=AND/OR/XOR/NOT 应用场景:

  1. 分布系统在线用户统计(用户ID是自增,ID对应OFFSET表示在线状态)
  2. 布隆过滤器

2. HASH散列KEY

HashMap<String,HashMap<String,Object>>

  • HSET
  • HSETNX
  • HGET
  • HMSET
  • HMGET
  • HDEL
  • HINCRBY

缓存设计

相比使用STRING类型存储,减少KEY数量 表名 PK:字段名 (表名为KEY) HMSET user 1:name Andy 1:age 18 1:email andy@mail.com HMGET user 1:name 1:age 1:email

  • 凝聚信息,便于管理
  • 避免误操作,减少key冲突
  • 减少内存/IO/CPU消耗

不能用散列KEY替代String的场景

  1. bit类型数据使用散列key无法直接操作
  2. 对数据物理分布有要求的场景, 在redis3.0 的cluster中,使用散列槽,使用crc16对key进行计算以分配到不同的实例,散列KEY会导致一个表的数据全部被分配在一个实例上

应用场景

  1. 购物车 加购物车 HINCRBY userID:shoppingCart goodsID count 查询 HGETALL userID:shoppingCart 降低ORM曾IO操作,降低时延

3. LIST有序集合

HashMap<String,List>

操作

  • LPUSH key value 压入元素
  • RPUSH key value
  • LPOP key 弹出元素
  • RPOP key
  • LRANGE key start top (0~-1表示所有元素)获取下表范围元素
  • BLPOP key [key…] timeout 阻塞式弹出元素,如果不存在则等待timeout时长
  • BRPOP

应用场景

  1. 消息队列(点对点) 产生消息 LPUSH 消费消息 BRPOP redis通过sub pub模型实现广播
  2. 关注的最新消息列表 消息保存 LPUSH {ANDY}:SUBCRIBE {MSGID} 最新消息列表获取 LRANGE {ANDY}:SUBCRIBE 0 10 (分页显示10条) 新浪微博160T REDIS集群实现消息列表

4. SET无序不重集合

hashmap<String,HashSet>

操作

  • SADD KEY MEMBER 增加元素
  • SREM KEY MEMBER 删除元素
  • SMEMBERS KEY 获取所有元素
  • SCARD KEY 获取元素个数
  • SISMEMBER KEY MEMBER 判断元素是否存在
  • SRANDMEMBER KEY [COUNT] 选出指定数量的随机元素,不删除
  • SPOP KEY [COUNT] 选出指定数量元素,并删除

应用场景

  1. 抽奖 购买彩票 SADD 抽奖key userid SMEMBERS 抽奖key 获取所有用户 SPOP 抽奖KEY count 抽取数名中奖者
  2. 打卡、签到、点赞 SADD like::topicid userid 点赞 SREM like::topicid userid 取消点赞 SISMEMBER like::topicid userid 判断是否点过赞 SMEMBERS LIKE::TOPICID 获取点赞用户 SCARD LIKE:TOPICID 获取点赞数量

运算

  • SINTER KEY KEY…
  • SINTERSTORE DESTINATION KEY KEY… 结果保存到DEST 并
  • SUNION KEY KEY…
  • SUNIONSTORE DESTINATION KEY KEY… 差
  • SDIFF KEY KEY…
  • SDIFFSTORE DESTINATION KEY KEY…

应用场景:

  1. 用户关注、商品推荐 共同关注 关注的人的关注清单与自身关注清单的交集 SINTER 可能认识的人 关注的人的关注清单与自身关注清单的差集 SDIFF 关注的人也关注 对关注的人逐个判断 SISMEMBER
  2. 商品筛选 打标签 SADD 根据标签筛选 SINTER
  3. 对账 计算账目条目差异 DIFF

5. ZSET 排序集合

底层实现:跳表 每个元素都带有一个分值

操作

  • ZADD KEY SCORE ELEMENT
  • ZREM KEY ELEMENT
  • ZSCORE KEY ELEMENT 获取元素的分值
  • ZINCRBY KEY INCREMENT ELEMENT
  • ZCARD KEY
  • ZRANGE KEY START STOP [WITHSCORES]
  • ZREVRANGE KEY START STOP [WITHSCORES]

运算

  • ZUNIONSTORE
  • ZINTERSTORE

应用场景

  1. 销售业绩 合计不同门店所有商品的销售数量 ZUNIONSTORE
  2. 单日排行榜 新闻热度就是分值 点击 ZINCRBY hotnews:date 1 newsId 获取排名前15 ZREVRANGE hotnews:date 0 15 withscores
  3. 周、月、年排行榜 ZUNIONSTORE
  4. 定时任务数据源 用分值表示下次运行的时间 获取当前需要执行的任务 ZRANGEBYSCORE JOB 0 {CURRENTTIMEMILLIS} WITHSCORETIMES 移除执行完的JOB ZREM JOBXXX

0 人点赞