目錄
一:?Redis的Java客戶端
1. Jedis快速入門
2. Jedis連接池
3. SpringDataRedis快速入門
4. RedisSerializer配置
5. StringRedisTemplate
圖書推薦
一:?Redis的Java客戶端
在Redis官網(wǎng)中提供了各種語言的客戶端,地址:https://redis.io/resources/clients/
Jedis:以Redis命令作為方法名稱,學(xué)習(xí)成本低,簡單實(shí)用。但是Jedis實(shí)例是線程不安全的,多線程環(huán)境下需要基于連接池來使用。
lettuce:lettuce是基于Netty實(shí)現(xiàn)的,支持同步、異步和響應(yīng)式編程方式,并且是線程安全的。支持Redis的哨兵模式、集群模式和管道模式。
Redission:Redisson是一個(gè)基于Redis實(shí)現(xiàn)的分布式、可伸縮的Java數(shù)據(jù)結(jié)構(gòu)集合。包含了諸如Map、Queue、Lock、 Semaphore、AtomicLong等強(qiáng)大功能。
1. Jedis快速入門
Jedis的官網(wǎng)地址: https://github.com/redis/jedis,我們先來個(gè)快速入門:
(1)引入依賴
<!--jedis依賴-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<!--單元測試依賴-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
(2)建立連接:直接alt+insert生成setUp方法
創(chuàng)建Jedis對象,輸入IP和port;調(diào)用auth()方法輸入密碼,調(diào)用select()方法選擇數(shù)據(jù)庫!
@Before
public void setUp() throws Exception {
// 建立接連
jedis = new Jedis("192.168.2.129",6379);
// 設(shè)置密碼
jedis.auth("123456");
// 選擇庫
jedis.select(0);
}
(3)進(jìn)行操作測試:直接alt+insert生成測試方法,手動(dòng)修改方法名即可
注:對于Jedis,方法體中所調(diào)用的方法,其實(shí)就是redis中的命令!
@Test
public void testString() {
// 存數(shù)據(jù)
String set = jedis.set("name", "張三");
System.out.println("set = " + set);
// 取數(shù)據(jù)
String name = jedis.get("name");
System.out.println("name = " + name);
}
(4)釋放資源:直接alt+insert生成tearDown方法
@After
public void tearDown() throws Exception {
if (jedis != null) {
jedis.close();
}
}
具體代碼:
package com.zl.jedis;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
private Jedis jedis;
// 建立連接
@Before
public void setUp() throws Exception {
// 建立接連
jedis = new Jedis("192.168.2.129",6379);
// 設(shè)置密碼
jedis.auth("123456");
// 選擇庫
jedis.select(0);
}
// 操作
@Test
public void testString() {
// 存數(shù)據(jù)
String set = jedis.set("name", "張三");
System.out.println("set = " + set);
// 取數(shù)據(jù)
String name = jedis.get("name");
System.out.println("name = " + name);
}
@After
public void tearDown() throws Exception {
if (jedis != null) {
jedis.close();
}
}
}
執(zhí)行結(jié)果:
2. Jedis連接池
Jedis本身是線程不安全的,并且頻繁的創(chuàng)建和銷毀連接會(huì)有性能損耗,因此推薦大家使用Jedis連接池代替Jedis的直連方式!
①首先定義一個(gè)工具類JedisConnectionFactory類,用來獲取Jedis連接池對象;
②定義一個(gè)靜態(tài)的成員變量JedisPool(jedis連接池);
③在靜態(tài)代碼塊中,創(chuàng)建JedisPoolConfig對象(jedis的一些配置),并配置一些基本信息;
④創(chuàng)建jedis連接池對象JedisPool,參數(shù)就是JedisPoolConfig對象、IP、端口、密碼等信息;
⑤最終調(diào)用JedisPool對象的getResource方法,獲取連接池對象。
package com.zl.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
// 配置連接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大連接
jedisPoolConfig.setMaxTotal(8);
// 最大空閑連接
jedisPoolConfig.setMaxIdle(8);
// 最小空閑連接
jedisPoolConfig.setMinIdle(0);
// 設(shè)置最長等待時(shí)間
jedisPoolConfig.setMaxWaitMillis(1000);
// 創(chuàng)建連接池
jedisPool = new JedisPool(jedisPoolConfig, "192.168.2.129", 6379, 1000, "123456");
}
// 獲取Jedis對象
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
3. SpringDataRedis快速入門
SpringData是Spring中數(shù)據(jù)操作的模塊,包含對各種數(shù)據(jù)庫的集成,其中對Redis的集成模塊就叫做SpringDataRedis,官網(wǎng)地址:Spring Data Redis
①提供了對不同Redis客戶端的整合(Lettuce和Jedis);
②提供了RedisTemplate統(tǒng)一API來操作Redis;
③支持Redis的發(fā)布訂閱模型;
④支持Redis哨兵和Redis集群;
⑤支持基于Lettuce的響應(yīng)式編程;
⑥支持基于JDK、JSON、字符串、Spring對象的數(shù)據(jù)序列化及反序列化;
⑦支持基于Redis的JDKCollection實(shí)現(xiàn);
SpringDataRedis中提供了RedisTemplate工具類,其中封裝了各種對Redis的操作。并且將不同數(shù)據(jù)類型的操作API封裝到了不同的類型中(相對于直接使用jredis進(jìn)行分組了):
API |
返回值類型 |
說明 |
redisTemplate.opsForValue() |
ValueOperations |
操作String類型數(shù)據(jù) |
redisTemplate.opsForHash() |
HashOperations |
操作Hash類型數(shù)據(jù) |
redisTemplate.opsForList() |
ListOperations |
操作List類型數(shù)據(jù) |
redisTemplate.opsForSet() |
SetOperations |
操作Set類型數(shù)據(jù) |
redisTemplate.opsForZSet() |
ZSetOperations |
操作SortedSet類型數(shù)據(jù) |
redisTemplate |
通用的命令 |
SpringBoot已經(jīng)提供了對SpringDataRedis的支持,SpringDataRedis的使用步驟:
①引入spring-boot-starter-data-redis起步依賴;
②在application.yml配置Redis信息;
③注入RedisTemplate;
(1)引入依賴
<!--Redis起步依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--連接池依賴,無論是Jedis還是lettcue都是基于連接池的-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
(2)application.yml配置文件
注:Spring默認(rèn)引入的是lettuce,要想使用jedis還要引入jedis的依賴;但是無論是lettuce還是jedis都是基于連接池創(chuàng)建連接的,所以需要前面的commons-pool2連接池依賴。
spring:
redis:
host: 192.168.2.129
port: 6379
password: 123456
lettuce:
pool:
max-active: 8 #最大連接
max-idle: 8 #最大空閑連接
min-idle: 0 #最小空閑連接
max-wait: 100 #連接等待時(shí)間
(3)注入RedisTemplate并測試
package com.zl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class SpringDataRedisApplicationTests {
// 注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
// 插入數(shù)據(jù),參數(shù)不僅僅是字符串,Java對象也可以
redisTemplate.opsForValue().set("name","小紅");
// 獲取數(shù)據(jù)
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
執(zhí)行結(jié)果:
4. RedisSerializer配置
SpringDataRedis的序列化方式:RedisTemplate可以接收任意Object作為值寫入Redis,只不過寫入前會(huì)把Object序列化為字節(jié)形式,默認(rèn)是采用JDK序列化,得到的結(jié)果是這樣的:
實(shí)際上這個(gè)key和value就是我們前面存入的小紅(序列化后的結(jié)果);SpringDataRedis可以接收任何對象,怎么實(shí)現(xiàn)的?就是通過對象的數(shù)據(jù)進(jìn)行序列化及反序列化!
從哪里可以看出是使用了JDK的序列化方式
缺點(diǎn):
①可讀性差;
②內(nèi)存占用較大;
有其它的序列化方式嗎?
①JdkSerializationRedisSerializer:使用JDK的序列化方式,前面我們已經(jīng)用過了!
②StringRedisSerializer:專門處理字符串的類型,例如key基本上都是字符串!
③GenericJackson2JsonRedisSerializer:如果value是對象,建議使用這個(gè)!
怎樣做到,所存即所得呢?我們可以自定義RedisTemplate的序列化方式,代碼如下:
package com.zl.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 創(chuàng)建RedisTemplate對象
RedisTemplate<Object, Object> template = new RedisTemplate<>();
// 連接工廠,這個(gè)工廠springboot會(huì)幫我們創(chuàng)建好
template.setConnectionFactory(connectionFactory);
// 創(chuàng)建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 設(shè)置key的序列化方式
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 設(shè)置value的序列化方式
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}
其中RedisSerializer的string()方法就是使用了StringRedisSerializer的一個(gè)常量
因?yàn)槭褂昧薐SON序列化工具,所以還要引入JSON依賴
<!--引入Jackson依賴-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
再次進(jìn)行測試
package com.zl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class SpringDataRedisApplicationTests {
// 注入RedisTemplate
@Autowired
private RedisTemplate<String,Object> redisTemplate; // 引用泛型
@Test
void testString() {
// 插入數(shù)據(jù),參數(shù)不僅僅是字符串,Java對象也可以
redisTemplate.opsForValue().set("name","小紅");
// 獲取數(shù)據(jù)
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
執(zhí)行結(jié)果:
思考:如果使用Java對象呢??
?給定一個(gè)User對象
package com.zl.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
// 使用以下注解需要引入lombok依賴
@Data // setter and getter
@NoArgsConstructor // 無參構(gòu)造
@AllArgsConstructor // 有參構(gòu)造
public class User {
private String name;
private Integer age;
}
進(jìn)行測試
package com.zl;
import com.zl.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class SpringDataRedisApplicationTests {
// 注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate; // 引用泛型
@Test
void testSaveUser() {
// 插入數(shù)據(jù)
redisTemplate.opsForValue().set("user",new User("張三",18));
// 取出數(shù)據(jù)
User user = (User) redisTemplate.opsForValue().get("user");
System.out.println("user = " + user);
}
}
執(zhí)行結(jié)果:
圖形界面客戶端:
自動(dòng)的把Java對象轉(zhuǎn)換為JSON寫入,當(dāng)獲取結(jié)果的時(shí)候也能反序列化為User對象;實(shí)際上在寫入JSON的同時(shí),把User的字節(jié)碼名稱也寫進(jìn)去了com.zl.pojo.User,通過這個(gè)屬性在反序列化的時(shí)候轉(zhuǎn)換成User對象!
注:為了在反序列化時(shí)知道對象的類型,不僅僅寫了User對象的屬性,還把類的class類型寫入了Json結(jié)果中,存入redis,會(huì)帶來額外的內(nèi)存開銷。
5. StringRedisTemplate
為了節(jié)省內(nèi)存空間,我們并不會(huì)使用JSON序列化器來處理value,而是統(tǒng)一使用String序列化器 ,要求只能存儲(chǔ)String類型的key和value。當(dāng)需要存儲(chǔ)Java對象時(shí),手動(dòng)完成對象的序列化和反序列化!
Spring默認(rèn)提供了一個(gè)StringRedisTemplate類,它的key和value的序列化方式默認(rèn)就是String方式。省去了我們自定義RedisTemplate的過程!
所以,現(xiàn)在最重要的就是處理Java對象,手動(dòng)序列化和反序列
(1)使用JSON工具ObjectMapper(SpringMVC處理Json工具):調(diào)用ObjectMapper對象的writeValuesString()方法手動(dòng)完成序列化,轉(zhuǎn)換成json格式的字符串存入redis;調(diào)用ObjectMapper對象的readValue()方法手動(dòng)完成反序列化,轉(zhuǎn)換成Java對象!
(2)也可以使用fastjson是阿里巴巴的開源JSON解析庫,需要引入fastjon依賴。然后調(diào)用JSON的toJSONString()方法,轉(zhuǎn)換成json格式的字符串;調(diào)用JSON的parseObject()方法,轉(zhuǎn)換成Java對象!
package com.zl;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zl.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
@SpringBootTest
class ApplicationTest {
// 注入StringRedisTemplate
@Autowired
private StringRedisTemplate stringredisTemplate;
// JSON工具
private static final ObjectMapper mapper = new ObjectMapper(); // ObjectMapper是SpringMVC處理Json的工具
// fastjson是阿里巴巴的開源JSON解析庫
@Test
void testString() {
// 對于普通字符串步驟不變
stringredisTemplate.opsForValue().set("name","小紅");
Object name = stringredisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
@Test
void testSaveUser() throws JsonProcessingException {
// 對于Java對象加上手動(dòng)轉(zhuǎn)步驟
// 準(zhǔn)備Java對象
User user = new User("虎哥", 18);
// 手動(dòng)序列化
// String json = mapper.writeValueAsString(user); // 把Java對象轉(zhuǎn)換成Json格式的字符串
String json = JSON.toJSONString(user);
// 寫入redis
stringredisTemplate.opsForValue().set("user",json);
// 讀取數(shù)據(jù)
String val = stringredisTemplate.opsForValue().get("user"); // 讀出來的是Json格式的字符串
// 反序列化
// User user1 = mapper.readValue(val, User.class);
User user1 = JSON.parseObject(val, User.class);
System.out.println("user1 = " + user1);
}
}
執(zhí)行結(jié)果:
圖形界面客戶端:
補(bǔ)充:對于其它類型結(jié)構(gòu)可能就更偏向于JavaAPI的編寫方式,例如:Hash結(jié)構(gòu)
①對于存數(shù)據(jù),不是使用hset()方法,在Spring中不是以命令名作為方法名,因?yàn)轭愃朴贘ava中的HashMap結(jié)構(gòu),所以方法名與HashMap結(jié)構(gòu)的保持一致,使用put()方法進(jìn)行存取。
②對于取數(shù)據(jù),不使用hget,使用的是get()方法取單個(gè),如果取多個(gè)使用entrys()方法。
@Test
void testHash() {
// 插入數(shù)據(jù)
stringredisTemplate.opsForHash().put("user:100","name","張三");
stringredisTemplate.opsForHash().put("user:100","age","18");
// 取出數(shù)據(jù)
Object name = stringredisTemplate.opsForHash().get("user:100", "name"); // 取一個(gè)
Map<Object, Object> entries = stringredisTemplate.opsForHash().entries("user:100");
System.out.println("entries = " + entries); // 取所有
}
總結(jié)RedisTemplate的兩種序列化實(shí)踐方案:
方案一:
①自定義RedisTemplate
②修改RedisTemplate的序列化器為GenericJackson2JsonRedisSerializer
方案二:
①使用StringRedisTemplate
②寫入Redis時(shí),手動(dòng)把對象序列化為JSON;讀取Redis時(shí),手動(dòng)把讀取到的JSON反序列化為對象
圖書推薦
本期圖書:《元宇宙Ⅱ:圖解元技術(shù)區(qū)塊鏈、元資產(chǎn)與Web3.0、元人與理想國(全三冊)》、《產(chǎn)業(yè)鏈金融平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)》
參與方式:
本次送書 1?本(二選一哦)!?
活動(dòng)時(shí)間:截止到 2023-05-09?00:00:00。抽獎(jiǎng)方式:利用程序進(jìn)行抽獎(jiǎng)。
參與方式:關(guān)注博主(只限粉絲福利哦)、點(diǎn)贊、收藏,評論區(qū)隨機(jī)抽取,最多三條評論!
????????看半小時(shí)漫畫,通元宇宙未來100年,300幅手繪插圖輕松讀懂虛實(shí)共生的未來世界。剖析元宇宙三大定律、大統(tǒng)一方程、熵增定律、Web3.0、萬億元資產(chǎn)、元人與區(qū)塊鏈文明,構(gòu)建元宇宙大樓。講透元技術(shù)區(qū)塊鏈、元宇宙基石Web3.0到穿越未來的技術(shù)大革命。厘清8大產(chǎn)業(yè)規(guī)律和11大投資方向,從元宇宙經(jīng)濟(jì)學(xué)到財(cái)富自由2.0,構(gòu)建NO.1無限∞世界的數(shù)字空間,從元人到理想國。
????????這是一個(gè)全新的時(shí)代:Web3.0構(gòu)建的經(jīng)濟(jì)體系,DID身份的跨平臺(tái)操作,數(shù)字NFT的原子級(jí)鏡像,以及DeFi的無摩擦元資產(chǎn)再分配......2022年,奇點(diǎn)出現(xiàn):元人即將誕生;元資產(chǎn)即將分配;元宇宙正在成形。本套書通過元宇宙三大定律、大統(tǒng)一方程、熵增定律、Web3.0、萬億元資產(chǎn)、元人與區(qū)塊鏈文明構(gòu)建了元宇宙第一大樓。第1-80層:數(shù)字人展位、電子寵物、數(shù)字藏品、3D沉侵式旅游、DeFi。第81-160層:AI、VR、AR、MR、DAO、Web3.0、邊緣計(jì)算。第161-214+層:多場景閱讀、4K空間、跨鏈許可、維度轉(zhuǎn)換、無限∞世界。
當(dāng)當(dāng)自營購買鏈接:http://product.dangdang.com/29513251.html
?????????本書從產(chǎn)業(yè)鏈金融的起源講起,結(jié)合實(shí)際案例講解產(chǎn)業(yè)鏈金融平臺(tái)的前臺(tái)設(shè)計(jì)、技術(shù)中臺(tái)設(shè)計(jì)、數(shù)據(jù)平臺(tái)設(shè)計(jì)、風(fēng)控設(shè)計(jì)及信息安全的核心要點(diǎn),既體現(xiàn)了傳統(tǒng)行業(yè)的業(yè)務(wù)創(chuàng)新、數(shù)字轉(zhuǎn)型的探索過程,又介紹了當(dāng)前主流銀行的開放性建設(shè)成果。讀者不但能全方位地了解產(chǎn)業(yè)鏈金融平臺(tái)的建設(shè)過程,還能針對自己感興趣的方面進(jìn)行深入學(xué)習(xí)。
????????本書共6章,第1章介紹了產(chǎn)業(yè)鏈金融的發(fā)展、變革歷程,以及對傳統(tǒng)企業(yè)的核心價(jià)值;第2章介紹了系統(tǒng)核心功能的設(shè)計(jì)及在線簽約、實(shí)名認(rèn)證等技術(shù)的原理;第3章介紹了結(jié)合容器云技術(shù)、微服務(wù)技術(shù)與DevOps技術(shù)構(gòu)建技術(shù)中臺(tái)的過程,以及對接開放銀行、央行征信的過程;第4章介紹了開源大數(shù)據(jù)平臺(tái)的建設(shè)及數(shù)據(jù)倉庫的設(shè)計(jì)思路;第5章基于Python的機(jī)器學(xué)習(xí)庫介紹了智能風(fēng)控的開發(fā)過程;第6章介紹了在產(chǎn)業(yè)鏈金融平臺(tái)建設(shè)過程中如何規(guī)避信息安全的法律風(fēng)險(xiǎn)。
????????本書內(nèi)容全面,且圍繞開源技術(shù)展開介紹,實(shí)用性極強(qiáng),特別適合建設(shè)產(chǎn)業(yè)鏈金融平臺(tái)的傳統(tǒng)企業(yè)架構(gòu)師、開發(fā)人員及產(chǎn)品人員閱讀,也適合對開源的技術(shù)中臺(tái)、大數(shù)據(jù)平臺(tái)及信用風(fēng)控感興趣的開發(fā)人員閱讀。
文章來源:http://www.zghlxwxcb.cn/news/detail-438934.html
京東自營購買鏈接:https://item.jd.com/13797946.html文章來源地址http://www.zghlxwxcb.cn/news/detail-438934.html
到了這里,關(guān)于【Redis入門篇】| Redis的Java客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!