最近使用springboot整合redis,一個系統動態資料來源連接不同資料庫,快取使用的redis,那麼就需要將不同資料庫的數據快取到redis不同的分區,也就是不同的庫。
這裡的老版指的是2.0之前的,我使用的1.5.9是ok的。
redis的設定類別這裡就不貼了,網路上很多。
1.使用JedisConnectionFactory修改
@Autowired JedisConnectionFactory jedisConnectionFactory; jedisConnectionFactory.setDatabase(database);
2.使用redisTemplate修改
redisTemplate.getConnectionFactory().getConnection().select(database);
以上兩種方式不需要再redis配置類別中刻意加入bean
這裡的新版指的是2.0之後的,我用的是2.0.3
redis配置類別中需要新增以下bean
@Bean RedisStandaloneConfiguration redisStandaloneConfiguration() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName("localhost"); redisStandaloneConfiguration.setPort(6379); redisStandaloneConfiguration.setDatabase(0); return redisStandaloneConfiguration; } @Bean JedisConnectionFactory jedisConnectionFactory(RedisStandaloneConfiguration redisStandaloneConfiguration) { //redisStandaloneConfiguration.setPassword(RedisPassword.of(password)); JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder(); jedisClientConfiguration.connectTimeout(Duration.ofMillis(0));// connection timeout JedisConnectionFactory factory = new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration.build()); return factory; }
使用RedisStandaloneConfiguration修改
@Autowired RedisStandaloneConfiguration redisStandaloneConfiguration; redisStandaloneConfiguration.setDatabase(database);
資料是怎麼分佈在多個Redis實例上的
# 分割區是將你的資料分佈在多個Redis實例上,以至於每個實例只包含一部分資料。
Redis分割區有兩個主要目標:
它允許更大的資料庫,用許多電腦的記憶體總和。如果不進行分區,你將會受限於單一電腦的記憶體。
它允許將運算能力擴展到多核心和多台計算機,將網路頻寬擴展到多台電腦和網路適配器。
假設我們有4個Redis實例(R0, R1, R2, R3),其上有許多代表使用者的key,例如user:1, user:2, ...等等,那麼在儲存一個key的時候我們有多種方式。
最簡單的一種方式是按照範圍分區,即根據物件的映射範圍將資料分配到指定的Redis實例上。例如,我們規定ID為0~10000的就分到R0,10001~20000到R1,以此類推。這種方式是可以的,但是有一個缺點是需要一張表來維持這個映射關係。這個表需要管理起來,而且每一個key都需要一個這樣的表,因此Redis中的範圍分區通常是不受歡迎的,因為它比其他分區方法效率低得多。
除了範圍分區以外,另一種方法是哈希分區(hash partitioning):
第1步、取key,並應用哈希函數將其轉換為一個數。例如,如果key是foobar,哈希函數式crc32,那麼crc32(foobar)將輸出93024922。
步驟2、對這個數字使用類比運算(取模)將它轉換成0到3直接的數字,這樣這個數字就可以映射到我的四個Redis實例之一。例如,93024922 % 4 = 2,因此foobar應該儲存到R2實例上。
(PS:首先,對key做哈希運算,得到一個數字,然後對這個數字取模,以決定最終資料應該存放在哪個實例上)
分區的方法還有很多種,透過上面兩個範例,你應該可以理解。哈希分區的一種高級形式稱為一致性哈希,由幾個Redis客戶端和代理實現。
客戶端分區 : 對於一個給定的key,客戶端直接選擇正確的節點來進行讀寫。許多Redis客戶端都實作了客戶端分區。
代理分區 : 客戶端發送請求到一個代理,由代理來和Redis通信,代理會根據我們的配置來選擇正確的Redis實例。
查詢路由 : 你可以將你的查詢傳送到任何一個Redis實例,實例會將你的查詢重定向到正確的伺服器。
(PS:對於一個給定的key,分區的工作就是選擇一個正確的Redis實例,那麼這個選擇的過程可以由客戶端、代理或Redis實例來做)
1、涉及多個key的操作通常是不支援的。對於映射到兩個不同的Redis實例的key,你不能往這兩個上執行插入操作。
2、涉及多個key的操作不能用Redis事務
3、分區粒度是key,因此不可能將一單一非常巨大的key(例如,一個非常大的sorted set )去切分數據
4、當使用分區的時候,數據處理會更複雜,對於實例你必須處理多個RDB/AOF文件,為了備份數據,需要從多個實例和主機聚合持久文件。
5、增加和刪除容量(空間)變得更複雜。例如,Redis叢集支援在運行時新增和刪除節點的透明資料再平衡,但其他系統如客戶端分區和代理程式不支援此功能。然而,一種稱為預分片的技術在這方面有幫助。
當Redis用作資料儲存時,給定的key必須總是映射到相同的Redis實例。當作為快取時,如果給定節點不可用它不是一個大問題。
如果給定key的首選節點不可用,一致哈希實作通常能夠切換到其他節點。類似地,如果新增一個節點,部分新keys將開始儲存在新節點上。
如果使用Redis作為緩存,使用一致雜湊很容易進行伸縮。
如果Redis用作存儲,則使用固定的keys-to-nodes映射,因此節點的數量必須是固定的,且不能改變。如果需要重新平衡節點之間的key,那麼Redis叢集是一種可行的系統。
以上是springboot怎麼整合redis修改分區的詳細內容。更多資訊請關注PHP中文網其他相關文章!