外貿網站圖片素材百度網盟推廣怎么做
一、如何使用Redis的Java客戶端
官方文檔: https://redis.io/docs/clients/java/
Java-Redis客戶端 | 使用場景 |
---|---|
Jeids | 以Redis命令作為方法名稱,學習成本低,簡單實現,但是Jedis實例是線程不安全的,多線程環(huán)境下需要基于連接池使用。 |
lettuce | Lettuce 是基于Netty實現的,支持同步、異步和響應式編程方式,并且是線程安全的。Redis的哨兵模式、集群模式和管道模式。 |
Redisson | Redisson是基于Redis實現的分布式、可伸縮的Java數據結構集合。包含了諸如Map、Queue、Lock、Semaphore(信號量)、AtomicLong(原子類)等強大功能 |
SpringDataRedis: 一款結合了Jedis和Lettuce的SpringBoot框架整合Redis組件。
二、Jedis
Jedis官網: https://github.com/redis/jedis
Redis的官方也推薦了這種客戶端。
(一)引入依賴
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>
(二)建立連接
方式一:單點連接
private Jedis jedis;@BeforeEachvoid setup() {//建立連接jedis = new Jedis("192.168.92.131",6379);//設置密碼jedis.auth("123321");//選擇數據庫jedis.select(0);}@Testvoid redisTest(){//插入數據String result = jedis.set("name","張三");System.out.println("result="+result);//獲取數據String name = jedis.get("name");System.out.println("name="+name);}@AfterEachvoid destroy() {if (jedis != null)jedis.close();}//獲取的結果
result=OK
name=張三
方式二:連接池建立連接
public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//1、創(chuàng)建連接池配置對象JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//2、配置連接池相關信息// 最大連接數jedisPoolConfig.setMaxTotal(8);// 最大空間連接jedisPoolConfig.setMaxIdle(8);// 最小空閑連接jedisPoolConfig.setMinIdle(0);// 設置最長等待時間,msjedisPoolConfig.setMaxWaitMillis(200);//3、建立連接池,需要連接池配置,ip,端口,等待時間,密碼jedisPool = new JedisPool(jedisPoolConfig, "192.168.92.131",6379,1000,"123321");}public static Jedis getConnection(){//獲取單個連接return jedisPool.getResource();}}
三、SpringDataRedis
SpringData 是 Spring 中數據操作的模塊,包含對各種數據庫的集成,其中對Redis的集成模塊就叫做 SpringDataRedis,官網地址: https://spring.io/projects/spring-data-redis
- 提供了對不同Redis客戶端的整合(Lettuce和Jedis)
- 提供了RedisTemplate統(tǒng)一API來操作Redis
- 支持Redis的發(fā)布訂閱模塊
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的響應式編程
- 支持基于JDK、JSON、字符串、Spring對象的數據序列化及反序列化
- 支持基于Redis的JDKCollection實現
(一)RedisTemplate
RedisTemplate將不同的數據類型操作API封裝到不同類型中。
API | 返回值類型 | 說明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作String類型數據 |
redisTemplate.opsForHash() | HashOperations | 操作Hash類型數據 |
redisTemplate.opsForList() | ListOperations | 操作List類型數據 |
redisTemplate.opsForSet() | SetOperations | 操作Set類型數據 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet類型數據 |
redisTemplate | 通用命令 |
(二)RedisTemplate的基本使用
1、引入依賴
<!--Redis依賴-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!--連接池依賴-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
2、配置redis
spring:redis:host: 192.168.92.131port: 6379password: 123321lettuce:pool:max-active: 8 #最大連接數max-idle: 8 #最大空閑連接min-idle: 0 #最小空閑連接max-wait: 100 #連接等待時間
3、注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
4、使用RedisTemplate
@Autowired
private RedisTemplate redisTemplate;public void operateString(){// 插入一條string類型的數據,存儲的格式是Java序列化的格式redisTemplate.opsForValue().set("name", "李四");// 讀取一條string類型數據Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);
}
5、優(yōu)化RedisTemplate存儲序列化的現象
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {//1、創(chuàng)建RedisTemplate對象RedisTemplate<String, Object> template = new RedisTemplate<>();//2、設置連接工廠template.setConnectionFactory(connectionFactory);//3、創(chuàng)建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//4、設置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());//5、設置Value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);//6、返回return template;}}
缺點: JSON序列化時會將calss的類型寫入json結果中,存入Redis中,帶來額外的內存。
為了節(jié)省內存空間,我們并不會使用JSON序列化器來處理value,而是統(tǒng)一使用String序列化器,要求只能存儲String類型的key 和 value,當需要存儲Java對象時,手動完成序列化和反序列化。
Spring默認提供了一個StringRedisTemplate類,它的key和value的序列化方式默認就是String方式,省去自定義RedisTemplate的過程。**
(PS:不如直接用alibaba開源的fastjson,減少學習成本,但要注意的是 在JSON插件的排行中 ,jackson-databind > gson > fastjson,這就說明了問題,fastjson 專注于性能,但安全性不足,gson是保證了安全性,如果可以,在項目中應該使用gson)**
@Autowired
private StringRedisTemplate stringRedisTemplate;//JSON工具
private static final ObjectMapper mapper = new ObjectMapper();@Test
void testStringTemplate() throws JsonProcessingException {//準備對象User user = new User("zain", 23);//手動序列化String json = mapper.writeValueAsString(user);//寫入一條數據stringRedisTemplate.opsForValue().set("jedis:user:2", json);// 讀取數據String val = stringRedisTemplate.opsForValue().get("jedis:user:2");// 反序列化User user1 = mapper.readValue(val, User.class);
}