最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot使用redis注解做緩存的基本操作方式

 更新時(shí)間:2023年11月27日 15:19:53   作者:愛紙  
這篇文章主要介紹了springboot使用redis注解做緩存的基本用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot使用redis注解做緩存

在springboot中,我們可以很方便地使用注解來(lái)讓redis為我們的數(shù)據(jù)庫(kù)作緩存

以下為基本步驟

數(shù)據(jù)庫(kù)中的用戶表(主鍵id自增)

 在,創(chuàng)建springboot項(xiàng)目時(shí),我們選中非關(guān)系型數(shù)據(jù)庫(kù)中的redis

項(xiàng)目結(jié)構(gòu):

首先添加連接池的依賴

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.9.0</version>
</dependency>

在配置文件中添加有關(guān)redis的配置:

# redis配置
spring.redis.host=192.168.134.128
spring.redis.port=6379
spring.redis.password=123456
spring.redis.lettuce.pool.min-idle=3
spring.redis.lettuce.pool.max-idle=8
 

之后我們?cè)趩?dòng)類上添加@EnableCaching注解,表示開啟redis緩存托管

現(xiàn)在我們著手來(lái)改造service層

我們準(zhǔn)備五個(gè)方法用于測(cè)試,增刪改查,以及全部查詢,方法的返回值不能隨便寫,由于我們要添加緩存,添加到緩存中的數(shù)據(jù)是根據(jù)方法的返回值來(lái)操作的,所以除了刪除的操作,方法的返回值都要給定成相應(yīng)的對(duì)象

public interface UserService extends IService<User> {
    User saveUser(User user);
    int removeUser(Integer id);
    User updateUser(User user);
    User findById(Integer id);
    List<User> findAll();
}

之后我們?cè)趕ervice實(shí)現(xiàn)類上添加@CacheConfig注解,并給定cacheNames屬性,用于區(qū)分各個(gè)service中間的緩存內(nèi)容,一般建議使用該類的全限定名

之后我們來(lái)到具體的方法上

首先是添加方法,我們需要在方法上添加@CachePut注解,此注解用在添加以及更新的方法上,其中的key屬性,是為了給redis中的key賦值,內(nèi)容自定義,但一般為了key的唯一性,都取參數(shù)對(duì)象的id作為值,此處#user.id表示取方法闡述中的user的id屬性作為值

    @CachePut(key = "#user.id")
    @Override
    public User saveUser(User user) {
        userMapper.insert(user);
        return user;
    }

接下來(lái)是刪除方法,我們需要在方法上添加@CacheEvict注解,此注解一般用在刪除方法上作緩存,key屬性作用與以上相同

    @CacheEvict(key = "#id")
    @Override
    public int removeUser(Integer id) {
        return userMapper.deleteById(id);
    }

修改(更新)方法,使用@CachePut注解

    @CachePut(key = "#user.id")
    @Override
    public User updateUser(User user) {
        userMapper.updateById(user);
        return user;
    }

查詢方法,使用@Cacheable注解

    @Cacheable(key = "#id")
    @Override
    public User findById(Integer id) {
        return userMapper.selectById(id);
    }

接下來(lái)是查詢?nèi)康淖⒔?,此處要注意@Cacheable注解中的key值,我們自定義該值為userAll,但是如果直接寫進(jìn)去,會(huì)被當(dāng)做是變量進(jìn)行識(shí)別。

而我們則希望這個(gè)值是一個(gè)字符串類型,所以我們還需要添加一層單引號(hào),也可以用雙引號(hào)加上轉(zhuǎn)義字符來(lái)實(shí)現(xiàn)

    @Cacheable(key = "'userAll'")
    @Override
    public List<User> findAll() {
        return userMapper.selectList(new QueryWrapper<User>());
    }

但是到此,我們發(fā)現(xiàn)邏輯上出現(xiàn)了問(wèn)題,一旦我們執(zhí)行了增刪改操作,redis中的userAll就會(huì)和數(shù)據(jù)庫(kù)中的不匹配,此時(shí)我們就需要移除redis中的userAll,所以我們?cè)趫?zhí)行增刪改方法時(shí),就需要用到多次redis的緩存操作,此時(shí)我們就需要用到@Caching注解,這里先以增加方法為例

//  @CachePut(key = "#user.id")
    @Caching(
            put = @CachePut(key = "#user.id"),
            evict = @CacheEvict(key = "'userAll'")
    )
    @Override
    public User saveUser(User user) {
        userMapper.insert(user);
        return user;
    }

