這篇“springboot怎么整合redis修改分區(qū)”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“springboot怎么整合redis修改分區(qū)”文章吧。
安陸ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!最近使用springboot整合redis,一個(gè)系統(tǒng)動(dòng)態(tài)數(shù)據(jù)源連接不同數(shù)據(jù)庫(kù),緩存使用的redis,那么就需要將不同數(shù)據(jù)庫(kù)的數(shù)據(jù)緩存到redis不同的分區(qū),也就是不同的庫(kù)中。
這里的老版指的是2.0之前的,我使用的1.5.9是ok的。
redis的配置類(lèi)這里就不貼了,網(wǎng)上很多。
1.使用JedisConnectionFactory修改
@Autowired JedisConnectionFactory jedisConnectionFactory; jedisConnectionFactory.setDatabase(database);
2.使用redisTemplate修改
redisTemplate.getConnectionFactory().getConnection().select(database);
以上兩種方式不需要再redis配置類(lèi)中特意添加bean
這里的新版指的是2.0之后的,我用的是2.0.3
redis配置類(lèi)中需要添加以下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);
數(shù)據(jù)是怎樣分布在多個(gè)Redis實(shí)例上的
分區(qū)是將你的數(shù)據(jù)分布在多個(gè)Redis實(shí)例上,以至于每個(gè)實(shí)例只包含一部分?jǐn)?shù)據(jù)。
Redis分區(qū)有兩個(gè)主要目標(biāo):
它允許更大的數(shù)據(jù)庫(kù),用許多計(jì)算機(jī)的內(nèi)存總和。如果不進(jìn)行分區(qū),你將會(huì)受限于單臺(tái)計(jì)算機(jī)的內(nèi)存。
它允許將計(jì)算能力擴(kuò)展到多核和多臺(tái)計(jì)算機(jī),將網(wǎng)絡(luò)帶寬擴(kuò)展到多臺(tái)計(jì)算機(jī)和網(wǎng)絡(luò)適配器。
假設(shè)我們有4個(gè)Redis實(shí)例(R0, R1, R2, R3),其上有許多代表用戶(hù)的key,比如user:1, user:2, ... 等等,那么在存儲(chǔ)一個(gè)key的時(shí)候我們有多種方式。
最簡(jiǎn)單的一種方式是按照范圍分區(qū),即根據(jù)對(duì)象的映射范圍將數(shù)據(jù)分配到指定的Redis實(shí)例上。例如,我們規(guī)定ID為0~10000的就分到R0,10001~20000到R1,以此類(lèi)推。這種方式是可以的,但是有一個(gè)缺點(diǎn)是需要一張表來(lái)維護(hù)這個(gè)映射關(guān)系。這個(gè)表需要管理起來(lái),而且每一個(gè)key都需要一個(gè)這樣的表,因此Redis中的范圍分區(qū)通常是不受歡迎的,因?yàn)樗绕渌謪^(qū)方法效率低得多。
除了范圍分區(qū)以外,另一種方法是哈希分區(qū)(hash partitioning):
第1步、取key,并應(yīng)用哈希函數(shù)將其轉(zhuǎn)換為一個(gè)數(shù)。例如,如果key是foobar,哈希函數(shù)式crc32,那么crc32(foobar)將輸出93024922。
第2步、對(duì)這個(gè)數(shù)字使用模運(yùn)算(取模)將它轉(zhuǎn)換成0到3直接的數(shù)字,這樣這個(gè)數(shù)字就可以映射到我的四個(gè)Redis實(shí)例之一。例如,93024922 % 4 = 2,因此foobar應(yīng)該存儲(chǔ)到R2實(shí)例上。
(PS:首先,對(duì)key做哈希運(yùn)算,得到一個(gè)數(shù)字,然后對(duì)這個(gè)數(shù)字取模,以決定最終數(shù)據(jù)應(yīng)該存放在哪個(gè)實(shí)例上)
分區(qū)的方法還有很多種,通過(guò)上面兩個(gè)示例,你應(yīng)該可以理解。哈希分區(qū)的一種高級(jí)形式稱(chēng)為一致性哈希,由幾個(gè)Redis客戶(hù)端和代理實(shí)現(xiàn)。
客戶(hù)端分區(qū) : 對(duì)于一個(gè)給定的key,客戶(hù)端直接選擇正確的節(jié)點(diǎn)來(lái)進(jìn)行讀寫(xiě)。許多Redis客戶(hù)端都實(shí)現(xiàn)了客戶(hù)端分區(qū)。
代理分區(qū) : 客戶(hù)端發(fā)送請(qǐng)求到一個(gè)代理,由代理來(lái)和Redis通信,代理會(huì)根據(jù)我們的配置來(lái)選擇正確的Redis實(shí)例。
查詢(xún)路由 : 你可以將你的查詢(xún)發(fā)送到任何一個(gè)Redis實(shí)例,實(shí)例會(huì)將你的查詢(xún)重定向到正確的服務(wù)器。
(PS:對(duì)于一個(gè)給定的key,分區(qū)的工作就是選擇一個(gè)正確的Redis實(shí)例,那么這個(gè)選擇的過(guò)程可以由客戶(hù)端、代理 或者 Redis實(shí)例來(lái)做)
1、涉及多個(gè)key的操作通常是不支持的。對(duì)于映射到兩個(gè)不同的Redis實(shí)例的key,你不能往這兩個(gè)上執(zhí)行插入操作。
2、涉及多個(gè)key的操作不能用Redis事務(wù)
3、分區(qū)粒度是key,因此不可能將一單個(gè)非常巨大的key(比如,一個(gè)非常大的sorted set)去切分?jǐn)?shù)據(jù)
4、當(dāng)使用分區(qū)的時(shí)候,數(shù)據(jù)處理會(huì)更復(fù)雜,對(duì)于實(shí)例你必須處理多個(gè)RDB/AOF文件,為了備份數(shù)據(jù),需要從多個(gè)實(shí)例和主機(jī)聚合持久文件。
5、增加和刪除容量(空間)變得更復(fù)雜。例如,Redis集群支持在運(yùn)行時(shí)添加和刪除節(jié)點(diǎn)的透明數(shù)據(jù)再平衡,但其他系統(tǒng)如客戶(hù)端分區(qū)和代理不支持此功能。然而,一種叫做預(yù)分片的技術(shù)在這方面有幫助。
當(dāng)Redis用作數(shù)據(jù)存儲(chǔ)時(shí),給定的key必須總是映射到相同的Redis實(shí)例。當(dāng)作為緩存時(shí),如果給定節(jié)點(diǎn)不可用它不是一個(gè)大問(wèn)題。
如果給定key的選節(jié)點(diǎn)不可用,一致哈希實(shí)現(xiàn)通常能夠切換到其他節(jié)點(diǎn)。類(lèi)似地,如果添加一個(gè)新節(jié)點(diǎn),部分新keys將開(kāi)始存儲(chǔ)在新節(jié)點(diǎn)上。
如果使用Redis作為緩存,使用一致哈希很容易進(jìn)行伸縮。
如果Redis用作存儲(chǔ),則使用固定的keys-to-nodes映射,因此節(jié)點(diǎn)的數(shù)量必須是固定的,且不能改變。否則,就需要一個(gè)能夠在節(jié)點(diǎn)之間重新平衡key的系統(tǒng),當(dāng)前Redis集群是可以做到這一點(diǎn)的。
以上就是關(guān)于“springboot怎么整合redis修改分區(qū)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。