蛋疼的 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 太他么的蛋疼了

9256 次点击
所在节点    程序员
71 条回复
cuiweieee
2020-12-18 10:19:03 +08:00
修改数据用 mq 异步通知,mq 消费之后刷 redis
RedBeanIce
2020-12-18 10:48:28 +08:00
@hhyyd #38 请问一个问题,spring cache 可以插入不是 string 类型的吗,,因为我看到底层调用的是 sring,不知道是否可以插入 list set hash zset
iceneet
2020-12-18 11:14:55 +08:00
感觉用 redis 缓存要求强一致性有点怪
ZSeptember
2020-12-18 11:17:08 +08:00
缓存和强一致冲突。
v2orz
2020-12-18 11:39:08 +08:00
换一个内存数据库代替 mysql,去掉 redis
zhangfeiwudi
2020-12-18 12:17:49 +08:00
我最近在做这一块
zhangfeiwudi
2020-12-18 12:18:49 +08:00
@zhangfeiwudi 主要就是做个触发式缓存,db 更新了 发 q 或者监听胖消息通知 cache , 然后所有 cache 收口到一个团队来吐出 比如说我们有 innerapi 接口
xiaotanyu13
2020-12-18 14:03:02 +08:00
把读多写少被连表又多的数据常驻 redis,放弃 @cache,自己写代码维护这类数据;
连表查的数据的话就看情况了,如果要查的数据能从 redis 中取到,就可以少一次连表查询(指的是部分数据直接取 redis 中的数据就够了),然后剩余的数据从数据库查询
更新的话 先更新 mysql,再更新 redis,如果 redis 更新失败,直接抛异常 让 mysql 回滚
sakasaka
2020-12-18 14:05:28 +08:00
mysql 性能没有这么不堪,加入缓存必然会有一致性问题,使用各种监听器同步也会增加系统复杂度,如果业务真的对性能和一致性要求高,建议改用别的 nosql 数据库,这个需要结合具体业务。
linoder
2020-12-18 15:47:15 +08:00
要不 …… 了解下 TiDB ?
dawniii
2020-12-18 19:54:39 +08:00
@vindurriel
@xiaotanyu13

写入单行:在 mysql transaction 的最后一步写 redis 如果写入不成功 db 回滚 redis 不是集群的话就强一致了

================================================================================

先更新 mysql,再更新 redis,如果 redis 更新失败,直接抛异常 让 mysql 回滚

==========================================================

极限情况下,redis 成功,mysql 还没 commit 挂了 - -

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

https://tanronggui.xyz/t/736322

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

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

© 2021 V2EX