此處@Caching中的內(nèi)容表示,在先執(zhí)行了往redis中添加操作后,就立即刪除掉redis中userAll這個(gè)key,這里的put和evict屬性的值都是數(shù)組,所以我們可以添加多個(gè)增加(更新)和刪除方法(查詢方法也可以,使用cacheable屬性)

類似得,我們將其他方法也做改造(查詢方法不需要),最終service實(shí)現(xiàn)類的方法如下

// @CachePut(key = "#user.id")// 為添加的值指定id
    @Caching(// 添加多個(gè)緩存操作
            put = @CachePut(key = "#user.id"),
            evict = @CacheEvict(key = "'userAll'")
    )
    @Override
    public User saveUser(User user) {
        userMapper.insert(user);
        return user;
    }
 
    //    @CacheEvict(key = "#id")
    @Caching(
            evict = {@CacheEvict(key = "#id"), @CacheEvict(key = "'userAll'")}
    )
    @Override
    public int removeUser(Integer id) {
        return userMapper.deleteById(id);
    }
 
    //    @CachePut(key = "#user.id")
    @Caching(
            put = @CachePut(key = "#user.id"),
            evict = @CacheEvict(key = "'userAll'")
    )
    @Override
    public User updateUser(User user) {
        userMapper.updateById(user);
        return user;
    }
 
    @Cacheable(key = "#id")
    @Override
    public User findById(Integer id) {
        return userMapper.selectById(id);
    }
 
    @Cacheable(key = "'userAll'")
    @Override
    public List<User> findAll() {
        return userMapper.selectList(new QueryWrapper<User>());
    }

我們來(lái)到測(cè)試方法,首先測(cè)試查詢?nèi)?/p>

    @Test
    public void selectAll(){
        List<User> userList = userService.findAll();
        for (User user : userList) {
            System.out.println("user = " + user);
        }
    }

第一次查詢:

我們看到控制臺(tái)出現(xiàn)了sql查詢,表示這一次是在數(shù)據(jù)庫(kù)中查詢得到的

我們查看redis中的內(nèi)容,發(fā)現(xiàn)也出現(xiàn)了userAll這條信息

接下來(lái)進(jìn)行第二次查詢

我們看到這次查詢?cè)诳刂婆_(tái)上并沒有sql的輸出,表示我們配置redis緩存成功

接下來(lái)測(cè)試添加功能

    /**
     * 測(cè)試添加user
     */
    @Test
    public void add(){
        User user = new User();
        user.setName("德川");
        userService.saveUser(user);
    }

執(zhí)行之后我們查看數(shù)據(jù)庫(kù)

執(zhí)行成功,接下來(lái)我們查看redis

我們發(fā)現(xiàn)只有一條數(shù)據(jù),就是這次添加的id為10的數(shù)據(jù),之前的userAll信息確實(shí)也被刪除掉了,表示@Caching注解直接也得到了執(zhí)行 

但是我們?cè)诓榭磖edis時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題,redis中存儲(chǔ)的數(shù)據(jù)我們根本看不懂,這是因?yàn)閟pringboot在將數(shù)據(jù)存入redis時(shí),由于redis并不能存儲(chǔ)java對(duì)象,所以springboot只能將對(duì)象序列化成字符串,再存入redis中,但是默認(rèn)使用的是jdk的序列化方式,可讀性不高,我們一般都希望其轉(zhuǎn)換成json格式,此時(shí)就需要我們進(jìn)行手動(dòng)配置序列化方式

首先我們導(dǎo)入jackson的啟動(dòng)器依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-json</artifactId>
        </dependency>

在config包中添加如下配置類

@Configuration
public class RedisConfig {
 
    /**
     * 設(shè)置序列化等緩存配置
     *
     * @return
     */
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        // 設(shè)置序列化的方式
        redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(RedisSerializationContext
                .SerializationPair
                .fromSerializer(RedisSerializer.json()));
        return redisCacheConfiguration;
    }
}

接下來(lái)我們測(cè)試更新方法

    /**
     *  測(cè)試更新user
     */
    @Test
    public void update(){
        User user = new User();
        user.setId(10);
        user.setName("原野");
        userService.updateUser(user);
    }

我們來(lái)到redis中查看結(jié)果

