SpringBoot入門 (七) Redis訪問操作
本文記錄學習在SpringBoot中使用Redis。
一 什麽是Redis
Redis 是一個速度非常快的非關系數據庫(Non-Relational Database),它可以存儲鍵(Key)與 多種不同類型的值(Value)之間的映射(Mapping),可以將存儲在內存的鍵值對數據持久化到硬盤,可以使用復制特性來擴展讀性能,還可以使用客戶端分片來擴展寫性能。Redis主要有以下幾個優點:
1 性能極高,它每秒可執行約 100,000 個 Set 以及約 100,000 個 Get 操作;
2 豐富的數據類型,Redis 對大多數開發人員已知的大多數數據類型提供了原生支持,這使得各種問題得以輕松解決;
3 原子性,因為所有 Redis 操作都是原子性的,所以多個客戶端會並發地訪問一個 Redis 服務器,獲取相同的更新值;
4 豐富的特性,Redis 是一個多效用工具,有非常多的應用場景,包括緩存、消息隊列(Redis 原生支持發布/訂閱)、短期應用程序數據(比如 Web 會話、Web 頁面命中計數)等。
目前我們常用的Value的數據類型有String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)。
二 SpringBoot集成Redis
SpringBoot提供了對Redis的集成的模塊,包是spring-boot-starter-data-redis,它依賴於 spring-data-redis 和 lettuce,lettuce是一個線程安全的redis客戶端。
在pom.xml中引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application.properties中配置Redis的連接信息
# redis 配置 ## redis數據庫索引(默認0) spring.redis.database=0 ## redis 服務器地址 spring.redis.host=localhost ## redis 服務器端口 spring.redis.port=6379 ## redis數據庫密碼(默認為空) spring.redis.password= ## redis連接池最大連接數(使用負數表示沒有顯示,默認8) spring.redis.lettuce.pool.max-active=8 ## 連接池最大阻塞等待時間(使用負值表示沒有限制,默認-1) spring.redis.lettuce.pool.max-wait=-1 ## 連接池中的最大空閑連接 默認 8 spring.redis.lettuce.pool.max-idle=8 ## 連接池中的最小空閑連接 默認 0 spring.redis.lettuce.pool.min-idle=0
有了上邊這兩個步驟之後,我們啟動服務後,SpringBoot就會幫我們連接到Redis服務器,並給我們提供了一個RedisTemplate類供我們使用操作Redis。我們在需要用的地方註入RedisTemplate就可以輕松完成操作。
三 測試
使用Junit做測試,在我們的單元測試類中註入RedisTemplate
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
}
String字符串操作,value是一個字符串,通過delete(key)刪除
@Test
public void testString() throws InterruptedException {
//字符串
ValueOperations strOps = redisTemplate.opsForValue();
strOps.set("name", "梓&藝");
System.out.println("字符串結果name:"+strOps.get("name"));
//刪除key
redisTemplate.delete("name");
}
對象操作,value是一個對象
@Test
public void testObject() throws InterruptedException {
ValueOperations objOps = redisTemplate.opsForValue();
City city = new City(1, "X`A", "西安");
objOps.set("city", city);
System.out.println(objOps.get("city").toString());
redisTemplate.delete("city");
}
設置key的過期時間,在set時加上過期時間,通過hasKey(key)來判斷key是否還存在
@Test
public void testExpire(){
//過期
ValueOperations objOps1 = redisTemplate.opsForValue();
City city1 = new City(1, "BJ", "北京");
objOps1.set("expire", city1, 2000, TimeUnit.MILLISECONDS);
System.out.println(objOps1.get("expire").toString());
Thread.sleep(2000);
System.out.println(redisTemplate.hasKey("expire"));
}
hash哈希操作
@Test
public void testHash() {
HashOperations hashOps = redisTemplate.opsForHash();
hashOps.put("hash","hashKey","hashValue");
System.out.println(hashOps.get("hash", "hashKey"));
}
在上邊的代碼中可以看出,Hash Set的時候就是在哈希表 Key 中的域(Field)的值設為 value。如果 Key 不存在,一個新的哈希表被創建並進行 Hash set 操作;如果域(Field)已經存在於哈希表中,舊值將被覆蓋。
List列表操作
@Test
public void testList() {
ListOperations<String, String> listOps = redisTemplate.opsForList();
listOps.leftPush("list","梓");
listOps.leftPush("list","&");
listOps.leftPush("list","藝");
System.out.println(listOps.leftPop("list"));
}
列表操作時我們通過 leftPush 或者 rightPush 來將數據存入列表中,通過 leftPop 或者rightPop將數據取出來,我們可以利用它來實現一個隊列。
Set集合操作
@Test
public void testSet() {
SetOperations<String, String> setOps = redisTemplate.opsForSet();
setOps.add("set","梓");
setOps.add("set","&");
setOps.add("set","&");
setOps.add("set","藝");
System.out.println(setOps.members("set"));
}
Set是一個沒有順序的集合,key相同時,如果value已經存在了,後邊進入的會把前邊的覆蓋掉
ZSet有序集合操作
@Test
public void testZSet() {
ZSetOperations zSetOps = redisTemplate.opsForZSet();
zSetOps.add("zSet", "梓", 1);
zSetOps.add("zSet", "&", 2);
zSetOps.add("zSet", "藝", 3);
zSetOps.add("zSet", "zi", 1);
zSetOps.add("zSet", "yi", 3);
System.out.println(zSetOps.rangeByScore("zSet", 1, 3));
}
add 方法的3個參數分別是key,value,數據插入位置。ZSet中存儲的數據都是有順序的,輸出時順序按照存儲時設置的從小到大,如果遇到key相同,Value和順序一樣的,後邊的會把前邊的覆蓋掉,range方法後邊的2個參數時插入的位置。如上的輸出
SpringBoot入門 (七) Redis訪問操作