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

springboot3使用redis 最新詳細(xì)方法示例詳解

 更新時(shí)間:2025年07月07日 17:03:42   作者:jolly_xu  
本文介紹Spring Boot 3中使用Redis的配置方法與數(shù)據(jù)結(jié)構(gòu)操作,涵蓋String、List、Set、ZSet、Hash、Bitmap等類型的應(yīng)用場(chǎng)景,如緩存、消息隊(duì)列、排行榜等,提供高效數(shù)據(jù)處理方案,感興趣的朋友跟隨小編一起看看吧

1.Spring Data Redis

這是Spring框架提供的一個(gè)用于簡(jiǎn)化Redis操作的模塊。:

初始準(zhǔn)備

1.1首先配置Pom依賴

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

1.2 在yml中配置redis相關(guān)信息

由于spring.redis.host 這種配置已經(jīng)被棄用,在新版的springboot中,需要在spring.data.redis.host 進(jìn)行配置

spring:
  data:
    redis:
    # 改為自己的地址和密碼
      host: 10.69.37.213
      port: 6379
      password: Jolly
      # 連接超時(shí)時(shí)間,單位ms
      connect-timeout: 50000
      # 選擇第幾個(gè)數(shù)據(jù)庫(kù),默認(rèn)為0,最大值15
      database: 0
      lettuce:
        pool:
          # 最大的活躍連接數(shù),不會(huì)超過這個(gè)數(shù),根據(jù)項(xiàng)目預(yù)期并發(fā)量調(diào)整
          max-active: 50
          # max-idle 指定了連接池中的最大空閑連接數(shù)。
          # 空閑連接是指那些沒有被使用,但是已經(jīng)創(chuàng)建并且保持在連接池中的連接
          # 這個(gè)值應(yīng)該與max-active相匹配或者稍微低一些,
          # 以保持連接池中有足夠的空閑連接來處理突發(fā)請(qǐng)求。
          # 設(shè)置得太高可能會(huì)導(dǎo)致資源浪費(fèi),因?yàn)榭臻e連接會(huì)占用內(nèi)存和其他資源。
          max-idle: 30
          #這個(gè)配置指定了連接池中的最小空閑連接數(shù)。
          #這個(gè)設(shè)置可以確保連接池始終保持一定數(shù)量的空閑連接,以便在請(qǐng)求到來時(shí)可以立即使用,而不需要等待連接的創(chuàng)建。
          # 這個(gè)值應(yīng)該根據(jù)你的應(yīng)用程序的基線負(fù)載來設(shè)置
          min-idle: 10
          # 當(dāng)連接池達(dá)到最大活躍連接數(shù)時(shí),客戶端等待可用連接的最大時(shí)間(以毫秒為單位)。-1 表示無限等待
          # 如果設(shè)置為一個(gè)正數(shù),那么在等待時(shí)間超過這個(gè)值后,會(huì)拋出一個(gè)異常。
          max-wait: -1

1.3 設(shè)置redis的序列化

為了防止存入到redis的數(shù)據(jù)出現(xiàn)亂碼的情況,進(jìn)行序列化的設(shè)置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@Configuration
public class redisConfig {
	@ConditionalOnMissingBean(name = "redisTemplate")
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        // 默認(rèn)為utf-8,可以進(jìn)行修改
        template.setKeySerializer(new StringRedisSerializer());
        // 原版默認(rèn)使用jdk的序列化方式JdkSerializationRedisSerializer
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
        template.setValueSerializer(serializer);
        // 設(shè)置Hash的序列化化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        // 設(shè)置屬性
        template.afterPropertiesSet();
        return template;
    }
}

使用redis

2.1 存取string

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class test {
    @Resource
    private RedisTemplate<String,String> redisTemplate;
    @GetMapping(value="/setString")
    public String setString() {
        String key = "test";
        // 插入一個(gè)字符串
        redisTemplate.opsForValue().set(key,"123");
        // 再?gòu)膔edis讀取這個(gè)key值對(duì)應(yīng)的value
        String s = redisTemplate.opsForValue().get(key);
        System.out.println(s);
        // 再次設(shè)置值,會(huì)進(jìn)行覆蓋
        // redisTemplate.opsForValue().set(key,"456");
        // s = redisTemplate.opsForValue().get(key);
        return s;
    }
    @GetMapping(value="/append")
    public void append() {
        str.opsForValue().set("jolly", "hello");
        String xiaolong = str.opsForValue().get("jolly");
        // 追加字符串
        str.opsForValue().append("jolly", "哈哈");
        // 獲取長(zhǎng)度
        Long size = str.opsForValue().size("jolly");
    }
}

2.2 存取Object

存儲(chǔ)對(duì)象其實(shí)和string本質(zhì)上是一樣的,也就是將對(duì)象序列化為json字符串,在取的時(shí)候再將字符串轉(zhuǎn)為對(duì)象
首先創(chuàng)建一個(gè)對(duì)象

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class user implements Serializable{
    private int id;
    private String name;
    private int age;
    private String email;
}
@RestController
@RequestMapping("/test")
public class test {
    @Resource
    // 這要需要修改
    private RedisTemplate<String,Object> redisTemplate;
    @GetMapping(value="/setObject")
    public String setObject() {
        String key = "obj";
        user user = new user(1,"jolly",22,"1589112546@qq.com");
        redisTemplate.opsForValue().set(key,user);
        Object o = redisTemplate.opsForValue().get(key);
        System.out.println(o);
        return "s";
    }
}

2.3 存取list

redis中l(wèi)ist的左右都可以進(jìn)出,可以理解為雙端隊(duì)列,還可以使用redis中的list作為消息隊(duì)列

    @GetMapping(value = "/list")
    public String list() {
        redisTemplate.opsForList().leftPush("list","1");
        redisTemplate.opsForList().leftPush("list","2");
        redisTemplate.opsForList().rightPush("list","3");
        // 獲取第一個(gè)
        // redisTemplate.opsForList().getFirst("list");
        // redisTemplate.opsForList().leftPop("list");
        redisTemplate.opsForList().rightPush("list","4");
        List<String> s = redisTemplate.opsForList().range("list",0,4);
        // s = [2, 1, 3, 4]
        return s.toString();
    }
2.4 存取Set中的元素

Set中的元素是無序且唯一的,并且Redis中Set中的元素都是字符串類型。所以存取對(duì)象需要序列化為字符串類型。并且Redis的Set集合中還提供了兩個(gè)集合求并集和交集的功能。

 @Resource
 private RedisTemplate<String,String> redisTemplate;
 @GetMapping("/Set")
    public void set(){
        String key = "set1";
        String key2= "set2";
        redisTemplate.opsForSet().add(key, "1","1","2","3");
        redisTemplate.opsForSet().add(key2, "1","5","2","4");
        Set<String> members = redisTemplate.opsForSet().members(key);
        //輸出 [2, 1, 3]
        System.out.println(members);
        Boolean member = redisTemplate.opsForSet().isMember(key, "1");
        //判斷是否存在
        System.out.println(member);
        //獲取Set集合中元素的個(gè)數(shù)
        Long size = redisTemplate.opsForSet().size(key);
        System.out.println(size);
        // 刪除指定元素
        // redisTemplate.opsForSet().remove(key,"1");
        // 集合求并集
        Set<String> union = redisTemplate.opsForSet().union(key, key2);
        System.out.println(union);
        //求交集,比如可以求共同好友
        Set<String> intersect = redisTemplate.opsForSet().intersect(key, key2);
        System.out.println(intersect);
    }

2.5 存取ZSet

在Redis中,ZSet(有序集合)是一種數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)唯一、不重復(fù)的字符串元素,同時(shí)每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)浮點(diǎn)數(shù)分?jǐn)?shù)(score),這個(gè)分?jǐn)?shù)用于按照從低到高排序元素。ZSet因此也是Redis中最復(fù)雜的數(shù)據(jù)結(jié)構(gòu)之一。

以下是ZSet與普通Set(集合)的主要區(qū)別:

1.排序:

  • ZSet:元素根據(jù)分?jǐn)?shù)(score)進(jìn)行排序,可以獲取指定分?jǐn)?shù)范圍內(nèi)的元素。
  • Set:Set中的元素是無序的,因?yàn)樗鼈兪腔诠1韺?shí)現(xiàn)的,所以不能對(duì)元素進(jìn)行排序。

2.分?jǐn)?shù)(Score):

  • ZSet:每個(gè)元素都與一個(gè)分?jǐn)?shù)相關(guān)聯(lián),這個(gè)分?jǐn)?shù)是排序的依據(jù)。
  • Set:Set中的元素沒有與之關(guān)聯(lián)的分?jǐn)?shù),因此不能根據(jù)任何值進(jìn)行排序。

3.操作:

  • ZSet:除了添加、刪除和檢查成員等基本操作外,還可以根據(jù)分?jǐn)?shù)范圍進(jìn)行查詢、獲取元素的排名等。
  • Set:提供基本的集合操作,如添加、刪除、判斷元素是否存在、計(jì)算集合的交集和并集等。

4.使用場(chǎng)景:

  • ZSet:適用于需要排序的場(chǎng)景,如排行榜、時(shí)間序列數(shù)據(jù)等。
  • Set:適用于需要確保元素唯一性的集合操作,而不關(guān)心元素的順序。
@GetMapping("/ZSet")
    public void zSet() {
        String key = "ZSet" ;
        // 排序手機(jī)的銷量情況
        redisTemplate.opsForZSet().add(key,"小米",100);
        redisTemplate.opsForZSet().add(key,"華為",120);
        redisTemplate.opsForZSet().add(key,"Apple",200);
        redisTemplate.opsForZSet().add(key,"Oppo",99);
        // 統(tǒng)計(jì)范圍中的個(gè)數(shù),包含100,和200
        Long count = redisTemplate.opsForZSet().count(key, 100, 200);
        // 輸出3
        System.out.println(count);
        // 輸出[Oppo, 小米, 華為, Apple],默認(rèn)從小到大
        Set<String> range = redisTemplate.opsForZSet().range(key, 0, -1);
        System.out.println(range);
        // 從大到小使用
        // Set<String> reverseRange = redisTemplate.opsForZSet().reverseRange(key, 0, -1);
        // 獲取前2個(gè)最大值,得到全部數(shù)據(jù)[[score=200.0, value=Apple], [score=120.0, value=華為]]
        Set<ZSetOperations.TypedTuple<String>> l = redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, 1);
        System.out.println(l);
    }

2.6 存取Hash

常見使用場(chǎng)景:

  1. 對(duì)象存儲(chǔ):Hash經(jīng)常用來存儲(chǔ)對(duì)象,其中field對(duì)應(yīng)對(duì)象的屬性,value對(duì)應(yīng)屬性的值。
  2. 數(shù)據(jù)庫(kù)行:可以將Hash用作輕量級(jí)的數(shù)據(jù)庫(kù)行,field對(duì)應(yīng)列名,value對(duì)應(yīng)列的值。
  3. 緩存:可以用來緩存具有多個(gè)字段的記錄,比如用戶信息、配置信息等。
@GetMapping("/hash")
    public void hash() {
        String key = "hash1";
        redisTemplate.opsForHash().put(key, "1", "world");
        redisTemplate.opsForHash().put(key, "2", "world2");
        redisTemplate.opsForHash().put(key, "3", "world3");
//        user user = new user(1,"jolly",22,"1589112546@qq.com");
//        redisTemplate.opsForHash().put(key, "4", user);
        Object o = redisTemplate.opsForHash().get(key, "1");
        System.out.println(o);
        // 獲取hash中所有的key
        Set<Object> keys = redisTemplate.opsForHash().keys(key);
        System.out.printf(keys.toString());
        // 獲取所有的value
        List<Object> values = redisTemplate.opsForHash().values(key);
        System.out.printf(values.toString());
    }

2.7存取Bitmap

Bitmap實(shí)際上是對(duì)字符串的抽象,但它將字符串看作是一個(gè)由二進(jìn)制位組成的數(shù)組。
應(yīng)用場(chǎng)景
1.用戶活躍度統(tǒng)計(jì)
可以使用Bitmap來記錄用戶每天的登錄情況,每個(gè)用戶對(duì)應(yīng)一個(gè)key,每天的日期對(duì)應(yīng)一個(gè)offset,如果用戶在那天登錄,則將對(duì)應(yīng)的位設(shè)置為1。
2.布隆過濾器(Bloom Filter)
Bitmap可以用來實(shí)現(xiàn)布隆過濾器,用于快速判斷一個(gè)元素是否在一個(gè)集合中,雖然有一定的誤判率,但非常節(jié)省空間。
3.簡(jiǎn)單的布爾值存儲(chǔ):
當(dāng)需要存儲(chǔ)大量布爾值時(shí),Bitmap可以非常節(jié)省空間,比如記錄用戶的性別、訂閱狀態(tài)等。
4.事件計(jì)數(shù):
可以使用Bitmap來記錄事件的發(fā)生,比如記錄用戶點(diǎn)擊廣告的情況,每個(gè)廣告點(diǎn)擊事件對(duì)應(yīng)一個(gè)位。

Bitmap的最大offset為2^32 - 1,即可以處理的最大字符串長(zhǎng)度為512MB。
redisTemplate 沒有快捷的調(diào)用bitcount命令,有點(diǎn)離譜

