一、如何使用Redis的Java客戶(hù)端
官方文檔: https://redis.io/docs/clients/java/
Java-Redis客戶(hù)端 | 使用場(chǎng)景 |
---|---|
Jeids |
以Redis命令作為方法名稱(chēng),學(xué)習(xí)成本低,簡(jiǎn)單實(shí)現(xiàn),但是Jedis實(shí)例是線程不安全的,多線程環(huán)境下需要基于連接池使用。
|
lettuce |
Lettuce 是基于Netty實(shí)現(xiàn)的,支持同步、異步和響應(yīng)式編程方式,并且是線程安全的。Redis的哨兵模式、集群模式和管道模式。
|
Redisson |
Redisson是基于Redis實(shí)現(xiàn)的分布式、可伸縮的Java數(shù)據(jù)結(jié)構(gòu)集合。包含了諸如Map、Queue、Lock、Semaphore(信號(hào)量)、AtomicLong(原子類(lèi))等強(qiáng)大功能
|
SpringDataRedis: 一款結(jié)合了Jedis和Lettuce的SpringBoot框架整合Redis組件。
二、Jedis
Jedis官網(wǎng): https://github.com/redis/jedis
Redis的官方也推薦了這種客戶(hù)端。
(一)引入依賴(lài)
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>
(二)建立連接
方式一:?jiǎn)吸c(diǎn)連接
private Jedis jedis;
@BeforeEach
void setup() {
//建立連接
jedis = new Jedis("192.168.92.131",6379);
//設(shè)置密碼
jedis.auth("123321");
//選擇數(shù)據(jù)庫(kù)
jedis.select(0);
}
@Test
void redisTest(){
//插入數(shù)據(jù)
String result = jedis.set("name","張三");
System.out.println("result="+result);
//獲取數(shù)據(jù)
String name = jedis.get("name");
System.out.println("name="+name);
}
@AfterEach
void destroy() {
if (jedis != null)
jedis.close();
}
//獲取的結(jié)果
result=OK
name=張三
方式二:連接池建立連接
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
//1、創(chuàng)建連接池配置對(duì)象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//2、配置連接池相關(guān)信息
// 最大連接數(shù)
jedisPoolConfig.setMaxTotal(8);
// 最大空間連接
jedisPoolConfig.setMaxIdle(8);
// 最小空閑連接
jedisPoolConfig.setMinIdle(0);
// 設(shè)置最長(zhǎng)等待時(shí)間,ms
jedisPoolConfig.setMaxWaitMillis(200);
//3、建立連接池,需要連接池配置,ip,端口,等待時(shí)間,密碼
jedisPool = new JedisPool(jedisPoolConfig, "192.168.92.131",6379,1000,"123321");
}
public static Jedis getConnection(){
//獲取單個(gè)連接
return jedisPool.getResource();
}
}
三、SpringDataRedis
SpringData 是 Spring 中數(shù)據(jù)操作的模塊,包含對(duì)各種數(shù)據(jù)庫(kù)的集成,其中對(duì)Redis的集成模塊就叫做 SpringDataRedis,官網(wǎng)地址: https://spring.io/projects/spring-data-redis
- 提供了對(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)
(一)RedisTemplate
RedisTemplate將不同的數(shù)據(jù)類(lèi)型操作API封裝到不同類(lèi)型中。
API | 返回值類(lèi)型 | 說(shuō)明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作String類(lèi)型數(shù)據(jù) |
redisTemplate.opsForHash() | HashOperations | 操作Hash類(lèi)型數(shù)據(jù) |
redisTemplate.opsForList() | ListOperations | 操作List類(lèi)型數(shù)據(jù) |
redisTemplate.opsForSet() | SetOperations | 操作Set類(lèi)型數(shù)據(jù) |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet類(lèi)型數(shù)據(jù) |
redisTemplate | 通用命令 |
(二)RedisTemplate的基本使用
1、引入依賴(lài)
<!--Redis依賴(lài)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--連接池依賴(lài)-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2、配置redis
spring:
redis:
host: 192.168.92.131
port: 6379
password: 123321
lettuce:
pool:
max-active: 8 #最大連接數(shù)
max-idle: 8 #最大空閑連接
min-idle: 0 #最小空閑連接
max-wait: 100 #連接等待時(shí)間
3、注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4、使用RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
public void operateString(){
// 插入一條string類(lèi)型的數(shù)據(jù),存儲(chǔ)的格式是Java序列化的格式
redisTemplate.opsForValue().set("name", "李四");
// 讀取一條string類(lèi)型數(shù)據(jù)
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
5、優(yōu)化RedisTemplate存儲(chǔ)序列化的現(xiàn)象
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
//1、創(chuàng)建RedisTemplate對(duì)象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//2、設(shè)置連接工廠
template.setConnectionFactory(connectionFactory);
//3、創(chuàng)建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//4、設(shè)置key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
//5、設(shè)置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
//6、返回
return template;
}
}
缺點(diǎn): JSON序列化時(shí)會(huì)將calss的類(lèi)型寫(xiě)入json結(jié)果中,存入Redis中,帶來(lái)額外的內(nèi)存。
為了節(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)完成序列化和反序列化。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-612077.html
Spring默認(rèn)提供了一個(gè)StringRedisTemplate類(lèi),它的key和value的序列化方式默認(rèn)就是String方式,省去自定義RedisTemplate的過(guò)程。**
(PS:不如直接用alibaba開(kāi)源的fastjson,減少學(xué)習(xí)成本,但要注意的是 在JSON插件的排行中 ,jackson-databind > gson > fastjson,這就說(shuō)明了問(wèn)題,fastjson 專(zhuān)注于性能,但安全性不足,gson是保證了安全性,如果可以,在項(xiàng)目中應(yīng)該使用gson)**文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-612077.html
@Autowired
private StringRedisTemplate stringRedisTemplate;
//JSON工具
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException {
//準(zhǔn)備對(duì)象
User user = new User("zain", 23);
//手動(dòng)序列化
String json = mapper.writeValueAsString(user);
//寫(xiě)入一條數(shù)據(jù)
stringRedisTemplate.opsForValue().set("jedis:user:2", json);
// 讀取數(shù)據(jù)
String val = stringRedisTemplate.opsForValue().get("jedis:user:2");
// 反序列化
User user1 = mapper.readValue(val, User.class);
}
到了這里,關(guān)于Redis學(xué)習(xí)路線(3)——Redis的Java客戶(hù)端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!