国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot3集成Redis

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot3集成Redis。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄
  • 一、簡(jiǎn)介
  • 二、工程搭建
    • 1、工程結(jié)構(gòu)
    • 2、依賴管理
    • 3、Redis配置
  • 三、Redis用法
    • 1、環(huán)境搭建
    • 2、數(shù)據(jù)類型
    • 3、加鎖機(jī)制
  • 四、Mybatis緩存
    • 1、基礎(chǔ)配置
    • 2、自定義實(shí)現(xiàn)
  • 五、參考源碼

標(biāo)簽:Redis.Mybatis.Lock;

一、簡(jiǎn)介

緩存在項(xiàng)目開發(fā)中,基本上是必選組件之一,Redis作為一個(gè)key-value存儲(chǔ)系統(tǒng),具備極高的數(shù)據(jù)讀寫效率,并且支持的數(shù)據(jù)類型比較豐富,在業(yè)務(wù)場(chǎng)景中的應(yīng)用非常廣泛;

Redis典型的應(yīng)用場(chǎng)景就是數(shù)據(jù)緩存能力,用來解決業(yè)務(wù)中最容易出現(xiàn)的查詢性能問題,提升系統(tǒng)的響應(yīng)效率;其次就是分布式鎖機(jī)制,用來解決分布式系統(tǒng)中多線程并發(fā)處理資源的安全問題;

二、工程搭建

1、工程結(jié)構(gòu)

SpringBoot3集成Redis

2、依賴管理

Redis的客戶端使用的是lettuce組件的6.2.4.RELEASE版本,該組件具備可擴(kuò)展和線程安全的特性,支持Redis各種高級(jí)功能,如哨兵,集群,流水線,自動(dòng)重新連接等;

<!-- Redis組件 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>${spring-boot.version}</version>
</dependency>
<!-- Spring集成Redis組件 -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-redis</artifactId>
    <version>${spring-integration.version}</version>
</dependency>

3、Redis配置

配置文件,在lettuce組件中默認(rèn)使用的是common-pool2連接池組件,在配置中定義幾個(gè)常用的核心參數(shù);

spring:
  # Redis配置
  data:
    redis:
      host: 127.0.0.1
      port: 6379
      database: 1
      # 讀超時(shí)
      timeout: 3000
      # 連接超時(shí)
      connectTimeout: 5000
      # Lettuce連接池
      lettuce:
        pool:
          # 最小空閑連接
          min-idle: 5
          # 最大空閑連接
          max-idle: 10
          # 最大連接數(shù)
          max-active: 100
          # 連接分配應(yīng)該阻塞的最大時(shí)間
          max-wait: 2000

配置類

@Configuration
public class RedisConfig {

    /**
     * RedisTemplate模板
     */
    @Bean("redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    /**
     * StringRedisTemplate模板
     */
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
        return stringRedisTemplate;
    }

    /**
     * Redis分布式鎖
     */
    @Bean
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory factory){
        // 1、鎖的密鑰前綴:REDIS-LOCK
        // 2、鎖的過期時(shí)間:20秒
        return new RedisLockRegistry(factory, "REDIS-LOCK",20000L);
    }
}

三、Redis用法

1、環(huán)境搭建

Redis文檔中推薦使用brew工具安裝的方式,本地環(huán)境中是4.1版本,可以搜索到redis@6.2,即安裝該版本,并且可以使用brew命令管理Redis的啟動(dòng)和停止;

brew --version
Homebrew 4.1.0

brew search redis
==> Formulae
redis             redis-leveldb     redis@3.2         redis@4.0         redis@6.2

brew install redis@6.2

brew services start redis@6.2
==> Successfully started `redis@6.2` (label: homebrew.mxcl.redis@6.2)

brew services restart redis@6.2
==> Successfully stopped `redis@6.2` (label: homebrew.mxcl.redis@6.2)
==> Successfully started `redis@6.2` (label: homebrew.mxcl.redis@6.2)

brew services stop redis@6.2
==> Successfully stopped `redis@6.2` (label: homebrew.mxcl.redis@6.2)

配置Redis環(huán)境變量,這樣可以在命令行使用Redis原生的指令進(jìn)行啟動(dòng)和客戶端操作,在測(cè)試完成之后,Mac系統(tǒng)本地的redis@6.2環(huán)境就配置好了;

