參考文檔:Reference html
30.Working with NoSQL Technologies (使用NoSQL技術)
Spring Data 提供額外的模塊幫助你接入各類各樣的NoSQL技術,有MongoDB,Neo4J,ElasticSearch,Solr,Redis,Gemfire,Cassandra,Couchbase 還有 LDAP。Spring Boot 爲上面的中間件提供自動配置文件。你可使用它們,可是必須本身配置。請參考Spring-Data相關文檔 Spring Boot Data Reference。java
( Reference_2.0.3.RELEASE )
Redis 集羣安裝 參考:https://www.cnblogs.com/yuanermen/p/5717885.html Error 4 Ruby required >= 2.2.2 https://blog.csdn.net/lixwjava/article/details/50408070
這一節簡要的介紹了各個在新版本特性和要注意的方面。(1.5>1.6>1.7>1.8>2.0新特性)node
Spring Data Redis 1.8中的新功能 < 5/6/7 略>redis
三、Reuqirements (要求)spring
2.x版本要求JDK8 及以上數據庫
Spring 要求 4.3.18.RELEASE及以上json
Redis 要求 2.6及以上版本服務器
Document structure(文件結構)markdown
這部分文檔介紹了Spring Data Redis提供的核心功能。app
Redis support 介紹了Redis的模塊特性。
Redis是Spring Data支持的一個鍵值對存儲模塊。引用項目主頁上的一段話:
Redis is an advanced key-value store. It is similar to memcached but the dataset is not volatile, and values can be strings, exactly like in memcached, but also lists, sets, and ordered sets. All this data types can be manipulated with atomic operations to push/pop elements, add/remove elements, perform server side union, intersection, difference between sets, and so forth. Redis supports different kind of sorting abilities.
redis是一個高級鍵值對數據庫。它跟memcacheed類似,但數據是持久化的,跟memcached相同的基本數據類型String,同時還支持list,set,有序set。全部這些數據類型均可以經過原子操做來操做以推送/彈出元素,添加/刪除元素,執行服務器端並集,交集,集合之間的差別等等。 Redis支持不一樣類型的排序功能。
啓用Redis集羣
集羣支持基於與非集羣通訊徹底相同的模塊構建。RedisClusterConnection是RedisConnection的擴展,它處理與Redis羣集的通訊,並將錯誤轉換爲Spring DAO異常層次結構。經過RedisConnectionFactory建立RedisClusterConnection,使用RedisClusterConfiguration進行設置。
Example ↓↓↓↓
/** * Description :Redis cluster properties * @author: manji * 2018/7/23 14:09 */ @Component @ConfigurationProperties(prefix = "spring.redis.cluster") @Data public class RedisClusterProperties { /** * @Configuration__Properties * spring.redis.cluster.nodes: Comma delimited list of host:port pairs. 逗號分隔的host:port對 * spring.redis.cluster.nodes[0] = 127.0.0.1:7379 * spring.redis.cluster.nodes[1] = 127.0.0.1:7380 * spring.redis.cluster.max-redirects: Number of allowed cluster redirections. 容許集羣重定向的數量 */ List<String> nodes; }
/** * Description :Redis 集羣客戶端 * @author: manji * 2018/7/23 14:10 */ @Configuration public class RedisConfig { @Autowired RedisClusterProperties redisClusterProperties; /** * 默認值 null */ @Value("${redis.password:}") private @Nullable String password; /** * RedisClusterConfiguration can also be defined via PropertySource. * @return */ @Bean public RedisConnectionFactory connectionFactory(){ RedisClusterConfiguration clusterConf = new RedisClusterConfiguration(redisClusterProperties.getNodes()); clusterConf.setPassword(RedisPassword.of(password)); return new JedisConnectionFactory(clusterConf); } }
application.yml
server: port: 8088 spring: redis: cluster: nodes[0] : 192.168.220.140:7001 nodes[1] : 192.168.220.140:7002 nodes[2] : 192.168.220.140:7003 nodes[3] : 192.168.220.141:7004 nodes[4] : 192.168.220.141:7005 nodes[5] : 192.168.220.141:7006 redis: password: 寫你本身的密碼
測試類:
@SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath*:spring/spring.xml") public class RedisConfigTest { @Autowired RedisConnectionFactory connectionFactory; @Test public void test(){ final RedisClusterConnection clusterConnection = connectionFactory.getClusterConnection(); final byte[] bytes = clusterConnection.get("java_test".getBytes()); System.out.println(new String(bytes)); } }
Result Test Pass !!
使用Redis集羣鏈接
如上所述,redis cluster的行爲和單節點redis 甚至是sentinel監控的主從環境是不同的.由於集羣自動將key映射到分佈在不一樣節點的16384個分片上.所以當命令涉及不止一個key的時候,爲了不分片之間出現交叉執行錯誤,須要全部的key映射到正確的分片上.
此外,一個集羣節點僅僅爲固定的key提供返回查詢結果的服務.
(什麼意思呢?說白了就是,你存的時候 集羣根據Key 將你分配到集羣中的某一個slot上,固然這個slot必定是屬於某一個node的,你的key對應的value就存在這個node上,當你再次去獲取的時候,其餘nodes的節點並不會有你要的key的數據,你最終仍是會去你存的那個solt所在的node去取數據。)
舉個簡單的栗子,當你在集羣的某個節點上使用 KEYS * 命令的時候,你最終只能得到這個node上全部的key的值,而拿不到這個集羣的其餘節點的key的值。因此呢,若是你想獲取一個redis cluster 中全部的key的時候,你至少知道這個集羣的全部master節點,獲取每個master節點的key.
可是具體key重定向到對應的分片節點是由驅動程序處理的,包括更高級別的功能,跨節點蒐集信息,向RedisClusterConnection涵蓋的全部節點發送命令。就像前面pick up的keys示例,意思就是,keys(pattern) 這個方法 pick up keys命令在集羣每一個master節點同時執行keys 命令,同時pick up 結果和返回keys的合計結果。要請求單個節點的話RedisClusterConnection 提供了keys方法的重載 (keys(node , pattern)).
關於參數node (RedisClusterNode) 你能夠從RedisClusterConnection.clusterGetNodes得到也能夠直接經過構造函數構造.
1、經過RedisClusterConnection.clusterGetNodes 構造得到的是一個集合,不過是無序的,要什麼信息能夠本身獲取,下面圖片僅供參考
2、經過構造函數構造 RedisClusterNode redisClusterNode = new RedisClusterNode("host", port); // 這裏寫你本身的 host 和 port
MGET 命令 >> 當全部key映射到同一個分片時,本機驅動會自動提供服務爲這個多分片請求命令.可是若是不是這種狀況的話,RedisClusterConnection會執行多個並行的GET命令經過分片服務節點,而後再返回合計的結果。很明顯,多分片請求命令比單分片執行性能更差,所以應該謹慎使用。若是有疑問的話(in doubt)請考慮使用一個帶大括號的前綴把key固定到某一個分片. 就像{manji}.foo和{manji}.bar都會映射到相同的分片。
簡單的歸納上面的一段話就是,像mget這種批量命令,當你的 keys 參數是落在一個分片上的時候 會很方便,若是你給的keys 參數在不一樣的分片上,這樣仍是先路由到不一樣的分片上,而後再將查詢的結果合併起來返回給你,因此這樣會性能比較差,若是你實在要用的話,用它的建議,給key前面加業務相關的前綴。
Bulb :上面提供了簡單的示例來演示Spring Data Redis遵循的通常策略,請注意,某些操做可能須要將大量數據加載到內存中才能計算所需的命令.另外,不是全部的多分片請求都能正確的分發到各個單節點,若是誤用的話就會報錯. 譬如 PFCOUNT
使用RedisTemplate和集羣操做
請參考 Working with Objects through RedisTemplate 這一章瞭解RedisTemplate 通常用途,配置和用法.
//TODO 使用任何JSON RedisSerializer設置RedisTemplate#keySerializer時請當心,由於更改json結構會當即影響哈希槽計算。
RedisTemplate經過ClusterOperations接口提供對集羣特定的訪問操做,ClusterOperations接口能夠經過RedisTemplate.opsForCluster()得到.
這容許在集羣內的單個節點上顯式執行命令,同時保留爲模板配置的去/序列化功能並提供管理命令,例如CLUSTER MEET或更高級別的操做 resharding.
Example4:經過RedisTemplate訪問RedisClusterConnection
// ClusterOperations clusterOps = redisTemplate.opsForCluster(); // clusterOps.shutdown(redisClusterNode);
//TODO 關閉redisClusterNode這個節點,而後cross finger,有一個slave節點來繼承master的功能.