数据类型
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