open -e ~/.bash_profile

export REDIS_HOME=/usr/local/opt/redis@6.2
export PATH=$REDIS_HOME/bin:$PATH

source ~/.bash_profile

redis-server
Redis 6.2.13 ,Running in standalone mode , Port: 6379 , PID: 7966

redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379> set redis-key redis-value
OK
127.0.0.1:6379> get redis-key
"redis-value"
127.0.0.1:6379> del redis-key
(integer) 1

2、數(shù)據(jù)類型

Strings:字符串是最基本的數(shù)據(jù)類型,表示一個(gè)字節(jié)序列,也是最常使用的類型,單個(gè)最大能夠存儲(chǔ)512MB;

public void dataString () throws Exception {
    // 1、添加K-V緩存
    redisTemplate.opsForValue().set("key-01","value-01",300, TimeUnit.SECONDS);
    // 2、添加JSON格式
    JsonMapper jsonMapper = new JsonMapper() ;
    String jsonVar = jsonMapper.writeValueAsString(new IdValue(1,"Json格式")) ;
    redisTemplate.opsForValue().set("key-02",jsonVar,500,TimeUnit.SECONDS);
    Object key01 = redisTemplate.opsForValue().get("key-01");
    Object key02 = redisTemplate.opsForValue().get("key-02");
    log.info("key01:{},key02:{}",key01,key02);
}

Lists:鏈表結(jié)構(gòu),可以有序的存儲(chǔ)多個(gè)字符串值,基于數(shù)據(jù)左寫入右讀取的方式可以模擬消息隊(duì)列,單個(gè)最大長(zhǎng)度為2^32-1

public void dataList (){
    // 1、左側(cè)寫數(shù)據(jù)
    redisTemplate.opsForList().leftPushAll("data-list","value-01","value-02","value-03");
    // 2、右側(cè)讀數(shù)據(jù)
    Object rightPop01 = redisTemplate.opsForList().rightPop("data-list") ;
    Object rightPop02 = redisTemplate.opsForList().rightPop("data-list") ;
    log.info("rightPop01:{},rightPop02:{}",rightPop01,rightPop02);
}

Sets:用來存儲(chǔ)無序的、唯一的字符串集合,通常用來跟蹤分析唯一項(xiàng)的業(yè)務(wù)場(chǎng)景,比如唯一標(biāo)簽下的用戶群,獨(dú)立IP等;

public void dataSet (){
    // 1、寫數(shù)據(jù)
    redisTemplate.opsForSet().add("data-set","Java","C++","Python","C++");
    // 2、讀數(shù)據(jù)
    Object pop01 = redisTemplate.opsForSet().pop("data-set");
    Object pop02 = redisTemplate.opsForSet().pop("data-set");
    log.info("pop01:{},pop02:{}",pop01,pop02);
}

Hashes:Redis本身的K-V結(jié)構(gòu)上,在value中可以再次使用K-V數(shù)據(jù)類型,在涉及大規(guī)模的關(guān)系型數(shù)據(jù)存儲(chǔ)時(shí),會(huì)優(yōu)先使用該類型;

public void dataHash (){
    // 1、寫數(shù)據(jù)
    HashMap<String,String> hashMap = new HashMap<>() ;
    hashMap.put("key1","value1") ;
    hashMap.put("key2","value2") ;
    redisTemplate.opsForHash().putAll("data-hash",hashMap);
    // 2、讀數(shù)據(jù)
    Object kv1 = redisTemplate.opsForHash().get("data-hash","key1");
    Object kv2 = redisTemplate.opsForHash().get("data-hash","key2");
    log.info("kv1:{},kv2:{}",kv1,kv2);
}

Sorted-sets:唯一的字符串集合,但是可以通過每個(gè)字符串的相關(guān)分?jǐn)?shù)來維持順序,這里的分?jǐn)?shù)可以表示排行順序,也可以標(biāo)識(shí)為對(duì)象的權(quán)重或優(yōu)先級(jí);

