在Java中操作Redis
文章目錄
- 在Java中操作Redis
- 1、介紹
- 2、Jedis
- 3、Spring Data Redis
- 3.1、對String的操作
- 3.2、對哈希類型數據的操作
- 3.3、對list的操作
- 3.4、對set類型的操作
- 3.5、對 ZSet類型的數據(有序集合)
- 3.6、通用類型的操作
1、介紹
Redis 的Java客戶端很多,官方推薦的有三種:
-
Jedis
-
Lettuce
-
Redisson
Spring對Redis客戶端進行了整合,提供了Spring Data Redis,在Spring Boot項目中還提供了對應的Starter,即spring-boot-starter-data-redis
2、Jedis
Jedis的maven坐標:
<!--redis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version></dependency>
使用Jedis操作Redis的步驟:
- 獲取連接
- 執行操作關閉連接
- 關閉連接
編寫一個測試類測試redis:
package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;@SpringBootTest
class JedisDemoApplicationTests {@Testvoid contextLoads() {//1. 獲取連接Jedis jedis = new Jedis("localhost", 6379);//2. 執行操作關閉連接jedis.set("name", "mannor");//3. 關閉連接jedis.close();}
}
在此之前,需要將Redis服務啟動起來
redis-server.exe
程序運行前:
測試項目運行后:
測試其他:
package com.mannor.jedisdemo;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;import java.util.Set;@SpringBootTest
class JedisDemoApplicationTests {/*** 使用jedis操作Redis*/@Testvoid contextLoads() {//1. 獲取連接Jedis jedis = new Jedis("localhost", 6379);//2. 執行操作關閉連接jedis.set("name", "mannor");//設置String name = jedis.get("name");//獲取System.out.println(name);jedis.del("name");//刪除jedis.hset("myhash","addr","beijing");//設置哈希表值String hget = jedis.hget("myhash", "addr");//獲取哈希表System.out.println(hget);Set<String> keys = jedis.keys("*");//獲取所有Redis的數據for(String key:keys){System.out.println(key);}//3. 關閉連接jedis.close();}}
測試項目源碼:上述測試項目的源碼
3、Spring Data Redis
在Spring Boot項目中,可以使用Spring Data Redis來簡化Redis操作,maven坐標:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
Spring Data Redis中提供了一個高度封裝的類: RedisTemplate,針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation接口,具體分類如下:
- ValueOperations:簡單K-V操作
- SetOperations:set類型數據操作
- ZSetOperations:zset類型數據操作
- HashOperations:針對map類型的數據操作
- ListOperations:針對list類型的數據操作
yml配置文件:
spring:application:name: springdataredis_demo#Redis相關配置redis:host: localhostport: 6379#password: 123456database: 0 #操作的是0號數據庫(redis存在0-15號數據庫(默認),在命令中使用select來切換)jedis:#Redis連接池配置pool:max-active: 8 #最大連接數max-wait: 1ms #連接池最大阻塞等待時間 max-idle: 4 #連接池中的最大空閑連接min-idle: 0 #連接池中的最小空閑連接
在獲取到RedisTemplate對象執行下列語句:
redisTemplate.opsForValue().set("city","beijing");
輸出:
原因:RedisTemplate在操作Redis數據庫的時候,將key做了一個序列化,上述結果就是序列化的結果,為了解決這個問題就要配置一個配置類:
package com.itheima.config;import org.springframework.cache.annotation.CachingConfigurerSupport;
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.StringRedisSerializer;/*** Redis配置類*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默認的Key序列化器為:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}
}
對于接下類的在java中對Redis的操作,我們可以參照Redis中的常用命令
3.1、對String的操作
(ValueOperations接口)示例:
@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作String類型的數據*/@Testvoid contextLoads() {//redisTemplate.opsForValue().set("mannor" ,"rediaz");String mannor = (String) redisTemplate.opsForValue().get("mannor");System.out.println(mannor);redisTemplate.opsForValue().set("k1", "v1", 10L, TimeUnit.SECONDS);Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("mannor1", "mannor");System.out.println(aBoolean);}
}
3.2、對哈希類型數據的操作
@SpringBootTest
class SpringDataRedisApplicationTests {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作hash類型的數據*/@Testpublic void hashTest() {HashOperations hashOperations = redisTemplate.opsForHash();//存hashOperations.put("002", "name", "zhangsan");hashOperations.put("002", "age", "20");hashOperations.put("002", "addr", "beijing");//取Object age = hashOperations.get("002", "age");
// System.out.println((String) age);//獲取所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {
// System.out.println(key);}//獲得hash結構中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}}}
3.3、對list的操作
@Autowiredprivate RedisTemplate redisTemplate;/*** 操作list類型的數據*/@Testpublic void listTest() {ListOperations listOperations = redisTemplate.opsForList();//存listOperations.leftPush("list", "00");listOperations.leftPushAll("list", "01", "02", "03");//取值List list = listOperations.range("list", 0, -1);for (Object val : list) {System.out.println(val);}System.out.println("------------------------------------------------------------");//獲取長度來遍歷Long size = listOperations.size("list");for (int i = 0; i < size; i++) {//出隊列String element = (String) listOperations.rightPop("list");System.out.println(element);}
3.4、對set類型的操作
@Autowiredprivate RedisTemplate redisTemplate;/*** 操作Set類型的數據*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();//存值setOperations.add("myset", "a", "b", "c", "a");//取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}//刪除成員setOperations.remove("myset", "a", "b");//取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}
3.5、對 ZSet類型的數據(有序集合)
@Autowiredprivate RedisTemplate redisTemplate;/** * 操作ZSet類型的數據*/
@Test
public void testZset() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myZset", "a", 10.0);zSetOperations.add("myZset", "b", 11.0);zSetOperations.add("myZset", "c", 12.0);zSetOperations.add("myZset", "a", 13.0);//取值Set<String> myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//修改分數zSetOperations.incrementScore("myZset", "b", 20.0);//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//刪除成員zSetOperations.remove("myZset", "a", "b");//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}
}
3.6、通用類型的操作
@Autowiredprivate RedisTemplate redisTemplate;/*** 通用操作,針對不同的數據類型都可以操作*/@Testpublic void testCommon() {//獲取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}//判斷某個key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);//刪除指定keyredisTemplate.delete("myZset");//獲取指定key對應的value的數據類型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());}
測試項目源代碼:https://gitee.com/rediaz/note-management/tree/master/Regis/SpringDataRedis