一.介紹
RedisTemplate是Spring Data Redis提供給用戶的最高級的抽象客戶端,用戶可直接通過RedisTemplate進行多種操作,那么,我們先來看看RedisTemplate封裝了哪些操作。下面這列表是RedisTemplate的繼承關系和所有方法(已過濾重載方法,共有81個方法)
(1) 類繼承關系
//RedisAccessor是RedisTemplate定義普通屬性的基類,不直接使用
//RedisOperations是指定RedisTemplate實現的Redis connection操作的集合接口
//BeanClassLoaderAware是給其實現類是設置類加載器的接口
RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware
(2) 方法
//配置默認序列化與反序列化工具類
2.afterPropertiesSet
//根據參數執行相關operation操作,例如,事務
3.execute
//執行pipelining流水線相關操作
4.executePipelined
//執行指定connection連接的相關操作
5.executeWithStickyConnection
//執行session內的execute方法
6.executeSession
//創建RedisConnection代理類
7.createRedisConnectionProxy
//connection連接的預處理
8.preProcessConnection
//結果的后處理,默認什么都不做
9.postProcessResult
//是否向RedisCallback暴露本地連接
10.isExposeConnection
//設置是否向RedisCallback暴露本地連接
11.setExposeConnection
//12到26都是設置和獲取相關序列化工具類
12.isEnableDefaultSerializer
13.setEnableDefaultSerializer
14.getDefaultSerializer
15.setDefaultSerializer
16.setKeySerializer
17.getKeySerializer
18.setValueSerializer
19.getValueSerializer
20.getHashKeySerializer
21.setHashKeySerializer
22.getHashValueSerializer
23.setHashValueSerializer
24.getStringSerializer
25.setStringSerializer
26.setScriptExecutor
//27到34為私有方法,不對外提供使用
27.rawKey
28.rawString
29.rawValue
30.rawKeys
31.deserializeKey
32.deserializeMixedResults
33.deserializeSet
34.convertTupleValues
//執行事務
35.exec
36.execRaw
//刪除操作
37.delete
//接觸鏈接
38.unlink
//查看是否含有指定key
39.hasKey
40.countExistingKeys
//設置過期時間
41.expire
42.expireAt
//轉換成字節流並向channel發送message
43.convertAndSend
//獲取過期時間
44.getExpire
//根據傳入的正則表達式返回所有的key
46.keys
//取消指定key的過期時間
47.persist
//移動指定的key和index到數據庫中
48.move
//從鍵空間隨機獲取一個key
49.randomKey
//將指定key改成目標key
50.rename
//key不存在時,將指定key改成目標key
51.renameIfAbsent
//設置存儲在指定key的類型
52.type
//檢索存儲在key的值的序列化版本
53.dump
//執行Redis的restore的命令
54.restore
//標記事務阻塞的開始
55.multi
//丟棄所有在multi之后發出的命令
56.discard
//觀察指定key在事務處理開始即multi之后的修改情況
57.watch
//刷新先前觀察的所有key
58.unwatch
//為key元素排序
59.sort
//關閉客戶端連接
60.killClient
//請求連接客戶端的相關信息和統計數據
61.getClientList
//更改復制配置到新的master
62.slaveOf
//將本機更改為master
63.slaveOfNoOne
//64到79都是獲取相對應的操作
64.opsForCluster
65.opsForGeo
66.boundGeoOps
67.boundHashOps
68.opsForHash
69.opsForHyperLogLog
70.opsForList
71.boundListOps
72.boundSetOps
73.opsForSet
74.opsForStream
75.boundStreamOps
76.boundValueOps
77.opsForValue
78.boundZSetOps
79.opsForZSet
//設置是否支持事務
80.setEnableTransactionSupport
//設置bean的類加載器
81.setBeanClassLoader
(3)功能介紹
spring-data-redis的提供了如下功能:
- 連接池自動管理,提供了一個高度封裝的“RedisTemplate”類
- 進行了歸類封裝,將同一類型操作封裝為operation接口
ValueOperations:簡單K-V操作
SetOperations:set類型數據操作
ZSetOperations:zset類型數據操作
HashOperations:針對map類型的數據操作
ListOperations:針對list類型的數據操作
- 提供了對key的“bound”(綁定)便捷化操作API,可以通過bound封裝指定的key,然后進行一系列的操作而無須“顯式”的再次指定Key,即BoundKeyOperations:
BoundValueOperations
BoundSetOperations
BoundListOperations
BoundSetOperations
BoundHashOperations
- 將事務操作封裝,有容器控制。
- 針對數據的“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)
1.JdkSerializationRedisSerializer:POJO對象的存取場景,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將存儲字節序列。是目前最常用的序列化策略。
2.StringRedisSerializer:Key或者value為字符串的場景,根據指定的charset對數據的字節序列編碼成string,是“newString(bytes,charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略。
3.JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo實例序列化成json格式存儲在redis中,也可以將json格式的數據轉換成pojo實例。因為jackson工具在序列化和反序列化時,需要明確指定Class類型,因此此策略封裝起來稍微復雜。
4.OxmSerializer:提供了將javabean與xml之間的轉換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲的數據將是xml工具。不過使用此策略,編程將會有些難度,而且效率最低;不建議使用。【需要spring-oxm模塊的支持】
如果你的數據需要被第三方工具解析,那么數據應該使用StringRedisSerializer而不是JdkSerializationRedisSerializer。
二.依賴導入
redis的引用包:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.6.RELEASE</version>
</dependency>
三.具體使用
(1) String類型:
- 插入操作
UserInfo markIfFirstSync = new UserInfo();
userRedisTemplate.opsForValue().set(CACHE_KEY, markIfFirstSync);
- 向redis中某個string類型的key下面插入一個對象。
批量插入操作
public Map<String, OrgRelationInfo> mappingRelationRefresh = new HashMap<>();
redisTemplate.opsForValue().multiSet(mappingRelationRefresh);
- 獲取對象操作
userRedisTemplate.opsForValue().get(CACHE_NAME + CACHE_KEY_EXIST_PREFIX);
- 從redis中獲取某個key下面的某個對象,如果不存在就返回null。
//批量獲取對象操作
List<String> sourceIdList = new ArrayList<>();
List<OrgRelationInfo> orgMappingRelationList = redisTemplate.opsForValue().multiGet(sourceIdList);
//從redis中獲取多個key下面的多個對象,返回一個List列表,但是即使對應的key下面沒有值,這個**value也會返回**,不過是
//null,因此要判斷是否List都為空,不能夠用isEmpty直接判斷,而應該一個一個的判斷是否為空,才能判斷整體為空。
(2) List類型
- 批量插入
//向redis的某個key下面的list列表里面插入一個list列表,不會去重。
List<OrgRelationInfo> remainOrgNodes = new ArrayList<>();
redisTemplate.opsForList().leftPushAll(CACHE_KEY, remainOrgNodes);
- 批量取出
//從redis中取出某一個key下面的list列表, 0表示從列表的第0個元素開始取,-1表示直取到倒數第一個元素,也就是整個列表的所有元素都取出來。
List<OrgRelationInfo> lastRemainOrgNodeList = redisTemplate.opsForList().range(CACHE_NAME + CACHE_REMAIN_KEY_PREFIX, 0, -1);
(3) Hash類型
- 批量插入
// 向redis中某個key下面插入key,hash的Map。
Map<Long, UserRelationInfo> value = new HashMap<>();
userHashRedisTemplate.opsForHash().putAll(KEY, value );
-單個刪除
//從redis中某個key下面刪除掉某個hashkey所在的value。
userHashRedisTemplate.opsForHash().delete(key, sourceOrgId);
- 單個獲取
//從redis中某個key下面得到這個key對應的hashkey的value值。前一個key只能是String類型,hashKey可以聲明為自己需要的類型。
userHashRedisTemplate.opsForHash().get(Key, hashKey);
- 批量獲取
//從redis中得到某個key下面的所有的hashkey和hashvalue值。
Map<Object, Object> userOrgMap = userHashRedisTemplate.opsForHash().entries(getUserNodeCacheKey(syncUserNode.getSourceId()));
(4) Set類型
- 單個插入
//向redis的某個key下面的set列表里面插入一個元素,回去重,且無序。
userRoleSetRedisTemplate.opsForSet().add(KEY, cloudtOrgRoleInfo);
- 批量取出
//從redis的某個key下面得到set集合的所有元素,返回的也是一個Set集合。
cloudtOrgRoleSet = userRoleSetRedisTemplate.opsForSet().members(KEY);
- 單個刪除
//從redis的某個key下面的set集合中刪除掉一個元素。
userRoleSetRedisTemplate.opsForSet().remove( KEY, subDeleteOrgRoleUserArray[i]);
redis命令行操作可以參考:http://doc.redisfans.com/
本文轉自https://www.jianshu.com/p/0fa4c100e9a9