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

数据类型

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

posted on 2021-01-06 22:36  路过君  阅读(151)  评论(0编辑  收藏  举报

导航