自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Redis實戰(zhàn)之Redisson使用技巧詳解,干活!

數(shù)據(jù)庫 Redis
總結(jié)下來,Jedis 把 Redis 命令封裝的非常全面,Lettuce 則進(jìn)一步豐富了 Api,支持 Redis 各種高級特性。

一、摘要

什么是 Redisson?來自于官網(wǎng)上的描述內(nèi)容如下!

Redisson 是一個在 Redis 的基礎(chǔ)上實現(xiàn)的 Java 駐內(nèi)存數(shù)據(jù)網(wǎng)格客戶端(In-Memory Data Grid)。它不僅提供了一系列的 redis 常用數(shù)據(jù)結(jié)構(gòu)命令服務(wù),還提供了許多分布式服務(wù),例如分布式鎖、分布式對象、分布式集合、分布式遠(yuǎn)程服務(wù)、分布式調(diào)度任務(wù)服務(wù)等等。

相比于 Jedis、Lettuce 等基于 redis 命令封裝的客戶端,Redisson 提供的功能更加高端和抽象,逼格高!

更多功能特性和開發(fā)文檔說明,可用移步github進(jìn)行獲取,訪問地址如下:

https://github.com/redisson/redisson/wiki/目錄

接下來,我們就一起來聊一下,如何使用 Redisson 操作 Redis 中的字符串、哈希、列表、集合、有序集合,以及布隆過濾器和分布式鎖等功能。

二、Redisson

2.1、基本使用

跟過去一樣,首先創(chuàng)建一個 maven 項目,添加??Redisson??依賴包。

<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>

單機(jī)環(huán)境下,簡單樣例如下!

public class RedissonMain {

public static void main(String[] args){
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setPassword("123456")
.setDatabase(0);
//獲取客戶端
RedissonClient redissonClient = Redisson.create(config);
//獲取所有的key
redissonClient.getKeys().getKeys().forEach(key -> System.out.println(key));
//關(guān)閉客戶端
redissonClient.shutdown();
}
}

ps:創(chuàng)建 RedissonClient 對象實例的方式多鐘多樣,可以直接通過在代碼中設(shè)置 Redis 服務(wù)的相關(guān)參數(shù)創(chuàng)建,也可以通過加載 JSON 格式、 YAML 格式或者 Spring XML 配置文件來創(chuàng)建,詳細(xì)的參數(shù)配置可用移步上文提到的 Redisson 開發(fā)文檔。

2.2、字符串操作

Redisson 支持通過RBucket對象來操作字符串?dāng)?shù)據(jù)結(jié)構(gòu),通過RBucket實例可以設(shè)置value或設(shè)置value和有效期,簡單樣例如下!

//字符串操作
RBucket<String> rBucket = redissonClient.getBucket("strKey");
// 設(shè)置value和key的有效期
rBucket.set("張三", 30, TimeUnit.SECONDS);
// 通過key獲取value
System.out.println(redissonClient.getBucket("strKey").get());

2.3、對象操作

Redisson 支持將對象作為value存入redis,被存儲的對象事先必須要實現(xiàn)序列化接口Serializable,否則會報錯,簡單樣例如下!

