redis数据结构和应用场景
- string HashMap<String,Object>
- 分布式锁 setnx (Set If Not Exist) set mset mget del
- 合理的key设计 存储多个key代替json
- 分布式计数器 incryby(key数值相加) decyby(key数值相减) incr(自加1) decr(自减1)
- incryby 一次性拿多个数值存入本地内存
- 在线用户统计/签到打卡 bitmap getbit setbit bitcount bittops
- 分布式锁 setnx (Set If Not Exist) set mset mget del
- hash(key field value) HashMap<String,HashMap<String,Object>>
- 底层数据结构 ziplist hashtable
- hset hsetnx hget hmset hmget hdel hincrby
- 便于管理
- 减少IO
- 减少key冲突/减少外层key数量
- 不能使用场景
- 集群数据分布 会倾斜于一台机器
- 对value直观的操作时
- 购物车
- hincrby userid:shoppingcart goodsid count
- hgetall userid:shoppingcart 购物车商品
- hget userid:shoppingcart goodsid 商品数量
- hlen userid:shoppingcart 商品总数
- list HashMap<String,List>
- lpush/lpop左边 rpush/rpop右边 lrange 0 -1 拿出所有元素
- 消息队列(brpop/blpop 阻塞弹出)
- 关注的最新的消息列表(微博/朋友圈/新闻app)
- 每个人有关注的key push到相关key的消息
- 获取到粉丝列表的userid后进行lpush操作
- lpush {andy}:subscribe {msgID}
- lrange取分页数据前几条 lrange {andy}:subscribe {msgID}
- 每个人有关注的key push到相关key的消息
- set HashMap<String,HashSet>
- sadd srem srandmember(随机返回集合一个/多个随机元素) SPOP(随机返回并移除集合一个/多个随机元素) sinter交 sunion并 sdiff差
- 刷礼物/转发微博 抽奖
- sadd key {userid}
- smember 获取所有用户 滚动转起来
- spop 中奖userid 或者 srandmember count几名中奖
- 点赞/签到/打卡
- 点赞 取消点赞 检测是否点赞 点赞用户 点赞用户数
- 用户关注/商品推荐
- 打开u1的主页
- 共同关注 sinter me u1
- 我关注的人也关注u1 拿出自己的关注数据 逐个SISMEMBER(判断成员元素是否是集合的成员)
- 我可能认识的人 sdiff
- 打开u1的主页
- 商品筛选
- 手机 sdiff
- 屏幕寸尺
- cpu
- 系统
- 手机 sdiff
- zset HashMap<String,HashSet>
- 底层数据结构 ziplist skiplist(字典 跳跃表)
- zadd zrem zscore zincrby(指定成员的分数加上指定增量) zrange(返指定区间内的成员) zinter交 zunion并
- 某日销售业绩排序/多日销售业绩 周榜/月榜/年榜
- zunion
- 在线用户活跃度
- 过期时间作为score
- 单日排行耪 周榜/月榜/年榜
- 百度热榜
- 点击一次 zincrby 1
- 获取top10 zrevrange (返回有序集指定区间内按分数递减)
- 百度热榜