Comments (4)
这个想法很好,但目前在l2cache中并没有实现类似缓存双删的功能,不过有提供缓存删除的接口,可在业务逻辑中调用。
目前我想到的有如下几种实现方式:
1、缓存双删模式:先删缓存,再写DB,再删缓存【不建议使用】
可能网上有很多这方面的资料,业务侵入严重,硬编码,个人觉得实现起来较为麻烦,不建议使用。
2、先写再删模式:先写DB,再删缓存【建议使用】
实时性较好的一种方案,实现相对简单,缓存更新快速,但业务侵入严重,硬编码,极端情况下可能存在短时间的不一致(个人理解是可以接受的)。适用于大部分高并发场景。
高并发场景下,删除模式,会导致请求穿透到DB,对性能有一定影响。
3、双写模式:先写DB,再写缓存【建议使用】
实时性最好的一种方案,实现相对简单,缓存更新快速,但业务侵入严重,硬编码,且容易出现遗漏。适用于大部分高并发场景。
并发更新场景下,可能出现ABA的问题。实际业务中,并发修改同一个数据的情况多吗?是否可以在业务角度下进行控制呢?同一个时刻只允许一个修改操作?
4、binlog异步写入模式:先写DB,再监听binlog,投递到MQ,消费MQ并异步写入缓存【建议使用】
无业务侵入,无硬编码,通用方案,但实现相对复杂,构建binlog系统,且要接受一定的延迟(受主从同步速度的影响)。保证最终一致性,不保证实时性。
我这边实际上是,第三和第四这两种模式在混合使用。
另外,前三种模式,都存在业务入侵的问题,目前初步的想法是在l2cache中,通过自定义注解的方式,将对缓存的删除或更新操作抽象出来,从而达到与业务解耦的目的。
当然,这里可能会引入一些新的问题需要我们去解决。比如,一个业务场景中含多个业务维度的数据更新,此时,如何保证多个缓存维度和业务数据的数据一致性,等等。
希望以上内容,对你有一些帮助。
from l2cache.
1、看了下spring-enhanced-cache的源码,确实挺好的,也很清晰,它实现的思路值得借鉴下。
2、不建议直接在spring-cache这层去实现自定义逻辑,因为对于l2cache而言,spring-cache只是一个上层应用,l2cache可以独立使用。
3、因此,建议直接在l2cache的 com.github.jesse.l2cache.Cache
这个层级上去实现我们自定义的逻辑,会更加的通用。
4、自定义的逻辑这里,可以借鉴下spring-enhanced-cache
里面的实现方式,如它对cache的包装,然后自定义的包装类中进行增强。当然,这里要特别注意,要实现的通用一些,因为如双删模式、先写后删模式、延迟双删模式等等都只是一种自定义逻辑而已。
5、l2cache中具体如何实现呢?定义一个 com.github.jesse.l2cache.Cache
的包装类来进行增强即可。
from l2cache.
非常感谢您的详细解答,这对我理解这个问题和选择方案都很有帮助。
我发现了这个项目,通过将Cache包装为一个持有监听器的Cache来实现延迟删除。具体地,当删除缓存时,监听器将缓存删除事件包装为一个延迟的操作,推到延迟队列;用一个守护线程去轮询该队列,取出延迟时间到达的删除操作,交给线程池异步执行。这样在业务代码中使用先写再删模式,配合spring的CacheEvict
注解,就可以实现缓存双删。您觉得这个方案如何?
from l2cache.
由于时间关系,暂时没有精力去实现这个功能,如果比较着急的话,建议你自己开发实现,开发完成后,欢迎提交一个PR。
from l2cache.
Related Issues (19)
- jar 包下载不了 HOT 3
- cn.weeget.hotkey:weeget-infinite-hotkey-client HOT 2
- 如何优雅扩展多租户特性 HOT 2
- 请问批量删除缓存是怎么操作的,对象的话给出其中几个字段是怎么命中的 HOT 2
- Do you hava Spring boot3 plan recently. HOT 1
- Spring boot version 2.7.6 java.lang.ClassNotFoundException HOT 1
- 还在维护吗?更新频率有点低呀 HOT 1
- redis 一直sendPing问题 HOT 1
- 目前支持最高的springboot版本是多少? HOT 10
- 这么多Redis广播消息,是不是该注意一下client-output-buffer-limit pubsub 参数的配置 HOT 2
- 热点探测 HOT 4
- 谁在使用 L2Cache?
- SpringCache的sync=false情况下刷新问题 HOT 2
- 可能出现一级缓存和二级缓存不一致 HOT 3
- 缓存需要添加遍历KEYS的实现 HOT 1
- 请问一下nullValueCache目前的作用是什么?感觉只有在查询出空置的时候会put一下,但从未查询 HOT 1
- 能不能把包上传到maven公共仓库 HOT 2
- weeget-infinite-hotkey-client HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from l2cache.