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

SpringBoot整合Redis使用注解進(jìn)行緩存方式

 更新時(shí)間:2025年03月05日 09:43:20   作者:fkjavaer  
文章介紹了使用Redis進(jìn)行數(shù)據(jù)緩存的幾種方式,包括手動(dòng)配置RedisTemplate、使用Spring的Caching模塊以及配置自定義的RedisCacheManager

Hello,各位小伙伴,最近項(xiàng)目中需要將一些常用的數(shù)據(jù)緩存起來,毫無疑問,我們采用了Redis來緩存數(shù)據(jù)。那么使用Redis緩存數(shù)據(jù)有哪些方式呢?接下來我會(huì)一一道來。

1.環(huán)境搭建

引入Redis依賴以及Spring相關(guān)的依賴

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

2.使用RedisTemplate

使用RedisTemplate調(diào)用API時(shí),我們通常需要去配置key,value的序列化器,以及創(chuàng)建一個(gè)RedisUtils類來完成緩存的增刪改查以及過期時(shí)間的設(shè)置。

配置如下:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 設(shè)置key的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // 設(shè)置value的序列化方式
        template.setValueSerializer(RedisSerializer.json());
        // 設(shè)置hash的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // 設(shè)置hash的value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

        template.afterPropertiesSet();
        return template;
    }
}

RedisUtils:

public class RedisUtils {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 普通緩存放入
     *
     * @param key   鍵
     * @param value 值
     */

    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 普通緩存放入并設(shè)置時(shí)間
     *
     * @param key   鍵
     * @param value 值
     * @param time  時(shí)間(秒) time要大于0 如果time小于等于0 將設(shè)置無限期
     */

    public void set(String key, Object value, long time) {
        if (time > 0) {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
            set(key, value);
        }
    }

    /**
     * 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
     *
     * @param key   鍵
     * @param item  項(xiàng)
     * @param value 值
     */
    public void hset(String key, String item, Object value) {
        redisTemplate.opsForHash().put(key, item, value);
    }

    /**
     * 向一張hash表中放入數(shù)據(jù),如果不存在將創(chuàng)建
     *
     * @param key   鍵
     * @param item  項(xiàng)
     * @param value 值
     * @param time  時(shí)間(秒) 注意:如果已存在的hash表有時(shí)間,這里將會(huì)替換原有的時(shí)間
     */
    public void hset(String key, String item, Object value, long time, TimeUnit timeUnit) {
        redisTemplate.opsForHash().put(key, item, value);
        if (time > 0) {
            expire(key, time, timeUnit);
        }
    }

    /**
     * @param key 鍵
     * @param map 多個(gè)field-value
     */
    public void hmset(String key, Map<String, Object> map) {
        redisTemplate.opsForHash().putAll(key, map);
    }

    /**
     * @param key      鍵
     * @param map      多個(gè)field-value
     * @param time     過期時(shí)間
     * @param timeUnit 時(shí)間單位
     */
    public void hmset(String key, Map<String, Object> map, long time, TimeUnit timeUnit) {
        redisTemplate.opsForHash().putAll(key, map);
        if (time > 0) {
            expire(key, time, timeUnit);
        }
    }

    /**
     * @param key  鍵
     * @param item Field
     * @return 獲得的值
     */
    public Object hget(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }

    /**
     * @param key 鍵
     * @return hash表中key對(duì)應(yīng)的map
     */
    public Map<Object, Object> hEntries(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * @param key   鍵
     * @param value 值
     */
    public void sadd(String key, Object value) {
        redisTemplate.opsForSet().add(key, value);
    }

    /**
     * @param key      鍵
     * @param value    值
     * @param time     過期時(shí)間
     * @param timeUnit 時(shí)間單位
     */
    public void sadd(String key, Object value, long time, TimeUnit timeUnit) {
        redisTemplate.opsForSet().add(key, value);
        if (time > 0) {
            expire(key, time, timeUnit);
        }
    }

    /**
     * @param key 鍵
     * @return 數(shù)據(jù)
     */
    public Set<Object> smembers(String key) {
        return redisTemplate.opsForSet().members(key);

    }

    public void expire(String key, long time, TimeUnit timeUnit) {
        if (time > 0) {
            redisTemplate.expire(key, time, timeUnit);
        }
    }

    /**
     * 根據(jù)key 獲取過期時(shí)間
     *
     * @param key 鍵 不能為null
     * @return 時(shí)間(秒) 返回0代表為永久有效
     */
    public long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
}

通過以上的配置,我們?cè)谑褂镁彺娴臅r(shí)候,直接調(diào)用API就可以進(jìn)行操作了。但是有個(gè)問題就是,我們?cè)诰彺嬉恍┏S脭?shù)據(jù)的時(shí)候,通常我們需要先判斷一下緩存中有沒有該key,如果沒有我們?cè)偃?shù)據(jù)庫中查詢出來,并緩存。

這樣的話我們需要去做一些判斷的操作,緩存中有就去緩存中取,沒有就從數(shù)據(jù)庫中取出來并緩存。那么有沒有更方便的操作方式呢,答案當(dāng)然是有的。

