Giter Club home page Giter Club logo

Comments (4)

ck-jesse avatar ck-jesse commented on June 2, 2024 2

这个想法很好,但目前在l2cache中并没有实现类似缓存双删的功能,不过有提供缓存删除的接口,可在业务逻辑中调用。

目前我想到的有如下几种实现方式:

1、缓存双删模式:先删缓存,再写DB,再删缓存【不建议使用】
可能网上有很多这方面的资料,业务侵入严重,硬编码,个人觉得实现起来较为麻烦,不建议使用。

2、先写再删模式:先写DB,再删缓存【建议使用】
实时性较好的一种方案,实现相对简单,缓存更新快速,但业务侵入严重,硬编码,极端情况下可能存在短时间的不一致(个人理解是可以接受的)。适用于大部分高并发场景。
高并发场景下,删除模式,会导致请求穿透到DB,对性能有一定影响。

3、双写模式:先写DB,再写缓存【建议使用】
实时性最好的一种方案,实现相对简单,缓存更新快速,但业务侵入严重,硬编码,且容易出现遗漏。适用于大部分高并发场景。
并发更新场景下,可能出现ABA的问题。实际业务中,并发修改同一个数据的情况多吗?是否可以在业务角度下进行控制呢?同一个时刻只允许一个修改操作?

4、binlog异步写入模式:先写DB,再监听binlog,投递到MQ,消费MQ并异步写入缓存【建议使用】
无业务侵入,无硬编码,通用方案,但实现相对复杂,构建binlog系统,且要接受一定的延迟(受主从同步速度的影响)。保证最终一致性,不保证实时性。

我这边实际上是,第三和第四这两种模式在混合使用。

另外,前三种模式,都存在业务入侵的问题,目前初步的想法是在l2cache中,通过自定义注解的方式,将对缓存的删除或更新操作抽象出来,从而达到与业务解耦的目的。
当然,这里可能会引入一些新的问题需要我们去解决。比如,一个业务场景中含多个业务维度的数据更新,此时,如何保证多个缓存维度和业务数据的数据一致性,等等。

希望以上内容,对你有一些帮助。

from l2cache.

ck-jesse avatar ck-jesse commented on June 2, 2024 1

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.

Gerrit1999 avatar Gerrit1999 commented on June 2, 2024

非常感谢您的详细解答,这对我理解这个问题和选择方案都很有帮助。

我发现了这个项目,通过将Cache包装为一个持有监听器的Cache来实现延迟删除。具体地,当删除缓存时,监听器将缓存删除事件包装为一个延迟的操作,推到延迟队列;用一个守护线程去轮询该队列,取出延迟时间到达的删除操作,交给线程池异步执行。这样在业务代码中使用先写再删模式,配合spring的CacheEvict注解,就可以实现缓存双删。您觉得这个方案如何?

from l2cache.

ck-jesse avatar ck-jesse commented on June 2, 2024

由于时间关系,暂时没有精力去实现这个功能,如果比较着急的话,建议你自己开发实现,开发完成后,欢迎提交一个PR。

from l2cache.

Related Issues (19)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.