Redis应用技巧和案例

特点

非可靠的非关系型数据库

提供数据结构服务

使用方法

Key的设置


incr NUM:count:pv:bac.com/a/123:2019:07:01

key最好可视性好

NUM 数据类

count 技术

pv 干什么的

bac.com/a/123 地址

2019:07:01 时间

对象存储


hmset H:cache:userinfo:105 username qer nicnamne error404 sex 1 age 18

undefined

 hgetall H:cache:userinfo:105

Redis的集合

  • set

  • zset

  • 消息队列,只能发送字符消息,

案例

PV的统计


incr NUM:count:pv:bac.com/a/123:2019:07:01

key最好可视性好

NUM 数据类

count 技术

pv 干什么的

bac.com/a/123 地址

2019:07:01 时间

在Web入口使用

设置实时关注的东西比较适合redis,

但最好每天取出数据进行校准和持久化

月活

一个软件中每个用户一个月使用的天数


undefined

incr NUM:count:pv:bac.com/a/123:2019:07:01

undefined

bitcount BIT:count:MAU:guid:105:2019:07

订票(电影订票问题)

通过位图来表示座位

通过不同位图的组合表示座位的状态

当天销售额的统计也可以通过redis来做

缓存-触发式更新机制

一旦有数据更新,优先插入数据库,生效后放入redis

先查redis再查数据库

秒杀场景

  • 消息队列->并行转串行,大部分电商解决方案,先排队,后处理,处理结果通过SSE提示,需要搭建SSE,消息中间件

  • 低成本redis的list形式,将秒杀的货物放入list中(lpush),有人秒杀,则pop,pop失败则表示秒杀失败

解决高插入场景的分页查询问题

在分页查询时,点击下一页后,插入数据,查询结果可能还是包含旧结果或是引发逻辑混乱

解决方案

  • 先进行查询,再进行查询前先把插入数据数据offset(需要先count)移动一下(但在count时可能还有数据插入,所以在大量插入时还是可能出现这个问题)(BAD)

  • 查询加入时间戳(BAD)

    • 但毫秒级的时间戳还是可能存在大量数据插入也无法解决
  • 采用缓存为每个用户存储其查询数据,再在查询结果中进行分页(OK)

  • 倒序查找(逆序输出)分页处理(关系型数据库的解决)(OK)

  • 利用Redis存储要查询数据的ID【以Redis作为索引,没有ES或mongodb的情况下】,查询出的数据放入Redis,rpush加入数据,Lrange取出对应数据。lrang key llen-x llen(OK)

发布了142 篇原创文章 · 获赞 70 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/zhaoenweiex/article/details/96215600