3.使用@EnableCaching+@Cacheable

Spring為我們提供了Caching模塊,我們可以該模塊給我們提供的功能,使用注解很方便完成數(shù)據(jù)緩存

在使用的過程中,我發(fā)現(xiàn),雖然我們配置了RedisTemplate的序列化,但是對(duì)于基于注解的Redis緩存來說是無效的,我們需要配置自定義的RedisCacheManager

配置如下:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 設(shè)置key的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // 設(shè)置value的序列化方式
        template.setValueSerializer(RedisSerializer.json());
        // 設(shè)置hash的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // 設(shè)置hash的value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) {
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory);
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));
        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }
}

使用方法:

  1. 在啟動(dòng)類上加上@EnableCaching
  2. 在需要緩存數(shù)據(jù)的方法上加上@Cacheable(cacheNames = "xxx"),方法的返回值就是我們需要緩存的數(shù)據(jù)
  3. 基于以上的操作,我們就可以很方便的將需要緩存的數(shù)據(jù)緩存到Redis

總結(jié)

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

相關(guān)文章

  • java7 新I/O知識(shí)點(diǎn)詳解

    java7 新I/O知識(shí)點(diǎn)詳解

    在本篇文章里小編給大家整理的是關(guān)于java7 新I/O知識(shí)點(diǎn)詳解,有需要的朋友們可以學(xué)習(xí)下。
    2019-11-11
  • 使用aop實(shí)現(xiàn)全局異常處理

    使用aop實(shí)現(xiàn)全局異常處理

    這篇文章主要為大家詳細(xì)介紹了使用aop實(shí)現(xiàn)全局異常處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • IDEA POM文件配置profile實(shí)現(xiàn)不同環(huán)境切換的方法步驟

    IDEA POM文件配置profile實(shí)現(xiàn)不同環(huán)境切換的方法步驟

    這篇文章主要介紹了IDEA POM文件配置profile實(shí)現(xiàn)不同環(huán)境切換的方法步驟
    2024-03-03
  • 使用ehcache三步搞定springboot緩存的方法示例

    使用ehcache三步搞定springboot緩存的方法示例

    本次內(nèi)容主要介紹基于Ehcache 3.0來快速實(shí)現(xiàn)Spring Boot應(yīng)用程序的數(shù)據(jù)緩存功能。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解

    Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了Activiti7通過代碼動(dòng)態(tài)生成工作流實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • spring mvc DispatcherServlet之前端控制器架構(gòu)詳解

    spring mvc DispatcherServlet之前端控制器架構(gòu)詳解

    這篇文章主要為大家詳細(xì)介紹了spring mvc DispatcherServlet之前端控制器架構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)

    spring @Scheduled定時(shí)任務(wù)注解使用方法及注意事項(xiàng)小結(jié)

    Spring的@Scheduled注解用于定時(shí)任務(wù)調(diào)度,默認(rèn)單線程依次執(zhí)行,可以通過配置多線程調(diào)度器或使用@Async注解實(shí)現(xiàn)并行執(zhí)行,常見參數(shù)包括cron、fixedRate、fixedDelay、initialDelay等,本文介紹spring @Scheduled定時(shí)任務(wù)注解使用方法,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot Cache緩存概念講解

    SpringBoot Cache緩存概念講解

    這篇文章主要介紹了Springboot cache緩存,使用緩存最關(guān)鍵的一點(diǎn)就是保證緩存與數(shù)據(jù)庫的數(shù)據(jù)一致性,本文給大家介紹最常用的緩存操作模式,對(duì)Springboot cache緩存操作流程感興趣的朋友一起看看吧
    2022-12-12
  • 基于Java制作一個(gè)燈謎猜猜樂游戲

    基于Java制作一個(gè)燈謎猜猜樂游戲

    中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一,全國各地為了增強(qiáng)過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動(dòng),比如猜燈謎,所以本文就來用Java制作一個(gè)燈謎猜猜樂游戲,感興趣的可以了解下
    2023-09-09
  • El表達(dá)式使用問題javax.el.ELException:Failed to parse the expression的解決方式

    El表達(dá)式使用問題javax.el.ELException:Failed to parse the expression

    今天小編就為大家分享一篇關(guān)于Jsp El表達(dá)式使用問題javax.el.ELException:Failed to parse the expression的解決方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論

定安县| 枝江市| 曲阳县| 弋阳县| 灌阳县| 贵阳市| 合作市| 清河县| 施甸县| 基隆市| 英山县| 德保县| 乌兰浩特市| 阳曲县| 高邑县| 汉阴县| 阿坝县| 沅陵县| 丰镇市| 呼和浩特市| 宝清县| 黑河市| 唐河县| 舞阳县| 什邡市| 上高县| 玉龙| 洱源县| 双桥区| 醴陵市| 康乐县| 锡林郭勒盟| 定南县| 二手房| 翼城县| 阜阳市| 九寨沟县| 苍梧县| 双牌县| 台山市| 汕头市|