后端redis缓存逻辑问题?

各位后端大佬,最近接触redis。
业务场景是这样的,一个最简单的博客系统,我现在需要记录 文章的点赞总数 以及用户是否点过赞。
之前是用MySQL去做的很简单。现在我想用redis去做有以下一些疑惑:
假如A用户点完赞,点赞信息存在Redis。A用户刷新页面重新请求页面,后端从MySQL进行查询数据,但是那时候A用户的redis数据还没同步到MySQL(一天一同步,还是说多少时间最好),我是不是要循环MySQL查询出来的数据列表的同时再去Redis判断用户对当前循环的文章id是否点过赞?并且将MySQL的文章总数加上Redis记录的点赞总数再返回给前端吗?我不知道这样设计是不是对的。

阅读 3.2k
3 个回答

对 redis 的理解完全错误

redis 充当什么角色?缓存!

A用户刷新页面重新请求页面,后端从MySQL进行查询数据,但是那时候A用户的redis数据还没同步到MySQL(一天一同步,还是说多少时间最好)—— 完全错误,不存在『先 redis ,然后 redis 同步到 mysql 』这种荒唐的事情。

正确的做法,cache aside

关于 cache aside ,具体看:https://zhuanlan.zhihu.com/p/...

你要读取数据:

  • 就先去 redis 看看有没有
  • 有,就返回
  • 没有,就去 mysql 读取,并将结果写入 redis,返回

你要写数据:

  • 先写入 mysql
  • 然后删除 redis 中的数据

操作错了,既然你加入了redis,那么读写都要优先从redis里操作,如直接从数据库读写,那么数据是不可靠的,错误的!

正确做法

项目启动后,所有的用到了redis的地方,都要优先从redis里读/写数据
如redis内不存在,才从数据库读,并缓存至redis
这样下次读取操作,才会从redis读到正确数据

我的思路:
在原来的方案上,insert完mysql后,增加redis缓存的代码
1、点赞总数:文章ID(key):点赞数(value)。点赞加,取消赞减。
2、用户是否点过赞:文章ID+用户ID(key):1赞,0取消赞。
前端传过来文章ID和用户ID时,先从redis里去查询相应的值,查询到了,直接返回给前端。如果没有查询到,就去数据库里查询,更新redis,然后返回给前端。


你可以了解下redis的集合(set),通过set数据类型来存储或查询点赞信息。
sadd wzdz_001 yh001 -- 给001文件添加yh001用户
sadd wzdz_001 yh002 -- 给001文件添加yh002用户

scard wzdz_001 -- 获取文章点赞数

sismember wzdz_001 yh001 -- 判断yh001是否给wzdz_001点过赞

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题