public void dataSortedSet (){
    // 1、寫數(shù)據(jù)
    redisTemplate.opsForZSet().add("sorted-set","Java",1.0);
    redisTemplate.opsForZSet().add("sorted-set","Python",3.0);
    redisTemplate.opsForZSet().add("sorted-set","C++",2.0);
    // 2、讀數(shù)據(jù)
    Object popMax = redisTemplate.opsForZSet().popMax("sorted-set");
    Object popMin = redisTemplate.opsForZSet().popMin("sorted-set");
    log.info("popMax:{},popMin:{}",popMax,popMin);
}

3、加鎖機(jī)制

使用SETNX方法即代碼中的setIfAbsent,如果key不存在,則設(shè)置key保存字符串的值,也就相當(dāng)于SET,當(dāng)key已經(jīng)存在時(shí),不執(zhí)行任何操作;

@Service
public class RedisLockService {
    @Resource
    private RedisTemplate<String,Object> redisTemplate ;

    public Boolean lock (String lock,long timeout){
        return redisTemplate.opsForValue().setIfAbsent(lock,lock,timeout, TimeUnit.SECONDS);
    }
    public void unLock (String lock){
        Object lockVal = redisTemplate.opsForValue().get(lock);
        if (!Objects.isNull(lockVal) && Objects.equals(lockVal.toString(),lock)){
            redisTemplate.delete(lock) ;
        }
    }
}

RedisLockRegistry是由spring-integration組件提供的封裝類,基于Redis實(shí)現(xiàn)分布式鎖的能力;有關(guān)于兩種鎖機(jī)制的測(cè)試,可以查看代碼工程中RedisLockTest單元測(cè)試類,

@Service
public class LockRegistryService {

    @Resource
    protected RedisLockRegistry redisLockRegistry;

    /**
     * 嘗試一次加鎖
     */
    @SneakyThrows
    public <T> Boolean tryLock(T lockKey, Long time) {
        return redisLockRegistry.obtain(lockKey).tryLock(time, TimeUnit.SECONDS);
    }

    /**
     * 重試機(jī)制多次加鎖
     */
    @SneakyThrows
    public <T> Boolean reTryLock(T lockKey, Long time,int retryNum) {
        Boolean lockFlag = tryLock(lockKey, time);
        if (Boolean.TRUE.equals(lockFlag)) {
            return Boolean.TRUE;
        }
        for (int i = 0; i < retryNum; i++) {
            if (Boolean.TRUE.equals(tryLock(lockKey, time))){
                return Boolean.TRUE;
            }
        }
        return Boolean.FALSE;
    }

    /**
     * 釋放鎖
     */
    public <T> void unlock(T lockKey) {
        redisLockRegistry.obtain(lockKey).unlock();
    }
}

四、Mybatis緩存

1、基礎(chǔ)配置

在Mybatis框架中,一級(jí)緩存是指SqlSession級(jí)別內(nèi);二級(jí)緩存是指Mapper級(jí)別內(nèi),需要在配置文件中開啟,二級(jí)緩存并不適用于頻繁修改數(shù)據(jù)的業(yè)務(wù)場(chǎng)景;

配置文件

mybatis-plus:
  configuration:
    cache-enabled: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Mapper注解,這里使用自定義的MybatisCache類,并且使用Redis組件來緩存數(shù)據(jù);

@CacheNamespace(implementation = MybatisCache.class)
public interface ArticleMapper extends BaseMapper<Article> {

}

2、自定義實(shí)現(xiàn)

通過實(shí)現(xiàn)Cache接口,來定義二級(jí)緩存的處理策略,可以運(yùn)行MybatisTest測(cè)試類中的方法,分析其執(zhí)行的原理,符合Cache-Aside模式,即先查詢緩存,如果未命中就查詢數(shù)據(jù)庫(kù),并將結(jié)果寫入緩存,數(shù)據(jù)更新時(shí)會(huì)刪除相關(guān)緩存;文章來源地址http://www.zghlxwxcb.cn/news/detail-648531.html

public class MybatisCache implements Cache {

    private static final Logger log = LoggerFactory.getLogger(MybatisCache.class);

    private RedisTemplate<String,Object> redisTemplate ;

    private String id ;

    public MybatisCache (String id){
        log.info("mybatis...cache...id:{}",id);
        this.id = id ;
    }

