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
可以保证原子操作
应用场景:
- 计数器
替代数据库行锁特性 - 分布式序列
分库后替代数据库自增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
应用场景:
- 分布系统在线用户统计(用户ID是自增,ID对应OFFSET表示在线状态)
- 布隆过滤器
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的场景
- bit类型数据使用散列key无法直接操作
- 对数据物理分布有要求的场景, 在redis3.0 的cluster中,使用散列槽,使用crc16对key进行计算以分配到不同的实例,散列KEY会导致一个表的数据全部被分配在一个实例上
应用场景
- 购物车
加购物车 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
应用场景
- 消息队列(点对点)
产生消息 LPUSH
消费消息 BRPOP
redis通过sub pub模型实现广播 - 关注的最新消息列表
消息保存 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] 选出指定数量元素,并删除
应用场景
- 抽奖
购买彩票 SADD 抽奖key userid
SMEMBERS 抽奖key 获取所有用户
SPOP 抽奖KEY count 抽取数名中奖者 - 打卡、签到、点赞
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…
应用场景:
- 用户关注、商品推荐
共同关注 关注的人的关注清单与自身关注清单的交集 SINTER
可能认识的人 关注的人的关注清单与自身关注清单的差集 SDIFF
关注的人也关注 对关注的人逐个判断 SISMEMBER - 商品筛选
打标签 SADD
根据标签筛选 SINTER - 对账
计算账目条目差异 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
应用场景
- 销售业绩
合计不同门店所有商品的销售数量 ZUNIONSTORE - 单日排行榜
新闻热度就是分值
点击 ZINCRBY hotnews:date 1 newsId
获取排名前15 ZREVRANGE hotnews:date 0 15 withscores - 周、月、年排行榜
ZUNIONSTORE - 定时任务数据源
用分值表示下次运行的时间
获取当前需要执行的任务 ZRANGEBYSCORE JOB 0 {CURRENTTIMEMILLIS} WITHSCORETIMES
移除执行完的JOB ZREM JOBXXX