public class Student implements Serializable {

private Long id;

private String name;

private Integer age;

//set、get...

@Override
public String toString(){
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
//Student對象
Student student = new Student();
student.setId(1L);
student.setName("張三");
student.setAge(18);

//對象操作
RBucket<Student> rBucket = redissonClient.getBucket("objKey");
// 設(shè)置value和key的有效期
rBucket.set(student, 30, TimeUnit.SECONDS);
// 通過key獲取value
System.out.println(redissonClient.getBucket("objKey").get());

2.4、哈希操作

Redisson 支持通過RMap?對象來操作哈希數(shù)據(jù)結(jié)構(gòu),簡單樣例如下!

//哈希操作
RMap<String, String> rMap = redissonClient.getMap("mapkey");
// 設(shè)置map中key-value
rMap.put("id", "123");
rMap.put("name", "趙四");
rMap.put("age", "50");

//設(shè)置過期時間
rMap.expire(30, TimeUnit.SECONDS);
// 通過key獲取value
System.out.println(redissonClient.getMap("mapkey").get("name"));

2.5、列表操作

Redisson 支持通過RList對象來操作列表數(shù)據(jù)結(jié)構(gòu),簡單樣例如下!

//字符串操作
RList<Student> rList = redissonClient.getList("listkey");

Student student1 = new Student();
student1.setId(1L);
student1.setName("張三");
student1.setAge(18);
rList.add(student1);

Student student2 = new Student();
student2.setId(2L);
student2.setName("李四");
student2.setAge(19);
rList.add(student2);

//設(shè)置過期時間
rList.expire(30, TimeUnit.SECONDS);
// 通過key獲取value
System.out.println(redissonClient.getList("listkey"));

2.6、集合操作

Redisson 支持通過RSet對象來操作集合數(shù)據(jù)結(jié)構(gòu),簡單樣例如下!

//字符串操作
RSet<Student> rSet = redissonClient.getSet("setkey");

Student student1 = new Student();
student1.setId(1L);
student1.setName("張三");
student1.setAge(18);
rSet.add(student1);

Student student2 = new Student();
student2.setId(2L);
student2.setName("李四");
student2.setAge(19);
rSet.add(student2);

//設(shè)置過期時間
rSet.expire(30, TimeUnit.SECONDS);
// 通過key獲取value
System.out.println(redissonClient.getSet("setkey"));

2.6、有序集合操作

Redisson 支持通過RSortedSet對象來操作有序集合數(shù)據(jù)結(jié)構(gòu),在使用對象來存儲之前,實體對象必須先實現(xiàn)Comparable接口,并重寫比較邏輯,否則會報錯,簡單樣例如下!

public class Student implements Serializable, Comparable<Student> {

private Long id;

private String name;

private Integer age;

//get、set.....

@Override
public String toString(){
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}

@Override
public int compareTo(Student obj){
return this.getId().compareTo(obj.getId());
}
}
//有序集合操作
RSortedSet<Student> sortSetkey = redissonClient.getSortedSet("sortSetkey");

Student student1 = new Student();
student1.setId(1L);
student1.setName("張三");
student1.setAge(18);
sortSetkey.add(student1);

Student student2 = new Student();
student2.setId(2L);
student2.setName("李四");
student2.setAge(19);
sortSetkey.add(student2);

// 通過key獲取value
System.out.println(redissonClient.getSortedSet("sortSetkey"));

2.7、布隆過濾器

布隆過濾器(Bloom Filter)是 1970 年由布隆提出的。它實際上是一個很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù)。

布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點是空間效率和查詢時間都比一般的算法要好的多,缺點是有一定的誤識別率和刪除困難。

Redisson 支持通過RBloomFilter對象來操作布隆過濾器,簡單樣例如下!

RBloomFilter rBloomFilter = redissonClient.getBloomFilter("seqId");
// 初始化預(yù)期插入的數(shù)據(jù)量為10000和期望誤差率為0.01
rBloomFilter.tryInit(10000, 0.01);
// 插入部分?jǐn)?shù)據(jù)
rBloomFilter.add("100");
rBloomFilter.add("200");
rBloomFilter.add("300");
//設(shè)置過期時間
rBloomFilter.expire(30, TimeUnit.SECONDS);
// 判斷是否存在
System.out.println(rBloomFilter.contains("300"));
System.out.println(rBloomFilter.contains("200"));
System.out.println(rBloomFilter.contains("999"));

2.8、分布式自增ID

ID 是數(shù)據(jù)的唯一標(biāo)識,傳統(tǒng)的做法是利用 UUID 和數(shù)據(jù)庫的自增 ID。

但由于 UUID 是無序的,不能附帶一些其他信息,因此實際作用有限。

隨著業(yè)務(wù)的發(fā)展,數(shù)據(jù)量會越來越大,需要對數(shù)據(jù)進(jìn)行分表,甚至分庫。分表后每個表的數(shù)據(jù)會按自己的節(jié)奏來自增,這樣會造成 ID 沖突,因此這時就需要一個單獨的機(jī)制來負(fù)責(zé)生成唯一 ID,redis 原生支持生成全局唯一的 ID。

簡單樣例如下!

final String lockKey = "aaaa";
//通過redis的自增獲取序號
RAtomicLong atomicLong = redissonClient.getAtomicLong(lockKey);
//設(shè)置過期時間
atomicLong.expire(30, TimeUnit.SECONDS);
// 獲取值
System.out.println(atomicLong.incrementAndGet());

2.9、分布式鎖

Redisson 最大的亮點,也是使用最多的功能,就是提供了強大的分布式鎖實現(xiàn),特點是:使用簡單、安全!

簡單使用樣例如下!

Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setPassword("123456")
.setDatabase(0);
RedissonClient redissonClient = Redisson.create(config);
//獲取鎖對象實例
final String lockKey = "abc";
RLock rLock = redissonClient.getLock(lockKey);

try {
//嘗試5秒內(nèi)獲取鎖,如果獲取到了,最長60秒自動釋放
boolean res = rLock.tryLock(5L, 60L, TimeUnit.SECONDS);
if (res) {
//成功獲得鎖,在這里處理業(yè)務(wù)
System.out.println("獲取鎖成功");
}
} catch (Exception e) {
System.out.println("獲取鎖失敗,失敗原因:" + e.getMessage());
} finally {
//無論如何, 最后都要解鎖
rLock.unlock();
}

//關(guān)閉客戶端
redissonClient.shutdown();

以上是單機(jī)環(huán)境下的分布式鎖實現(xiàn)邏輯,如果是集群環(huán)境下,應(yīng)該如何處理呢?

Redisson 提供RedissonRedLock操作類,也被稱為紅鎖,實現(xiàn)原理簡單的總結(jié)有以下幾點:

