spring使用RedisTemplate操作Redis數據庫
一.什麼是Redis
Redis是一個非關系型數據庫,具有很高的存取性能,一般用作緩存數據庫,減少正常存儲數據庫的壓力。
Redis可以存儲鍵與5種不同數據結構類型之間的映射,這5種數據結構類型分別為String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
下面來對這5種數據結構類型作簡單的介紹:
二.RedisTemplate及其相關方法
1.RedisTemplate
Spring封裝瞭RedisTemplate對象來進行對Redis的各種操作,它支持所有的Redis原生的api。RedisTemplate位於spring-data-redis包下。RedisTemplate提供瞭redis各種操作、異常處理及序列化,支持發佈訂閱,並對spring 3.1 cache進行瞭實現。RedisTemplate提供瞭redis各種操作、異常處理及序列化,支持發佈訂閱,並對spring 3.1 cache進行瞭實現。RedisTemplate提供瞭redis各種操作、異常處理及序列化,支持發佈訂閱,並對spring 3.1 cache進行瞭實現。RedisTemplate提供瞭redis各種操作、異常處理及序列化,支持發佈訂閱,並對spring 3.1 cache進行瞭實現。
註意 RedisTemplate是一個key和value都是泛型的模板類,一般情況下key為String類型,如:RedisTemplate<String,Object>。
此外,如果沒特殊情況,切勿定義成RedisTemplate<Object, Object>,否則根據裡氏替換原則,使用的時候會造成類型錯誤 。
spring-data-redis針對jedis提供瞭如下功能:
1.連接池自動管理,提供瞭一個高度封裝的“RedisTemplate”類
2.針對jedis客戶端中大量api進行瞭歸類封裝,將同一類型操作封裝為operation接口
ValueOperations:簡單K-V操作
SetOperations:set類型數據操作
ZSetOperations:zset類型數據操作
HashOperations:針對map類型的數據操作
ListOperations:針對list類型的數據操作
2.RedisTemplate中定義瞭對5種數據結構操作
redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作hash redisTemplate.opsForList();//操作list redisTemplate.opsForSet();//操作set redisTemplate.opsForZSet();//操作有序set
其實這裡的ops相當於options, 是RedisTemplate對各種不同的Redis數據類型進行操作。其實還有另外的方法:
redistempalate.boundValueOps redistempalate.boundSetOps redistempalate.boundListOps redistempalate.boundHashOps redistempalate.boundZSetOps
opsForXXX和boundXXXOps的區別?
XXX為value的類型,前者獲取一個operator,但是沒有指定操作的對象(key),可以在一個連接(事務)內操作多個key以及對應的value;後者獲取瞭一個指定操作對象(key)的operator,在一個連接(事務)內隻能操作這個key對應的value。
關於計數的API(increment)有一個bug,需要各位使用中註意,通過increment計數以後,通過get方式獲取計數值的時候可能會拋出EOF異常(和本地的jdk以及redis的編譯版本有關),可以考慮使用boundValueOps(key).get(0,-1)獲取計數值。
三.RedisTemplate操作Redis數據庫的具體例子
1.值類型操作:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml") public class TestValue { @Autowired private RedisTemplate redisTemplate; @Test public void setValue(){ //存值,針對值類型,ops相當於options redisTemplate.boundValueOps("name").set("itcast"); } @Test public void getValue(){ String str = (String) redisTemplate.boundValueOps("name").get(); System.out.println(str); } @Test public void deleteValue(){ redisTemplate.delete("name"); } }
2.集合類型操作之Set類型,無序,即存取順序不一定相同
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml") public class TestSet { @Autowired private RedisTemplate redisTemplate; /** * 存入值 */ @Test public void setValue(){ redisTemplate.boundSetOps("nameset").add("曹操"); redisTemplate.boundSetOps("nameset").add("劉備"); redisTemplate.boundSetOps("nameset").add("孫權"); } /** * 提取值 */ @Test public void getValue(){ Set members = redisTemplate.boundSetOps("nameset").members(); System.out.println(members); } /** * 刪除集合中的某一個值 */ @Test public void deleteValue(){ redisTemplate.boundSetOps("nameset").remove("孫權"); } /** * 刪除整個集合 */ @Test public void deleteAllValue(){ redisTemplate.delete("nameset"); } }
輸出結果:[孫權, 劉備, 曹操],此外,set類型的元素也不可重復。當set沒有值的時候,會返回一個[]
3.List類型操作
list類型分為兩種,一種是左壓棧,一種是右壓棧
右壓棧:
/** * 右壓棧:後添加的對象排在後邊,相當於隊列,相當於先進先出 */ @Test public void testSetValue1(){ redisTemplate.boundListOps("namelist1").rightPush("劉備"); redisTemplate.boundListOps("namelist1").rightPush("關羽"); redisTemplate.boundListOps("namelist1").rightPush("張飛"); } /** * 顯示右壓棧集合,range 表示查詢的索引,從第幾個查到第幾個,如果想查詢所有的數的話隻能將第二個數寫得大一點。 */ @Test public void testGetValue1(){ List list = redisTemplate.boundListOps("namelist1").range(0, 10); System.out.println(list); }
運行結果:[劉備, 關羽, 張飛],元素可以重復
左壓棧:
/** * 左壓棧:後添加的對象排在前邊,相當於棧,先進後出 */ @Test public void testSetValue2(){ redisTemplate.boundListOps("namelist2").leftPush("劉備"); redisTemplate.boundListOps("namelist2").leftPush("關羽"); redisTemplate.boundListOps("namelist2").leftPush("張飛"); } /** * 顯示左壓棧集合 */ @Test public void testGetValue2(){ List list = redisTemplate.boundListOps("namelist2").range(0, 10); System.out.println(list); }
運行結果:[張飛, 關羽, 劉備]
根據索引查詢元素
/** * 查詢集合某個元素 */ @Test public void testSearchByIndex(){ String s = (String) redisTemplate.boundListOps("namelist1").index(1); System.out.println(s); }
運行結果:返回索引為1的元素移除某個元素的值
/** * 移除集合某個元素,其中remove中第一個參數是移除的個數 */ @Test public void testRemoveByIndex(){ redisTemplate.boundListOps("namelist1").remove(1, "關羽"); }
這裡表示移除一個“關羽”。
4.Hash類型操作
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml") public class TestHash { @Autowired private RedisTemplate redisTemplate; // 存值 @Test public void testSetValue() { redisTemplate.boundHashOps("namehash").put("a", "唐僧"); redisTemplate.boundHashOps("namehash").put("b", "悟空"); redisTemplate.boundHashOps("namehash").put("c", "八戒"); redisTemplate.boundHashOps("namehash").put("d", "沙僧"); } //獲取所有的key @Test public void testGetKeys() { Set s = redisTemplate.boundHashOps("namehash").keys(); System.out.println(s); } // 獲取所有的value @Test public void testGetValues() { List values = redisTemplate.boundHashOps("namehash").values(); System.out.println(values); } // 根據key獲取值 @Test public void testGetValueByKey() { Object object = redisTemplate.boundHashOps("namehash").get("b"); System.out.println(object); } //根據key移除值 @Test public void testRemoveValueByKey() { redisTemplate.boundHashOps("namehash").delete("c"); } }
四.RedisTemplate和StringRedisTemplate的區別
1. 兩者的關系是StringRedisTemplate繼承RedisTemplate。
2. 兩者的數據是不共通的;也就是說StringRedisTemplate隻能管理StringRedisTemplate裡面的數據,RedisTemplate隻能管理RedisTemplate中的數據。
3. SDR默認采用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。
StringRedisTemplate默認采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默認采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate使用的序列類在在操作數據的時候,比如說存入數據會將數據先序列化成字節數組然後在存入Redis數據庫,這個時候打開Redis查看的時候,你會看到你的數據不是以可讀的形式展現的,而是以字節數組顯示,類似下面
當然從Redis獲取數據的時候也會默認將數據當做字節數組轉化,這樣就會導致一個問題,當需要獲取的數據不是以字節數組存在redis當中而是正常的可讀的字符串的時候,比如說下面這種形式的數據
相關連接:https://www.cnblogs.com/EasonJim/p/7803067.html
到此這篇關於spring使用RedisTemplate操作Redis數據庫的文章就介紹到這瞭,更多相關spring使用RedisTemplate操作Redis內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Springboot/Springcloud項目集成redis進行存取的過程解析
- Spring整合redis的操作代碼
- SpringBoot集成Redis並實現主從架構的實踐
- SpringBoot集成Redis的思路詳解
- Java與SpringBoot對redis的使用方式