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

Spring Boot集成redis,key自定義生成方式

 更新時(shí)間:2021年06月22日 10:43:12   作者:ouyangjun__  
這篇文章主要介紹了Spring Boot集成redis,key自定義生成方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一)自定義redis key生成策略

@Configuration:表示當(dāng)前類屬于一個(gè)配置類,類似于一個(gè)spring.cfg.xml。

@EnableCaching:表示支持啟用緩存。

自定義配置源碼:

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCachePrefix;
import org.springframework.data.redis.core.RedisTemplate; 
import com.alibaba.fastjson.JSON;
 
/**
 * redis配置工具類
 * @Configuration表示當(dāng)前類屬于配置類
 * @EnableCaching表示支持緩存
 * @author ouyangjun
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
 
    /**
     * redis key生成策略
     * target: 類
     * method: 方法
     * params: 參數(shù)
     * @return KeyGenerator
     * 注意: 該方法只是聲明了key的生成策略,還未被使用,需在@Cacheable注解中指定keyGenerator
     *      如: @Cacheable(value = "key", keyGenerator = "cacheKeyGenerator")
     */
    @Bean
    public KeyGenerator cacheKeyGenerator() {
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
                // 由于參數(shù)可能不同, hashCode肯定不一樣, 緩存的key也需要不一樣
                sb.append(JSON.toJSONString(obj).hashCode());
            }
            return sb.toString();
        };
    }
 
    /**
     * redis全局默認(rèn)配置
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
        redisCacheManager.setUsePrefix(true);
        // key緩存的前綴,以conf開頭
        RedisCachePrefix cachePrefix = new RedisPrefix("conf");
        redisCacheManager.setCachePrefix(cachePrefix);
        // key緩存的過期時(shí)間, 600秒
        redisCacheManager.setDefaultExpiration(600L);
        return redisCacheManager;
    }
}

二)SpringBoot自帶緩存方式

注解說(shuō)明:

@Cacheable含義:當(dāng)調(diào)用該注解聲明的方法時(shí),會(huì)先從緩存中查找,判斷是否有key相同緩存的數(shù)據(jù),如果有,就直接返回?cái)?shù)據(jù),如果沒有,執(zhí)行方法,然后把返回的數(shù)據(jù)以鍵值的方式存儲(chǔ)到緩存中,方便下次同樣參數(shù)請(qǐng)求時(shí),直接從緩存中返回?cái)?shù)據(jù)。

@Cacheable支持如下幾個(gè)參數(shù):

cacheNames:緩存位置的一段名稱,不能為空,和value一個(gè)含義。

value:緩存位置的一段名稱,不能為空,和cacheNames一個(gè)含義。

key:緩存的key,默認(rèn)為空,表示使用方法的參數(shù)類型及參數(shù)值作為key,支持SpEL。

keyGenerator:指定key的生成策略。

condition:觸發(fā)條件,滿足條件就加入緩存,默認(rèn)為空,表示全部都加入緩存,支持SpEL。

@CacheEvict含義:當(dāng)存在相同key的緩存時(shí),把緩存清空,相當(dāng)于刪除。

@CacheEvict支持如下幾個(gè)參數(shù):

cacheNames:緩存位置的一段名稱,不能為空,和value一個(gè)含義。

value:緩存位置的一段名稱,不能為空,和cacheNames一個(gè)含義。

key:緩存的key,默認(rèn)為空,表示使用方法的參數(shù)類型及參數(shù)值作為key,支持SpEL。

condition:觸發(fā)條件,滿足條件就加入緩存,默認(rèn)為空,表示全部都加入緩存,支持SpEL。

allEntries:true表示清除value中的全部緩存,默認(rèn)為false。

測(cè)試代碼:

package hk.com.cre.process.basic.service.impl; 
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; 
public class RdisCacheTest {
 
    /**
     * 緩存測(cè)試
     * 緩存生成規(guī)則: conf:redis:類名方法名參數(shù)hashcode
     * 注意: @Cacheable注解生成的類型在redis中默認(rèn)都是string
     *      在每次請(qǐng)求的時(shí)候,都是先根據(jù)key到redis查詢是否存在,如不存在則執(zhí)行方法中的代碼
	 */
    @Cacheable(cacheNames = "redis", keyGenerator = "cacheKeyGenerator")
    public String getRedisString(String param1, String param2) {
        return param1+":"+param2;
    }
	
    /**
     * 清除緩存
     */
    @CacheEvict(cacheNames = "redis", allEntries = true)
    public String cleanCache() {
        return "success";
    }
}

Spring Cache – KeyGenerator自定義rediskey

1. 概述

在此教程中,我們將演示如何使用 Spring Cache 創(chuàng)建自定義密鑰生成器。

2. KeyGenerator

這負(fù)責(zé)為緩存中的每個(gè)數(shù)據(jù)項(xiàng)生成每個(gè)鍵,這些鍵將用于在檢索時(shí)查找數(shù)據(jù)項(xiàng)。

此處的默認(rèn)實(shí)現(xiàn)是SimpleKeyGenerator –它使用提供的方法參數(shù)來(lái)生成密鑰。這意味著,如果我們有兩個(gè)使用相同的緩存名稱和參數(shù)類型集的方法,則很有可能會(huì)導(dǎo)致沖突。