  • 如果有多個 redis 集群的時候,當(dāng)且僅當(dāng)從大多數(shù)(N/2+1,比如有3個 redis 節(jié)點,那么至少有2個節(jié)點)的 Redis 節(jié)點都取到鎖,并且獲取鎖使用的總耗時小于鎖失效時間時,鎖才算獲取成功
  • 如果獲取失敗,客戶端會在所有的 Redis 實例上進(jìn)行解鎖操作
  • 集群環(huán)境下,redis 服務(wù)器直接不存在任何復(fù)制或者其他隱含的分布式協(xié)調(diào)機(jī)制,否則會存在實效的可能

RedissonRedLock簡單使用樣例如下!

Config config1 = new Config();
config1.useSingleServer().setAddress("redis://192.168.3.111:6379").setPassword("a123456").setDatabase(0);
RedissonClient redissonClient1 = Redisson.create(config1);

Config config2 = new Config();
config2.useSingleServer().setAddress("redis://192.168.3.112:6379").setPassword("a123456").setDatabase(0);
RedissonClient redissonClient2 = Redisson.create(config2);

Config config3 = new Config();
config3.useSingleServer().setAddress("redis://192.168.3.113:6379").setPassword("a123456").setDatabase(0);
RedissonClient redissonClient3 = Redisson.create(config3);

//獲取多個 RLock 對象
final String lockKey = "abc";
RLock lock1 = redissonClient1.getLock(lockKey);
RLock lock2 = redissonClient2.getLock(lockKey);
RLock lock3 = redissonClient3.getLock(lockKey);

//根據(jù)多個 RLock 對象構(gòu)建 RedissonRedLock (最核心的差別就在這里)
RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);

try {
//嘗試5秒內(nèi)獲取鎖,如果獲取到了,最長60秒自動釋放
boolean res = redLock.tryLock(5L, 60L, TimeUnit.SECONDS);
if (res) {
//成功獲得鎖,在這里處理業(yè)務(wù)
System.out.println("獲取鎖成功");

}
} catch (Exception e) {
System.out.println("獲取鎖失敗,失敗原因:" + e.getMessage());
} finally {
//無論如何, 最后都要解鎖
redLock.unlock();
}

更加詳細(xì)的分布式鎖實現(xiàn)原理分析,可以移步到這個地址查閱。

https://blog.csdn.net/asd051377305/article/details/108384490

2.10、集群模式

以上介紹的都是單機(jī)模式,如果是集群環(huán)境,我們可以采用如下方式進(jìn)行配置:

Config config = new Config();
config.useClusterServers()
.setScanInterval(2000) // 集群狀態(tài)掃描間隔時間,單位是毫秒
//可以用"rediss://"來啟用SSL連接
.addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001")
.addNodeAddress("redis://127.0.0.1:7002");

RedissonClient redisson = Redisson.create(config);

2.11、哨兵模式

哨兵模式,參數(shù)配置方式如下:

