Redis?Java客戶(hù)端建立的兩種方式小結(jié)
第一種方式:Jedis方式
(1)引入依賴(lài)
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<!--單元測(cè)試-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>(2)創(chuàng)建工廠類(lèi)
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
//配置連接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大連接數(shù),也就是線程池最多可以創(chuàng)建8個(gè)連接
poolConfig.setMaxTotal(8);
//最大空閑連接
poolConfig.setMaxIdle(8);
//最小空閑連接,超過(guò)一段時(shí)間后,如果一直沒(méi)有人訪問(wèn),空閑連接就會(huì)被釋放,直到為0為止
poolConfig.setMinIdle(0);
//最大等待時(shí)間,如果超過(guò)1000毫秒,則報(bào)錯(cuò)
poolConfig.setMaxWaitMillis(1000);
//創(chuàng)建連接池對(duì)象
jedisPool = new JedisPool(poolConfig,
"127.0.0.1",6379,1000,"123456");
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}(3)創(chuàng)建Junit測(cè)試類(lèi)
public class JedisTest {
private Jedis jedis;
@BeforeEach
void setUp(){
//建立連接
jedis = JedisConnectionFactory.getJedis();
//選擇庫(kù)
jedis.select(0);
}
@Test
void testString() {
//存入數(shù)據(jù)
String result = jedis.set("name", "Jack");
System.out.println("result = " + result);
// 獲取數(shù)據(jù)
String name = jedis.get("name");
System.out.println("name = " + name);
}
@AfterEach
void tearDown() {
if (jedis != null) {
jedis.close();
}
}
}第二種方式:SpringDataRedis
SpringData是Spring中數(shù)據(jù)操作的模塊,包含對(duì)各種數(shù)據(jù)庫(kù)的集成,其中對(duì)Redis的集成模塊就叫做SpringDataRedis。
- 提供了對(duì)不同Redis客戶(hù)端的整合(Lettuce和Jedis)
- 提供了RedisTemplate統(tǒng)一API來(lái)操作Redis
- 支持Redis的發(fā)布訂閱模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的響應(yīng)式編程
- 支持基于JDK.JSON.字符串.Spring對(duì)象的數(shù)據(jù)序列化及反序列化
- 支持基于Redis的JDKCollection實(shí)現(xiàn)
(1)創(chuàng)建SpringBoot項(xiàng)目,選擇場(chǎng)景啟動(dòng)器


(2)引入依賴(lài)
<!--common-pool--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--Jackson依賴(lài)--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
(3)配置application.yml
spring:
redis:
host: 127.0.0.1
port: 6379
password: 123456
lettuce:
pool:
max-active: 8 #最大連接
max-idle: 8 #最大空閑連接
min-idle: 0 #最小空閑連接
max-wait: 100ms #連接等待時(shí)間(4)編寫(xiě)測(cè)試類(lèi)
@SpringBootTest
class SpringdataredisDemoApplicationTests {
@Resource
private RedisTemplate redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("name","Tom");
Object name = redisTemplate.opsForValue().get("name");
System.out.println(name); //Tom
}
}(5)序列化引起的問(wèn)題
我們這時(shí)可能會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,那就是我可以在Java代碼中set和get,取值都沒(méi)問(wèn)題。但我如果在代碼中set,在命令端get,就會(huì)出現(xiàn)一堆看不懂的二進(jìn)制,如下:

原因:RedisTemplate可以接收任意Object作為值寫(xiě)入Redis,只不過(guò)寫(xiě)入前會(huì)把Object序列化為字節(jié)形式,key也會(huì)被序列化為字節(jié)形式,默認(rèn)是采用JDK序列化。
因?yàn)檫@種序列化方式一是我們讀不懂,二是內(nèi)存占用較大。
所以我們要修改序列化方式,采用自定義的方式。
(6)創(chuàng)建自定義序列化配置類(lèi)
@Configuration
public class RedisConfig {
@Bean
@Resource
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 創(chuàng)建RedisTemplate對(duì)象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 設(shè)置連接工廠
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;
}
}(7)運(yùn)行測(cè)試類(lèi)

