蛋疼的 Redis 和需求...我想问下各位都是怎么实践 Redis 和 Mysql 数据一致性的或者怎么骂回去?

2020-12-17 12:17:08 +08:00
 Aruforce

1.目前基本技术栈

  1. SpringMVC
  2. Mybatis
  3. Redis

2.基本代码实践思路

  1. 数据更新完全在 Mysql 事务之中 不会读取更新缓存
  2. 现在 Redis 只是用来做接口缓存(数据有有效期,Key 根据 API 入口参数建立,value 就是 Mysql 查询的结果)

3. 目前提出的需求及存在的问题

  1. Mysql 数据更新之后 要求全部的接口必须和数据库一致
  2. 现在的接口返回的数据有很多连表查询,所以 mybatis 全局缓存并不好使。。同一个 namespace 的连表查询结果在表数据更新后缓存会被删除但是其他的 namespace 不行。。所以不好使
  3. 老板不懂开发
  4. 如果能做给的实践也不算长

4.我该怎么处理?

  1. 无法完成缓存强一致性,完成不了需求。。这个不太好。。不过有好的说服的理由的话我也试试
  2. 统计在任何一个表数据更新之后需要删除关联查询接口的缓存? 这个工作量太大了
  3. 或者各位给我们一个好的 Redis 缓存实践? Redis 做接口缓存自我感觉也不太好

我倾向与 1 和 3
一个是不做。。
一个是 能争取实践或者我能学点东西。。。

2 太他么的蛋疼了

8779 次点击
所在节点    程序员
71 条回复
EminemW
2020-12-17 12:25:08 +08:00
弄个定时任务主动刷不就好了,如果是手动修改数据的,就弄个刷缓存按钮
jones2000
2020-12-17 12:26:40 +08:00
redis 存储的时候增加查询的数据库表名, 数据更新了, 把 redis 里面涉及到这个表的缓存全部删了.
Aruforce
2020-12-17 12:28:40 +08:00
@EminemW
你走的还是 2 这个思路..不是不行 就是工作量大...
而且 以后还或有新的连表查询加入....
老代码还要跟着改...
ningmengmao
2020-12-17 12:29:08 +08:00
spring cache 应该可以吧
Aruforce
2020-12-17 12:36:53 +08:00
@jones2000 这相当于一个把 关联数据的删除不和老业务代码合在一起了 可以做成一个切面逻辑只用把变更的表名弄出来就行然后直接扫描 redis key 然后删除...这应该算是 2 的变种
sagaxu
2020-12-17 12:38:37 +08:00
先撤掉 redis,mysql 内存加大点,看看性能是不是真的扛不住
Aruforce
2020-12-17 12:42:27 +08:00
@sagaxu mysql 调整过。。模拟线上流量 压测过了不行... 如果不对接口拦截的服务全是超时和 500 傻的
cz5424
2020-12-17 12:45:18 +08:00
在 db 层做 hook,查询优先命中缓存,修改删除缓存(没写过 java
cz5424
2020-12-17 12:46:04 +08:00
多表查询要拆分查询,这个比较麻烦
k9982874
2020-12-17 12:46:17 +08:00
根据经验 redis 缓存做到接口级别,记录级别做不了。你做的再好,一个批量条件 update 或者 delete 就废了。
除非你把每次 update 受到影响的记录都重新查出来写入 redis,不过这本身就是个性能问题。

同等楼下大佬给个解答。
sadfQED2
2020-12-17 12:47:24 +08:00
我司方案,所有接口数据直接读 redis 。

有一个 worker 监听 mysql binlog,根据 mysql binlog 生成 redis 中的新数据
sagaxu
2020-12-17 12:51:17 +08:00
@Aruforce 强一致性基本不太现实,无论是 write back 还是 write through,都有一定的 delay,扫描一次 key 可能就要几十秒了,并不比超时更快。
Aruforce
2020-12-17 12:54:03 +08:00
@cz5424 你说的这个就是
> 可以做成一个切面逻辑只用把变更的表名弄出来就行然后直接扫描 redis key 然后删除.。。
这一段... 基本原理
Aruforce
2020-12-17 12:56:02 +08:00
@sadfQED2 binlog 转到 redis 也是有延时的。。。而且对以前的接口都要改。。。不现实。。。
sampeng
2020-12-17 12:57:25 +08:00
什么毛病,自己实现的技术方案满足不了需求不去想办法解决,而是选择怼回去,跳槽,消极怠工?新一代程序员这么不堪了?
des
2020-12-17 12:58:07 +08:00
不用连表查询,在内存中进行连接呢?
Aruforce
2020-12-17 12:59:28 +08:00
@sadfQED2 而且连表查询 会十分胃疼
Aruforce
2020-12-17 13:00:56 +08:00
@des 不可能的。。。已经有很多连表查询了 这些不可能有时间重写
Aruforce
2020-12-17 13:03:51 +08:00
@sagaxu 如果没有 更好的实短时间完成的方案的话。。。我先就先推降低缓存有效期了。。。再不行就是做 mapper 的 hook 再不行就禁止写连表查询。。把连表操作转到内存里去了
Aruforce
2020-12-17 13:05:49 +08:00
@sampeng 你要是能给解决方案就给。。。别一上来的就这指责别人的态度。。就像个老娘们似的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/736322

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX