springboot3使用redis 最新詳細(xì)方法示例詳解
1.Spring Data Redis
這是Spring框架提供的一個用于簡化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 進行配置
spring:
data:
redis:
# 改為自己的地址和密碼
host: 10.69.37.213
port: 6379
password: Jolly
# 連接超時時間,單位ms
connect-timeout: 50000
# 選擇第幾個數(shù)據(jù)庫,默認(rèn)為0,最大值15
database: 0
lettuce:
pool:
# 最大的活躍連接數(shù),不會超過這個數(shù),根據(jù)項目預(yù)期并發(fā)量調(diào)整
max-active: 50
# max-idle 指定了連接池中的最大空閑連接數(shù)。
# 空閑連接是指那些沒有被使用,但是已經(jīng)創(chuàng)建并且保持在連接池中的連接
# 這個值應(yīng)該與max-active相匹配或者稍微低一些,
# 以保持連接池中有足夠的空閑連接來處理突發(fā)請求。
# 設(shè)置得太高可能會導(dǎo)致資源浪費,因為空閑連接會占用內(nèi)存和其他資源。
max-idle: 30
#這個配置指定了連接池中的最小空閑連接數(shù)。
#這個設(shè)置可以確保連接池始終保持一定數(shù)量的空閑連接,以便在請求到來時可以立即使用,而不需要等待連接的創(chuàng)建。
# 這個值應(yīng)該根據(jù)你的應(yīng)用程序的基線負(fù)載來設(shè)置
min-idle: 10
# 當(dāng)連接池達(dá)到最大活躍連接數(shù)時,客戶端等待可用連接的最大時間(以毫秒為單位)。-1 表示無限等待
# 如果設(shè)置為一個正數(shù),那么在等待時間超過這個值后,會拋出一個異常。
max-wait: -11.3 設(shè)置redis的序列化
為了防止存入到redis的數(shù)據(jù)出現(xià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,可以進行修改
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";
// 插入一個字符串
redisTemplate.opsForValue().set(key,"123");
// 再從redis讀取這個key值對應(yīng)的value
String s = redisTemplate.opsForValue().get(key);
System.out.println(s);
// 再次設(shè)置值,會進行覆蓋
// 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", "哈哈");
// 獲取長度
Long size = str.opsForValue().size("jolly");
}
}2.2 存取Object
存儲對象其實和string本質(zhì)上是一樣的,也就是將對象序列化為json字符串,在取的時候再將字符串轉(zhuǎn)為對象
首先創(chuàng)建一個對象
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的左右都可以進出,可以理解為雙端隊列,還可以使用redis中的list作為消息隊列
@GetMapping(value = "/list")
public String list() {
redisTemplate.opsForList().leftPush("list","1");
redisTemplate.opsForList().leftPush("list","2");
redisTemplate.opsForList().rightPush("list","3");
// 獲取第一個
// 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中的元素都是字符串類型。所以存取對象需要序列化為字符串類型。并且Redis的Set集合中還提供了兩個集合求并集和交集的功能。
@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集合中元素的個數(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),用于存儲唯一、不重復(fù)的字符串元素,同時每個元素都會關(guān)聯(lián)一個浮點數(shù)分?jǐn)?shù)(score),這個分?jǐn)?shù)用于按照從低到高排序元素。ZSet因此也是Redis中最復(fù)雜的數(shù)據(jù)結(jié)構(gòu)之一。
以下是ZSet與普通Set(集合)的主要區(qū)別:
1.排序:
- ZSet:元素根據(jù)分?jǐn)?shù)(score)進行排序,可以獲取指定分?jǐn)?shù)范圍內(nèi)的元素。
- Set:Set中的元素是無序的,因為它們是基于哈希表實現(xiàn)的,所以不能對元素進行排序。
2.分?jǐn)?shù)(Score):
- ZSet:每個元素都與一個分?jǐn)?shù)相關(guān)聯(lián),這個分?jǐn)?shù)是排序的依據(jù)。
- Set:Set中的元素沒有與之關(guān)聯(lián)的分?jǐn)?shù),因此不能根據(jù)任何值進行排序。
3.操作:
- ZSet:除了添加、刪除和檢查成員等基本操作外,還可以根據(jù)分?jǐn)?shù)范圍進行查詢、獲取元素的排名等。
- Set:提供基本的集合操作,如添加、刪除、判斷元素是否存在、計算集合的交集和并集等。
4.使用場景:
- ZSet:適用于需要排序的場景,如排行榜、時間序列數(shù)據(jù)等。
- Set:適用于需要確保元素唯一性的集合操作,而不關(guān)心元素的順序。
@GetMapping("/ZSet")
public void zSet() {
String key = "ZSet" ;
// 排序手機的銷量情況
redisTemplate.opsForZSet().add(key,"小米",100);
redisTemplate.opsForZSet().add(key,"華為",120);
redisTemplate.opsForZSet().add(key,"Apple",200);
redisTemplate.opsForZSet().add(key,"Oppo",99);
// 統(tǒng)計范圍中的個數(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個最大值,得到全部數(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
常見使用場景:
- 對象存儲:Hash經(jīng)常用來存儲對象,其中field對應(yīng)對象的屬性,value對應(yīng)屬性的值。
- 數(shù)據(jù)庫行:可以將Hash用作輕量級的數(shù)據(jù)庫行,field對應(yīng)列名,value對應(yīng)列的值。
- 緩存:可以用來緩存具有多個字段的記錄,比如用戶信息、配置信息等。
@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ù)組。
應(yīng)用場景
1.用戶活躍度統(tǒng)計:
可以使用Bitmap來記錄用戶每天的登錄情況,每個用戶對應(yīng)一個key,每天的日期對應(yīng)一個offset,如果用戶在那天登錄,則將對應(yīng)的位設(shè)置為1。
2.布隆過濾器(Bloom Filter):
Bitmap可以用來實現(xiàn)布隆過濾器,用于快速判斷一個元素是否在一個集合中,雖然有一定的誤判率,但非常節(jié)省空間。
3.簡單的布爾值存儲:
當(dāng)需要存儲大量布爾值時,Bitmap可以非常節(jié)省空間,比如記錄用戶的性別、訂閱狀態(tài)等。
4.事件計數(shù):
可以使用Bitmap來記錄事件的發(fā)生,比如記錄用戶點擊廣告的情況,每個廣告點擊事件對應(yīng)一個位。
Bitmap的最大offset為2^32 - 1,即可以處理的最大字符串長度為512MB。
redisTemplate 沒有快捷的調(diào)用bitcount命令,有點離譜
@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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)WEB的常用功能案例詳解
這篇文章主要介紹了SpringBoot實現(xiàn)WEB的常用功能,本文將對Spring Boot實現(xiàn)Web開發(fā)中涉及的三大組件Servlet、Filter、Listener以及文件上傳下載功能以及打包部署進行實現(xiàn),需要的朋友可以參考下2022-04-04
spring cloud feign實現(xiàn)遠(yuǎn)程調(diào)用服務(wù)傳輸文件的方法
這篇文章主要介紹了spring cloud feign實現(xiàn)遠(yuǎn)程調(diào)用服務(wù)傳輸文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
spring boot使用thymeleaf為模板的基本步驟介紹
Spring Boot項目的默認(rèn)模板引擎是Thymeleaf,這沒什么好說的,個人覺得也非常好,下面這篇文章主要給大家介紹了關(guān)于spring boot使用thymeleaf為模板的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
下載遠(yuǎn)程maven倉庫的jar?手動放到本地倉庫詳細(xì)操作
這篇文章主要介紹了如何下載遠(yuǎn)程maven倉庫的jar?手動放到本地倉庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