我們發(fā)現(xiàn)不管是key還是value,都已經(jīng)被我們自定義序列化。
(8)測(cè)試一下對(duì)象存儲(chǔ)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private Integer age;
}@Test
void testSaveUser(){
redisTemplate.opsForValue().set("user:1",new User("Uzi",21));
User user = (User) redisTemplate.opsForValue().get("user:1");
System.out.println(user);
}
注意:盡管JSON序列化可以滿(mǎn)足我們的需求,但仍然存在一些問(wèn)題,如上圖,除了我們set的數(shù)據(jù)以外,還有個(gè)@class,這是一筆不小的內(nèi)存開(kāi)銷(xiāo)啊,那么有方法可以解決嗎?
解決辦法:使用StringRedisTemplate
為了節(jié)省內(nèi)存空間,我們并不會(huì)使用JSON序列化器來(lái)處理value,而是統(tǒng)一使用String序列化器,要求只能存儲(chǔ)String類(lèi)型的key和value。當(dāng)需要存儲(chǔ)Java對(duì)象時(shí),手動(dòng)完成對(duì)象的序列化和反序列化。
(9)新建測(cè)試類(lèi),使用StringRedisTemplate
@SpringBootTest
public class RedisStringTests {
@Resource
private StringRedisTemplate stringRedisTemplate;
//用來(lái)手動(dòng)序列化和反序列化,需引入Jackson包
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testString() {
stringRedisTemplate.opsForValue().set("name","Tom");
Object name = stringRedisTemplate.opsForValue().get("name");
System.out.println(name);
}
@Test
void testSaveUser() throws JsonProcessingException {
User user = new User("Uzi",21);
//手動(dòng)序列化
String json = mapper.writeValueAsString(user);
stringRedisTemplate.opsForValue().set("user:1",json);
String jsonUser = stringRedisTemplate.opsForValue().get("user:1");
//手動(dòng)反序列化
User user1 = mapper.readValue(jsonUser, User.class);
System.out.println(user1);
}
}
到此這篇關(guān)于Redis Java客戶(hù)端建立的兩種方式小結(jié)的文章就介紹到這了,更多相關(guān)Redis Java客戶(hù)端建立內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus實(shí)現(xiàn)優(yōu)雅處理JSON字段映射
默認(rèn)情況下,MyBatis-Plus 是不支持直接映射 JSON 類(lèi)型的,這時(shí)候就需要借助其他的方法,下面小編就來(lái)和大家講講MyBatis-Plus如何優(yōu)雅處理JSON字段映射吧2025-04-04
springboot增加注解緩存@Cacheable的實(shí)現(xiàn)
這篇文章主要介紹了springboot增加注解緩存@Cacheable的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring事務(wù)失效場(chǎng)景實(shí)例詳解
實(shí)際項(xiàng)目開(kāi)發(fā)中,如果涉及到多張表操作時(shí),為了保證業(yè)務(wù)數(shù)據(jù)的一致性,大家一般都會(huì)采用事務(wù)機(jī)制,好多小伙伴可能只是簡(jiǎn)單了解一下,遇到事務(wù)失效的情況,便會(huì)無(wú)從下手,下面這篇文章主要給大家介紹了關(guān)于Spring事務(wù)失效場(chǎng)景的相關(guān)資料,需要的朋友可以參考下2022-03-03
SpringBoot淺析緩存機(jī)制之Ehcache?2.x應(yīng)用
EhCache?是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn)。它是Hibernate中的默認(rèn)緩存框架。Ehcache已經(jīng)發(fā)布了3.1版本。但是本文的講解基于2.x版本2022-08-08
有關(guān)tomcat內(nèi)存溢出的完美解決方法
下面小編就為大家?guī)?lái)一篇有關(guān)tomcat內(nèi)存溢出的完美解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
Maven打包之解決沒(méi)有依賴(lài)jar包問(wèn)題及分析
用戶(hù)使用Maven打包FTPServer程序時(shí),因未配置依賴(lài)打包導(dǎo)致jar體積過(guò)小且運(yùn)行報(bào)錯(cuò),解決方法是添加maven-assembly插件生成包含依賴(lài)的jar包,確保程序正常運(yùn)行2025-09-09