它還意味著緩存數(shù)據(jù)可以由另一種方法覆蓋。

3. 自定義密鑰生成器

密鑰生成器只需要實(shí)現(xiàn)一個(gè)方法:

Object generate(Object object, Method method, Object... params)

如果未正確實(shí)現(xiàn)或使用,則可能導(dǎo)致覆蓋緩存數(shù)據(jù)。

讓我們來(lái)看看實(shí)現(xiàn):

public class CustomKeyGenerator implements KeyGenerator {
    public Object generate(Object target, Method method, Object... params) {
        return target.getClass().getSimpleName() + "_"
          + method.getName() + "_"
          + StringUtils.arrayToDelimitedString(params, "_");
    }
}

之后,我們有兩種可能的方式使用它;第一種是在應(yīng)用程序Config中聲明一個(gè)豆。

請(qǐng)務(wù)必指出,類必須從緩存配置支持或?qū)崿F(xiàn)緩存配置程序擴(kuò)展:

@EnableCaching
@Configuration
public class ApplicationConfig extends CachingConfigurerSupport {
    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        Cache booksCache = new ConcurrentMapCache("books");
        cacheManager.setCaches(Arrays.asList(booksCache));
        return cacheManager;
    }
    @Bean("customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new CustomKeyGenerator();
    }
}

第二種方法是將其用于特定方法:

@Component
public class BookService {
    @Cacheable(value = "books", keyGenerator = "customKeyGenerator")
    public List<Book> getBooks() {
        List<Book> books = new ArrayList<>();
        books.add(new Book("The Counterfeiters", "André Gide"));
        books.add(new Book("Peer Gynt and Hedda Gabler", "Henrik Ibsen"));
        return books;
    }
}

4. 結(jié)論

在本文中,我們探討了實(shí)現(xiàn)自定義春季緩存的密鑰生成器的方法。

與往常一樣,示例的完整源代碼可在 GitHub 上找到。

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

相關(guān)文章

  • java 簡(jiǎn)單的計(jì)算器程序?qū)嵗a

    java 簡(jiǎn)單的計(jì)算器程序?qū)嵗a

    這篇文章主要介紹了java 簡(jiǎn)單的計(jì)算器程序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java集合源碼全面分析

    Java集合源碼全面分析

    下面小編就為大家?guī)?lái)一篇Java集合源碼全面分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2016-07-07
  • java圖形界面之加法計(jì)算器

    java圖形界面之加法計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了java圖形界面之加法計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解Java數(shù)組擴(kuò)容縮容與拷貝的實(shí)現(xiàn)和原理

    詳解Java數(shù)組擴(kuò)容縮容與拷貝的實(shí)現(xiàn)和原理

    這篇文章主要帶大家學(xué)習(xí)數(shù)組的擴(kuò)容、縮容及拷貝,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Springcloud Bus消息總線原理是實(shí)現(xiàn)詳解

    Springcloud Bus消息總線原理是實(shí)現(xiàn)詳解

    Spring Cloud Bus 使用輕量級(jí)的消息代理來(lái)連接微服務(wù)架構(gòu)中的各個(gè)服務(wù),可以將其用于廣播狀態(tài)更改(例如配置中心配置更改)或其他管理指令,本文將對(duì)其用法進(jìn)行詳細(xì)介紹
    2022-09-09
  • 淺談Java中static和非static的區(qū)別

    淺談Java中static和非static的區(qū)別

    這篇文章主要介紹了Java中static和非static的相關(guān)內(nèi)容,小編覺得還是很不錯(cuò)的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • IDEA 2020代碼提示忽略大小寫的問題

    IDEA 2020代碼提示忽略大小寫的問題

    這篇文章主要介紹了IDEA 2020代碼提示忽略大小寫的問題,本文通過圖文并茂的形式給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Springboot整合ActiveMQ實(shí)現(xiàn)消息隊(duì)列的過程淺析

    Springboot整合ActiveMQ實(shí)現(xiàn)消息隊(duì)列的過程淺析

    昨天仔細(xì)研究了activeMQ消息隊(duì)列,也遇到了些坑,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合ActiveMQ的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之樹

    Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之樹

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)之樹,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java數(shù)據(jù)結(jié)構(gòu)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • HashMap每次擴(kuò)容為什么是2倍

    HashMap每次擴(kuò)容為什么是2倍

    當(dāng)HashMap在初始化沒有指定容量的情況下,首次添加元素時(shí),數(shù)組的容量為16;當(dāng)超出閾值,數(shù)組容量為擴(kuò)容為之前的2倍,為什么HashMap每次擴(kuò)容都是之前的2倍?下面就介紹一下
    2024-11-11

最新評(píng)論

正镶白旗| 庐江县| 安乡县| 花莲县| 锡林郭勒盟| 辰溪县| 宁南县| 沾益县| 乐业县| 威信县| 平舆县| 宜兴市| 客服| 观塘区| 汾西县| 麦盖提县| 江安县| 新田县| 容城县| 三台县| 宁城县| 石屏县| 扶沟县| 赞皇县| 长垣县| 乳山市| 七台河市| 孟村| 横峰县| 青铜峡市| 开阳县| 鞍山市| 濮阳县| 宜兰市| 荥经县| 承德市| 六安市| 双牌县| 克拉玛依市| 建阳市| 南华县|