Config config = new Config();
config.useSentinelServers()
.setMasterName("mymaster")
//可以用"rediss://"來啟用SSL連接
.addSentinelAddress("127.0.0.1:26389", "127.0.0.1:26379")
.addSentinelAddress("127.0.0.1:26319");

RedissonClient redisson = Redisson.create(config);

2.12、主從模式

主從模式,參數(shù)配置方式如下:

Config config = new Config();
config.useMasterSlaveServers()
//可以用"rediss://"來啟用SSL連接
.setMasterAddress("redis://127.0.0.1:6379")
.addSlaveAddress("redis://127.0.0.1:6389", "redis://127.0.0.1:6332", "redis://127.0.0.1:6419")
.addSlaveAddress("redis://127.0.0.1:6399");

RedissonClient redisson = Redisson.create(config);

三、小結(jié)

在前幾篇文章中,我們詳細(xì)的介紹了 Jedis、Lettuce,我們不禁會發(fā)出一個疑問:Redisson和Jedis、Lettuce有什么區(qū)別?

現(xiàn)在我們再回頭來總結(jié)一番!

  • Jedis:Redis 官方推出的用于通過 Java 連接 Redis 客戶端的一個工具包,它提供了全面的類似于 Redis 原生命令的支持,是目前使用最廣的一款 java 客戶端。
  • Lettuce:一個可擴(kuò)展的線程安全的 Redis 客戶端,通訊框架基于 Netty 開發(fā),支持高級的 Redis 特性,比如哨兵,集群,管道,自動重新連接等特性。從 Spring Boot 2.x 開始, Lettuce 已取代 Jedis 成為首選 Redis 的客戶端。
  • Redisson:一款架設(shè)在 Redis 基礎(chǔ)上,通訊基于 Netty 的綜合的、新型的中間件,是企業(yè)級開發(fā)中使用 Redis 的最佳范本。

總結(jié)下來,Jedis 把 Redis 命令封裝的非常全面,Lettuce 則進(jìn)一步豐富了 Api,支持 Redis 各種高級特性。

但是兩者并沒有進(jìn)一步深化,只給了你操作 Redis 數(shù)據(jù)庫的工具,而 Redisson 則是基于 Redis、Lua 和 Netty 建立起了一套的分布式解決方案,比如分布式鎖的實現(xiàn),分布式對象的操作等等。

在實際使用過程中,Lettuce? + Redisson組合使用的比較多,兩者相鋪相成。

關(guān)于分布式鎖實現(xiàn)的應(yīng)用,生產(chǎn)環(huán)境推薦盡量采用單點環(huán)境來實現(xiàn),基本上解決絕大部分的分布式鎖問題,如果當(dāng)前服務(wù)的環(huán)境確實很復(fù)雜,可以采用RedissonRedLock來實現(xiàn)。

四、參考

1、Redisson 開發(fā)文檔

2、王同學(xué) - 聊一聊Redis官方置頂推薦的Java客戶端Redisson

3、Venlenter - Redis分布式鎖-這一篇全了解(Redission實現(xiàn)分布式鎖完美方案)

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2022-12-22 07:40:28

2022-12-23 07:36:50

RedisLettuce技巧

2023-10-31 08:22:31

線程類型.NET

2023-08-28 07:49:24

Redisson鎖機(jī)制源碼

2009-09-04 10:45:18

MyEclipse使用

2009-12-04 10:19:11

PHP hack

2023-02-03 08:21:55

2024-02-29 08:02:00

2011-08-08 17:05:02

XCode UserScript 腳本

2022-11-29 10:42:46

GoFrame技巧腳手架

2021-11-29 13:29:06

Basemap可視化分析

2023-02-01 08:22:37

2021-09-29 06:03:37

JavaScriptreduce() 前端

2011-07-15 13:35:52

Windows 200

2024-03-18 11:24:54

2009-07-31 17:51:42

linux vi命令詳linux vi命令編輯器

2009-12-07 10:54:46

PHP uploade

2009-08-17 08:42:48

LinuxScreen命令使用技巧

2025-02-21 12:30:00

字符串前端JavaScript

2018-12-24 12:40:03

大數(shù)據(jù)IT互聯(lián)網(wǎng)
點贊
收藏

51CTO技術(shù)棧公眾號