    public RedisTemplate<String,Object> getRedisTemplate(){
        if(redisTemplate == null) {
            synchronized (MybatisCache.class) {
                if(redisTemplate == null) {
                    redisTemplate = SpringContextUtil.getBean("redisTemplate",RedisTemplate.class);
                    return redisTemplate;
                }
                return redisTemplate;
            }
        }
        return redisTemplate ;
    }
    @Override
    public String getId() {
        return this.id ;
    }

    @Override
    public void putObject(Object key, Object value) {
        log.info("mybatis...cache...put...key:{},value:{}",key,value);
        this.getRedisTemplate().opsForValue().set(String.valueOf(key),value,5, TimeUnit.MINUTES);
    }

    @Override
    public Object getObject(Object key) {
        log.info("mybatis...cache...get...key:{}",key);
        return this.getRedisTemplate().opsForValue().get(String.valueOf(key)) ;
    }

    @Override
    public Object removeObject(Object key) {
        log.info("mybatis...cache...remove...key:{}",key);
        return this.getRedisTemplate().delete(String.valueOf(key));
    }

    @Override
    public void clear() {
        Set<String> keys = this.getRedisTemplate().keys("*" + id + "*");
        if (keys != null && keys.size()>0){
            log.info("mybatis...cache...clear...keys:{}",keys);
            this.getRedisTemplate().delete(keys) ;
        }
    }

    @Override
    public int getSize() {
        Set<String> keys = this.getRedisTemplate().keys("*" + id + "*");
        if (keys != null){
            log.info("mybatis...cache...size...keys:{}",keys.size());
            return keys.size() ;
        }
        return 0;
    }
}

五、參考源碼

文檔倉(cāng)庫(kù):
https://gitee.com/cicadasmile/butte-java-note

源碼倉(cāng)庫(kù):
https://gitee.com/cicadasmile/butte-spring-parent

