spring的三级缓存如何解决循环依赖

什么是循环依赖? 官方解释 虽然官方提倡使用构造方法来依赖注入,但是构造方法解决不了循环依赖,可以使用setter方法来解决。 个人理解 a对象持有b对象的引用,b对象持有a对象的引用。这样说好像察觉不到问题,可以试想下当我们自己创建a对象时,是不是先要调用a对象的构造方法,然后再进行属性的填充,这才是一个完整的a对象,但是当调用对象a的构造方法后,发现需要先拿到完整的b对象,则需要先完成b对象的创建,然后调用b对象的构造方法,b对象进行属性填充时,发现需要a对象,然后无限的循环下去。。。 ...

August 17, 2023 · 3 min

缓存雪崩,缓存穿透和缓存击穿

数据不一致的原因 缓存或数据库只有一个操作失败 先删数据库数据 再删除缓存数据 先删除缓存数据 再删除数据库数据 多线程(先删缓存,再删数据库) 线程a先删除缓存数据,此时线程b查询数据库,并把旧数据放入缓存,a线程再插入数据库,之后的线程可能只会读到缓存上的旧数据 多线程(先删除数据库,再删除缓存)a线程删除完数据库旧数据到删除缓存这段时间,如果有读操作,那么会读到旧数据,等到a线程更新完缓存,缓存就为新的数据。 数据不一致的解决方案 重试机制 针对第三点 可以让a线程sleep 一小段时间 目的是为了 让像b线程这些查询操作 完成将旧数据放入缓存的操作,之后a线程再更新下缓存,sleep时间需要实测,比较难界定。 ...

February 5, 2023 · 3 min

缓存一致性问题

缓存一致性问题 什么是缓存一致性问题? 在JMM中,每个线程都拥有自己的工作内存(逻辑概念,也叫缓存),通过bus总线与内存交互,也就是说每个线程都有自己的工作内存,可以进行读,写操作。不同线程对同一数据进行读写,就会使工作内存之间和主内存的数据不一致的情况。这时候就需要操作系统制定相关规则来维持工作内存之间和主内存的数据的一致性。 ...

August 4, 2022 · 3 min

mybatis缓存解析

mybatis的缓存 首先来看下mybatis对缓存的规范,规范嘛就是定义的接口啦。 缓存接口 ​ Cache接口 定义了缓存的方法 public interface Cache { /**获取缓存的id * @return The identifier of this cache */ String getId(); /**添加缓存 * @param key Can be any object but usually it is a {@link CacheKey} * @param value The result of a select. */ void putObject(Object key, Object value); /**根据缓存键获取缓存 * @param key The key * @return The object stored in the cache. */ Object getObject(Object key); /**移除缓存 * As of 3.3.0 this method is only called during a rollback * for any previous value that was missing in the cache. * This lets any blocking cache to release the lock that * may have previously put on the key. * A blocking cache puts a lock when a value is null * and releases it when the value is back again. * This way other threads will wait for the value to be * available instead of hitting the database. * * * @param key The key * @return Not used */ Object removeObject(Object key); /** * Clears this cache instance */ void clear(); /** * Optional. This method is not called by the core. * * @return The number of elements stored in the cache (not its capacity). */ int getSize(); /** * Optional. As of 3.2.6 this method is no longer called by the core. * * Any locking needed by the cache must be provided internally by the cache provider. * * @return A ReadWriteLock */ ReadWriteLock getReadWriteLock(); } 实现 ...

November 17, 2021 · 12 min
总访问量 总访客数