@GetMapping("/Bitmap")
    public void bitmap(){
        // 用戶id
        String id = "admiuad@ad#al.";
        redisTemplate.opsForValue().setBit(id,0,true);
        redisTemplate.opsForValue().setBit(id,99,true);
        redisTemplate.opsForValue().setBit(id,100,true);
        redisTemplate.opsForValue().setBit(id,200,true);
        // 獲取當(dāng)天的登錄情況
        @GetMapping("/Bitmap")
    public void bitmap(){
        // 用戶id
        String id = "admiuad@ad#al.";
        redisTemplate.opsForValue().setBit(id,0,true);
        redisTemplate.opsForValue().setBit(id,99,true);
        redisTemplate.opsForValue().setBit(id,100,true);
        redisTemplate.opsForValue().setBit(id,200,true);
        redisTemplate.opsForValue().setBit(id,300,true);
        redisTemplate.opsForValue().setBit(id,365,true);
        // 獲取當(dāng)天的登錄情況
        Boolean bit = redisTemplate.opsForValue().getBit(id, 0);
        System.out.println(bit);
        System.out.println(bitCount(id,0,365));
    }
    public Long bitCount(String key, int start, int end) {
        return redisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(key.getBytes(), start, end));
    }

到此這篇關(guān)于springboot3使用redis 最新詳細(xì)方法的文章就介紹到這了,更多相關(guān)springboot3使用redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Chassis3的多種序列化方式支持技術(shù)解密

    Java?Chassis3的多種序列化方式支持技術(shù)解密

    這篇文章主要為大家介紹了Java?Chassis?3多種序列化方式支持技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Spring Boot利用Docker快速部署項(xiàng)目的完整步驟

    Spring Boot利用Docker快速部署項(xiàng)目的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot利用Docker快速部署項(xiàng)目的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • SpringCloud OpenFeign Post請(qǐng)求400錯(cuò)誤解決方案

    SpringCloud OpenFeign Post請(qǐng)求400錯(cuò)誤解決方案

    這篇文章主要介紹了SpringCloud OpenFeign Post請(qǐng)求400錯(cuò)誤解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • java用字節(jié)數(shù)組解決FileInputStream讀取漢字出現(xiàn)亂碼問題

    java用字節(jié)數(shù)組解決FileInputStream讀取漢字出現(xiàn)亂碼問題

    這篇文章主要介紹了java用字節(jié)數(shù)組解決FileInputStream讀取漢字出現(xiàn)亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 實(shí)例講解Java并發(fā)編程之變量

    實(shí)例講解Java并發(fā)編程之變量

    這篇文章主要介紹了實(shí)例講解Java并發(fā)編程之變量,本文講解了編寫線程安全需要關(guān)心的共享變量和可變變量,需要的朋友可以參考下
    2015-04-04
  • SpringBoot統(tǒng)一功能處理示例詳解(攔截器)

    SpringBoot統(tǒng)一功能處理示例詳解(攔截器)

    這篇文章主要介紹了SpringBoot統(tǒng)一功能處理(攔截器),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 一篇文章看懂Java異常處理

    一篇文章看懂Java異常處理

    異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并且錯(cuò)誤有時(shí)候是可以避免的,這篇文章主要給大家介紹了關(guān)于Java異常處理的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java二維數(shù)組實(shí)戰(zhàn)案例

    Java二維數(shù)組實(shí)戰(zhàn)案例

    這篇文章主要介紹了Java二維數(shù)組,結(jié)合具體案例形式分析了java二維數(shù)組定義、遍歷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • springboot文件打包成jar或war的方法

    springboot文件打包成jar或war的方法

    這篇文章主要介紹了springboot文件打包成jar或war的方法以及相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-08-08
  • Java 正則表達(dá)式入門詳解(基礎(chǔ)進(jìn)階)

    Java 正則表達(dá)式入門詳解(基礎(chǔ)進(jìn)階)

    最近看到很多同學(xué)想要學(xué)習(xí)java正則表達(dá)式的一些知識(shí),那么腳本之家小編就為大家介紹一下,其實(shí)正則表達(dá)式實(shí)用性很強(qiáng),處理大幅文字的時(shí)候都需要用得到,語(yǔ)法也大同小異
    2017-10-10

最新評(píng)論

五原县| 扬州市| 江陵县| 邵阳县| 咸丰县| 磐石市| 新营市| 许昌市| 桑日县| 即墨市| 青海省| 公主岭市| 紫阳县| 商城县| 贵港市| 五峰| 金山区| 博客| 新安县| 禄丰县| 福州市| 札达县| 卓资县| 栾城县| 平乡县| 麻城市| 正阳县| 崇明县| 山西省| 砀山县| 全南县| 盈江县| 都兰县| 贵港市| 连城县| 安徽省| 会东县| 屯昌县| 新民市| 石嘴山市| 兴海县|