到了這里,關(guān)于SpringBoot3集成Redis的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot3集成Quartz

    SpringBoot3集成Quartz

    目錄 一、簡(jiǎn)介 二、工程搭建 1、工程結(jié)構(gòu) 2、依賴管理 3、數(shù)據(jù)庫(kù) 4、配置文件 三、Quartz用法 1、初始化加載 2、新增任務(wù) 3、更新任務(wù) 4、暫停任務(wù) 5、恢復(fù)任務(wù) 6、執(zhí)行一次 7、刪除任務(wù) 8、任務(wù)執(zhí)行 四、參考源碼 標(biāo)簽:Quartz.Job.Scheduler; Quartz由Java編寫的功能豐富的開源作業(yè)

    2024年02月13日
    瀏覽(16)
  • SpringBoot3集成Kafka

    SpringBoot3集成Kafka

    目錄 一、簡(jiǎn)介 二、環(huán)境搭建 1、Kafka部署 2、Kafka測(cè)試 3、可視化工具 三、工程搭建 1、工程結(jié)構(gòu) 2、依賴管理 3、配置文件 四、基礎(chǔ)用法 1、消息生產(chǎn) 2、消息消費(fèi) 五、參考源碼 標(biāo)簽:Kafka3.Kafka-eagle3; Kafka是一個(gè)開源的分布式事件流平臺(tái),常被用于高性能數(shù)據(jù)管道、流分析、

    2024年02月12日
    瀏覽(17)
  • SpringBoot3集成ElasticSearch

    SpringBoot3集成ElasticSearch

    目錄 一、簡(jiǎn)介 二、環(huán)境搭建 1、下載安裝包 2、服務(wù)啟動(dòng) 三、工程搭建 1、工程結(jié)構(gòu) 2、依賴管理 3、配置文件 四、基礎(chǔ)用法 1、實(shí)體類 2、初始化索引 3、倉(cāng)儲(chǔ)接口 4、查詢語(yǔ)法 五、參考源碼 標(biāo)簽:ElasticSearch8.Kibana8; Elasticsearch是一個(gè)分布式、RESTful風(fēng)格的搜索和數(shù)據(jù)分析引擎

    2024年02月12日
    瀏覽(20)
  • SpringBoot3數(shù)據(jù)庫(kù)集成

    SpringBoot3數(shù)據(jù)庫(kù)集成

    標(biāo)簽:Jdbc.Druid.Mybatis.Plus; 項(xiàng)目工程中,集成數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)數(shù)據(jù)的增曬改查管理,是最基礎(chǔ)的能力,而對(duì)于這個(gè)功能的實(shí)現(xiàn),其組件選型也非常豐富; 通過如下幾個(gè)組件來實(shí)現(xiàn)數(shù)據(jù)庫(kù)的整合; Druid連接池 :阿里開源的數(shù)據(jù)庫(kù)連接池,并且提供 SQL 執(zhí)行的監(jiān)控能力; MybatisPlu

    2024年02月13日
    瀏覽(28)
  • Java21 + SpringBoot3集成WebSocket

    Java21 + SpringBoot3集成WebSocket

    近日心血來潮想做一個(gè)開源項(xiàng)目,目標(biāo)是做一款可以適配多端、功能完備的模板工程,包含后臺(tái)管理系統(tǒng)和前臺(tái)系統(tǒng),開發(fā)者基于此項(xiàng)目進(jìn)行裁剪和擴(kuò)展來完成自己的功能開發(fā)。 本項(xiàng)目為前后端分離開發(fā),后端基于 Java21 和 SpringBoot3 開發(fā),前端提供了vue、angular、react、uniap

    2024年01月23日
    瀏覽(62)
  • Elasticsearch 搜索測(cè)試與集成Springboot3

    Elasticsearch 搜索測(cè)試與集成Springboot3

    Elasticsearch是專門做 搜索 的,它非常擅長(zhǎng)以下方面的問題 Elasticsearch對(duì)模糊搜索非常擅長(zhǎng)(搜索速度很快) 從Elasticsearch搜索到的數(shù)據(jù)可以根據(jù) 評(píng)分 過濾掉大部分的,只要返回評(píng)分高的給用戶就好了(原生就支持排序) 沒有那么準(zhǔn)確的也能搜出相關(guān)的結(jié)果(能匹配有相

    2024年01月22日
    瀏覽(31)
  • 【springboot3.x 記錄】解決 springboot3 集成 mybatis-plus 報(bào) sqlSession 異常

    2022-12-30,作者最新發(fā)布了?3.5.3.1 版本,不需要使用快照版本了 ========================= springboot3 已經(jīng)發(fā)布正式版,第一時(shí)間嘗鮮看看如何,但是在集成?mybatis-plus 最新版 3.5.2 的時(shí)候發(fā)現(xiàn)提示異常。 看來 springboot3 在注入這塊做了調(diào)整,但目前?mybatis-plus 并沒有適配到。 于是翻查

    2024年02月13日
    瀏覽(19)
  • springboot3 集成mybatis 和通用mapper

    springboot3 集成mybatis 和通用mapper

    xml版本查看:https://www.cnblogs.com/binz/p/6564490.html springboot3.x以前的版本查看 https://www.cnblogs.com/binz/p/17421063.html springboot3.x查看??https://www.cnblogs.com/binz/p/17654403.html 1、pom引用 !-- openapi、 swagger3、knife4j配置,適用boot3 -- !-- https://doc.xiaominfo.com -- dependency groupId com.github.xiaoymin/ groupI

    2024年02月11日
    瀏覽(25)
  • SpringBoot3集成Kafka優(yōu)雅實(shí)現(xiàn)信息消費(fèi)發(fā)送

    ???????首先,你的JDK是否已經(jīng)是8+了呢? ???????其次,你是否已經(jīng)用上SpringBoot3了呢? ???????最后,這次分享的是SpringBoot3下的kafka發(fā)信息與消費(fèi)信息。 ???????這次的場(chǎng)景是springboot3+多數(shù)據(jù)源的數(shù)據(jù)交換中心(數(shù)倉(cāng))需要消費(fèi)Kafka里的上游推送信息,這里做數(shù)據(jù)

    2024年02月02日
    瀏覽(29)
  • SpringBoot3.1.7集成Kafka和Kafka安裝

    SpringBoot3.1.7集成Kafka和Kafka安裝

    我們?cè)诤芏嘞到y(tǒng)開發(fā)都需要用到消息中間件,目前來說Kafka憑借其優(yōu)秀的性能,使得它的使用率已經(jīng)是名列前茅了,所以今天我們將它應(yīng)用到我們的系統(tǒng) 在使用一個(gè)中間件一定要考慮版本的兼容性,否則后面會(huì)遇到很多問題,首先我們打開Spring的官網(wǎng):Spring for Apache Kafka Spr

    2024年01月23日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包