前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis常用数据类型和应用场景

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

作者头像
路过君
发布2021-01-07 17:08:18
6060
发布2021-01-07 17:08:18
举报
文章被收录于专栏:路过君BLOG from CSDN

数据类型

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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据类型
    • 1. String
      • 操作
      • 缓存设计
      • 数值操作
      • bit操作
    • 2. HASH散列KEY
      • 缓存设计
    • 3. LIST有序集合
      • 操作
    • 4. SET无序不重集合
      • 操作
      • 运算
    • 5. ZSET 排序集合
      • 操作
      • 运算
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档