發(fā)現(xiàn)存儲(chǔ)的信息變成了json格式,大功告成 

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Maven快速入門和常用配置方式

    Maven快速入門和常用配置方式

    Apache?Maven?是一個(gè)強(qiáng)大的?Java?項(xiàng)目管理工具,通過(guò)項(xiàng)目對(duì)象模型(POM)和生命周期管理構(gòu)建、依賴和文檔,?它支持依賴管理、構(gòu)建繼承和站點(diǎn)生成,簡(jiǎn)化構(gòu)建過(guò)程并確保環(huán)境一致性,?關(guān)鍵指令如mvn?clean、mvn?compile和mvn?package等幫助完成構(gòu)建任務(wù)
    2026-05-05
  • 第三方網(wǎng)站微信登錄java代碼實(shí)現(xiàn)

    第三方網(wǎng)站微信登錄java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了第三方網(wǎng)站微信登錄的java代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 一文教會(huì)你使用jmap和MAT進(jìn)行堆內(nèi)存溢出分析

    一文教會(huì)你使用jmap和MAT進(jìn)行堆內(nèi)存溢出分析

    本文介紹關(guān)于jmap和MAT的使用來(lái)進(jìn)行堆內(nèi)存溢出分析,因?yàn)檫@個(gè)內(nèi)存溢出是我們手動(dòng)構(gòu)造出來(lái)的,查找比較簡(jiǎn)單,真的到了生產(chǎn)上面需要我們仔細(xì)排除
    2021-09-09
  • Java實(shí)現(xiàn)后端跨域的常見解決方案

    Java實(shí)現(xiàn)后端跨域的常見解決方案

    跨源資源共享(CORS——Cross-Origin Resource Sharing,跨源資源共享,或通俗地譯為跨域資源共享)是一種基于 HTTP 頭的機(jī)制,跨域的解決方案有很多種,前后端都有,本文給大家主要介紹Java實(shí)現(xiàn)后端跨域的常見解決方案,需要的朋友可以參考下
    2024-04-04
  • 基于Mybatis Plus實(shí)現(xiàn)多表分頁(yè)查詢的示例代碼

    基于Mybatis Plus實(shí)現(xiàn)多表分頁(yè)查詢的示例代碼

    這篇文章主要介紹了基于Mybatis Plus實(shí)現(xiàn)多表分頁(yè)查詢的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 解答為什么 Java 線程沒有Running狀態(tài)

    解答為什么 Java 線程沒有Running狀態(tài)

    Java 線程沒有Running狀態(tài)指的是一個(gè)在 JVM 中執(zhí)行 的線程處于的狀態(tài),本文小編將為大家詳解一二,需要的朋友可以參考下面文章具體內(nèi)容
    2021-09-09
  • java判斷今天,昨天,前天,不能用秒間隔的簡(jiǎn)單實(shí)例

    java判斷今天,昨天,前天,不能用秒間隔的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇java判斷今天,昨天,前天,不能用秒間隔的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • SpringBoot JSON全局日期格式轉(zhuǎn)換器實(shí)現(xiàn)方式

    SpringBoot JSON全局日期格式轉(zhuǎn)換器實(shí)現(xiàn)方式

    這篇文章主要介紹了SpringBoot JSON全局日期格式轉(zhuǎn)換器,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • 用Java輕松讀取Word文檔內(nèi)容的常用方法

    用Java輕松讀取Word文檔內(nèi)容的常用方法

    這篇文章主要介紹了用Java輕松讀取Word文檔內(nèi)容的常用方法,對(duì)于doc格式使用Apache?POI庫(kù)中的HWPFDocument和WordExtractor類,對(duì)于docx格式使用XWPFDocument類,并通過(guò)遍歷段落和文本運(yùn)行對(duì)象來(lái)提取文本內(nèi)容,需要的朋友可以參考下
    2025-03-03
  • IDEA去除掉代碼中虛線、波浪線和下劃線實(shí)線的方法

    IDEA去除掉代碼中虛線、波浪線和下劃線實(shí)線的方法

    初次安裝使用IDEA,總是能看到導(dǎo)入代碼后,出現(xiàn)很多的波浪線,下劃線和虛線,這是IDEA給我們的一些提示和警告,但是有時(shí)候我們并不需要,反而會(huì)讓人看著很不爽,這里簡(jiǎn)單記錄一下自己的調(diào)整方法,供其他的小伙伴在使用的時(shí)候參考
    2024-09-09

最新評(píng)論

文山县| 亚东县| 绥中县| 都匀市| 邓州市| 娄底市| 平顺县| 临桂县| 怀宁县| 阿坝县| 尚义县| 颍上县| 确山县| 射阳县| 崇阳县| 望都县| 昌图县| 左权县| 铁岭市| 柘荣县| 綦江县| 资源县| 浦城县| 含山县| 乌兰浩特市| 都江堰市| 临洮县| 抚顺县| 庆安县| 阿克| 鄯善县| 政和县| 镇原县| 岐山县| 尼玛县| 偃师市| 泰宁县| 玉龙| 博乐市| 炎陵县| 嘉峪关市|