• 【Mybatis】Mybatis 二级缓存 @CacheNamespace 注解介绍


    引言

    @CacheNamespace 是用于在 Mapper 接口上,配置该 Mapper 的二级缓存参数,这样每一个 Mapper 都可以自定义二级缓存的配置。


    使用示例

    package com.test.mapper;
    
    import org.apache.ibatis.annotations.CacheNamespace;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    @CacheNamespace(size = 512) // 配置缓存大小为 512
    public interface UserMapper {
    
    }
    
    

    @CacheNamespace 属性介绍

    implementation 缓存实现类

    implementation 用于指定缓存实现类,MyBatis 提供了默认的实现 PerpetualCache,它是一个简单的、永久存储的缓存实现,我们也可以指定自定义的缓存实现类,比如,我们也可以使用 Redis 实现,首先先实现 Cache 接口,实现该接口的方法,然后操作 Redis 即可。

    public class UserRedisCache implements Cache {
        // 自定义 Redis 缓存实现
    }
    
    @CacheNamespace(
        implementation = UserRedisCache.class
    )
    public interface UserMapper {
    
    }
    

    eviction 指定缓存回收策略

    MyBatis 提供了几种常用的回收策略,例如 LRU(最近最少使用)、FIFO(先进先出)和 SOFT(软引用)。

    LRU 是在缓存空间不足时,优先移除那些最近最少使用的缓存项。换句话说,当缓存满了,需要腾出空间时,会优先移除最近最不常访问的数据。
    优点:能有效提高缓存的命中率,适合访问频率有明显差异的场景。
    缺点:实现相对复杂,维护一个按访问时间排序的数据结构需要一定的开销。

    FIFO 是在缓存空间不足时,优先移除最早加入缓存的数据项。即按照数据进入缓存的顺序进行回收。
    优点:实现简单,不需要复杂的数据结构。
    缺点:无法适应访问频率变化大的场景,可能会移除仍然频繁使用的数据。

    SOFT 是一种利用 Java 语言特性的缓存回收策略。它会在 JVM 内存不足时回收缓存中的对象,而不是在缓存空间满时立即回收。使用软引用的对象在内存充足时不会被回收,只有在 JVM 内存不足时才会被垃圾回收器回收。
    优点:能更好地利用内存,当内存充足时可以缓存更多的数据,适合对内存敏感的应用。
    缺点:不可预测回收时间,可能会导致缓存命中率较低。

    示例

    // LRU 回收
    @CacheNamespace(
        eviction = org.apache.ibatis.cache.impl.LruCache.class
    )
    public interface UserMapper {
    }
    
    // FIFO 回收
    @CacheNamespace(
        eviction = org.apache.ibatis.cache.impl.FifoCache.class
    )
    public interface UserMapper {
    }
    
    // SOFT 回收
    @CacheNamespace(
        eviction = org.apache.ibatis.cache.impl.SoftCache.class
    )
    public interface UserMapper {
    }
    

    size 缓存空间大小

    size 用于设置缓存的大小,即缓存中可以存储的对象数量。超过这个数量后,将根据回收策略进行缓存对象的回收,以腾出空间存储新的缓存对象。这样的话,我们就能限制缓存占用的内存,以避免缓存占用过多内存资源。

    @CacheNamespace(
        size = 512 // 缓存大小为 512
    )
    public interface UserMapper {
    
    }
    

    readWrite 读写模式

    readWrite 用于指定缓存是否为读写模式。如果为 true,MyBatis 会对缓存中的对象进行序列化和反序列化,以确保缓存中的对象是线程安全的。默认值为 true。
    然后我们需要保证缓存中的对象是线程安全的,那么就设置为 ture 即可,如果不需要保证,只想要效率,那就设置成 false。大多数的环境下都是设置 fasle 即可。

    @CacheNamespace(
        readWrite = true // 开启读写缓存
    )
    public interface UserMapper {
    
    }
    




    End


  • 相关阅读:
    【NLP】使用 BERT 和 PyTorch Lightning 进行多标签文本分类
    Element Plus el-select选择框失去焦点blur
    k8s概念之GVK与GVR
    【操作系统】 用户态&内核态内存映射
    docker 安装 nginx 镜像 保姆级别教程
    SQL多表连接
    贪心算法篇——经典题型
    子不语发生工商变更:注册资本增至3000万元,预计全年净利润下滑
    数据结构与算法7-递归、分治、回溯
    神经网络图用什么软件做,图神经网络 图像处理
  • 原文地址:https://blog.csdn.net/weixin_43657300/article/details/139329765