欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析SpringBoot整合Mybatis如何實現(xiàn)二級緩存

 更新時間:2025年05月15日 10:35:10   作者:哪里的破水瓶  
二級緩存,是指多個Sqlsession之間共享數(shù)據(jù),但是也可以使用Redis這樣的緩存作為存儲點,但是不支持mybatisplus 里的方法,本文我們就來聊聊SpringBoot整合Mybatis實現(xiàn)二級緩存的相關(guān)方法吧

mybatis 原生

二級緩存,是指多個Sqlsession之間共享數(shù)據(jù),但是也可以使用Redis這樣的緩存作為存儲點。 但是不支持mybatisplus 里的方法。

處理類,用于攔截mapper緩存。

import org.apache.ibatis.cache.Cache;
public record MybatisRedisCache(String id) implements Cache {

    private static final StringRedisTemplate redisTemplate;

    static {
        redisTemplate = SpringUtil.getBean(StringRedisTemplate.class);
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void putObject(Object key, Object value) {
        if (value != null) {
            redisTemplate.opsForValue().set(getKey(key), JSONUtil.toJsonStr(value));
        }
    }

    @Override
    public Object getObject(Object key) {
        String string = redisTemplate.opsForValue().get(getKey(key));
        if (string == null) return null;
        return isArray(string);
    }

    @Override
    public Object removeObject(Object key) {
        String redisKey = getKey(key);
        Object value = redisTemplate.opsForValue().get(redisKey);
        redisTemplate.delete(redisKey);
        return value;
    }

    @Override
    public void clear() {
        redisTemplate.delete(Objects.requireNonNull(redisTemplate.keys(getKey("*"))));
    }

    @Override
    public int getSize() {
        return 0;
    }

    private String getKey(Object key) {
        return id + ":" + key.hashCode();
    }

    public Object isArray(String str) {
        JSON json = JSONUtil.parse(str);
        if (json instanceof cn.hutool.json.JSONArray) {
            // 是數(shù)組
            return JSONUtil.toList((cn.hutool.json.JSONArray) json, Object.class);
        }
        if (json instanceof cn.hutool.json.JSONObject) {
            // 是對象
            return JSONUtil.toBean((cn.hutool.json.JSONObject) json, Object.class);
        }
        throw new RuntimeException("緩存數(shù)據(jù)格式錯誤");
    }

}

mapper xml

一定要加 cache-ref 才能進(jìn)行二級緩存

<mapper namespace="com.example.dao.UserMapper">

    <cache-ref namespace="com.example.dao.UserMapper"/>

    <select id="selectAll" resultType="com.example.Demo">
        select *
        from demo
    </select>
</mapper>

配置 CacheNamespace 使用就可以了

@CacheNamespace(implementation = MybatisRedisCache.class)
public interface UserMapper extends BaseMapper<Demo> {

    List<Demo> selectAll();

}

Spring Cache

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)) // 默認(rèn)緩存 10 分鐘
                .disableCachingNullValues() // 避免存入控制
                .serializeValuesWith( // 設(shè)置序列化
                        RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
                );
        // 返回
        return RedisCacheManager.builder(factory).cacheDefaults(config).build();
    }

}

Cacheable 緩存、CacheEvict 刪除,拼接 key

@Service
public class DemoService extends ServiceImpl<UserMapper, Demo> {

    @Cacheable(value = "user:cache", key = "#id")
    public Demo getOne(Long id) {
        return getById(id);
    }


    @Caching(evict = {
            @CacheEvict(value = "user:cache", key = "#id"),
            @CacheEvict(value = "user:all", allEntries = true)}
    )
    public void deleteById(String id) {
        removeById(id);
    }

    // 更新數(shù)據(jù)后刷新緩存
    @Caching(
            put = {@CachePut(value = "user:cache", key = "#demo.id", unless = "#result == null")},
            evict = {@CacheEvict(value = "user:all", allEntries = true)}
    )
    public void updateUser(Demo demo) {
        updateById(demo);
    }

    @Cacheable(value = "user:all")
    public List<Demo> listDemo() {
        return list();
    }

}

到此這篇關(guān)于淺析SpringBoot整合Mybatis如何實現(xiàn)二級緩存的文章就介紹到這了,更多相關(guān)SpringBoot Mybatis二級緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用BigDecimal進(jìn)行運算封裝的實際案例

    Java使用BigDecimal進(jìn)行運算封裝的實際案例

    今天小編就為大家分享一篇關(guān)于Java使用BigDecimal進(jìn)行運算封裝的實際案例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Spring?boot?集成?MQTT詳情

    Spring?boot?集成?MQTT詳情

    這篇文章主要介紹了Spring?boot?集成?MQTT詳情,MQTT是一種基于發(fā)布/訂閱模式的"輕量級"通訊協(xié)議,可以以極少的代碼和有限的帶寬為連接遠(yuǎn)程設(shè)備提供實時可靠的消息服,下文更多相關(guān)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • springboot?使用?minio的示例代碼

    springboot?使用?minio的示例代碼

    Minio是Apcche旗下的一款開源的輕量級文件服務(wù)器,基于對象存儲,協(xié)議是基于Apache?License?v2.0,開源可用于商務(wù),本文給大家介紹下springboot?使用?minio的示例代碼,感興趣的朋友看看吧
    2022-03-03
  • Spring?Boot實現(xiàn)分布式任務(wù)調(diào)度的步驟

    Spring?Boot實現(xiàn)分布式任務(wù)調(diào)度的步驟

    Spring?Boot提供了一些工具和框架,可以幫助我們輕松地實現(xiàn)分布式任務(wù)調(diào)度,在本文中我們將介紹如何使用Spring?Boot、Spring?Cloud、Quartz和Redis來實現(xiàn)分布式任務(wù)調(diào)度,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • idea使用pagehelper實現(xiàn)后端分頁功能的步驟詳解

    idea使用pagehelper實現(xiàn)后端分頁功能的步驟詳解

    這篇文章主要介紹了idea使用pagehelper實現(xiàn)后端分頁功能的步驟,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 詳解SpringCloud-Alibaba-Seata分布式事務(wù)

    詳解SpringCloud-Alibaba-Seata分布式事務(wù)

    這篇文章主要介紹了SpringCloud-Alibaba-Seata分布式事務(wù)的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Spring Boot如何優(yōu)雅的使用多線程實例詳解

    Spring Boot如何優(yōu)雅的使用多線程實例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot如何優(yōu)雅的使用多線程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot整合Shiro的方法詳解

    SpringBoot整合Shiro的方法詳解

    Apache?Shiro是一個java安全(權(quán)限)框架,Shiro可以非常容易的開發(fā)出足夠好的應(yīng)用,其不僅可以用在javase環(huán)境,也可以用在javaee環(huán)境。本文介紹了SpringBoot整合Shiro的方法,需要的可以參考一下
    2022-05-05
  • 提升性能秘密武器Java Unsafe類面試精講

    提升性能秘密武器Java Unsafe類面試精講

    這篇文章主要為大家介紹了提升性能秘密武器Java Unsafe類面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • java自帶排序使用

    java自帶排序使用

    這篇文章主要給大家分享了java自帶排序使用,該方法是升序排序,方法的內(nèi)部采用了快排實現(xiàn),但該方法是?穩(wěn)定的。下面一起來看看文章的詳細(xì)介紹吧
    2021-12-12

最新評論