久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作

瀏覽:2日期:2022-08-14 17:04:25
1 redis主從復(fù)制的概念

多機環(huán)境下,一個redis服務(wù)接收寫命令,當(dāng)自身數(shù)據(jù)與狀態(tài)發(fā)生變化,將其復(fù)制到一個或多個redis。這種模式稱為主從復(fù)制。在redis中通過命令salveof命令讓執(zhí)行該命令的redis復(fù)制另一個redis數(shù)據(jù)與狀態(tài)。我們將主服務(wù)器稱為master,從服務(wù)器稱為slave。

主從復(fù)制保證了網(wǎng)絡(luò)異常正常時,網(wǎng)絡(luò)斷開重的情況下將數(shù)據(jù)復(fù)制。網(wǎng)絡(luò)正常時master會通過發(fā)送命令保持對slave更新,更新包括客戶端的寫入,key的過期或被逐出等網(wǎng)絡(luò)異常,master與slave連接斷開一段時間,slave重連上master后會嘗試部分重同步,重新獲取連接斷開期間丟失的命令。當(dāng)無法進行部分重同步,則會執(zhí)行全量重同步。

2 為什么需要主從復(fù)制

為了保證數(shù)據(jù)不丟失,有時會用到持久化功能。但這樣會增加磁盤IO操作。通過使用主從復(fù)制,可以替代持久化并減少IO操作,降低延遲提高性能。

主從模式下,master負(fù)責(zé)處理寫,slave負(fù)責(zé)讀。雖然主從同步會導(dǎo)致在數(shù)據(jù)存在不一致窗口,但可以增加讀操作的吞吐量。主從模式避免了redis單點風(fēng)險。通過副本提高系統(tǒng)可用性。當(dāng)master掛掉,從slave中選舉新的機器作為master保證系統(tǒng)可用。

3 主從復(fù)制配置及原理

主從復(fù)制可以分為三個階段:初始化、同步、命令傳播。

初始化:從服務(wù)器執(zhí)行完 slaveof 命令后,slave與master建立socket連接。連接建立完畢后通過ping進行心跳檢測,若master正常,則返回響應(yīng)。如果出現(xiàn)故障收不到響應(yīng),那么slave會重新嘗試連接master。如果master設(shè)置了認(rèn)證信息,則會再檢查認(rèn)證數(shù)據(jù)是否正確。如果認(rèn)證失敗,則會報錯。

同步:當(dāng)初始化完畢,master收到slave的數(shù)據(jù)同步命令后,需要判斷是否執(zhí)行全量同步還是部分同步。

命令傳播:同步完成后,master與slave通過心跳檢測判斷對方是否在線。slave同時向master發(fā)送自己復(fù)制緩沖區(qū)的偏移量。master根據(jù)這些請求,判斷是否向slave同步新產(chǎn)生的命令。slave收到同步的命令后執(zhí)行,最終與master保持同步。

4 使用Lettuce在主從模式下執(zhí)行命令

常用的Java Redis客戶端有Jedis、Redission、Lettuce。這里將通過Lettuce來演示主從模式下的讀寫分離命令執(zhí)行。

<dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> <version>5.1.8.RELEASE</version></dependency>

下面通過

package redis;import io.lettuce.core.ReadFrom;import io.lettuce.core.RedisClient;import io.lettuce.core.RedisURI;import io.lettuce.core.api.sync.RedisCommands;import io.lettuce.core.codec.Utf8StringCodec;import io.lettuce.core.masterslave.MasterSlave;import io.lettuce.core.masterslave.StatefulRedisMasterSlaveConnection;import org.assertj.core.util.Lists; class MainLettuce { public static void main(String[] args) {List<RedisURI> nodes = Lists.newArrayList(RedisURI.create('redis://localhost:7000'),RedisURI.create('redis://localhost:7001'));RedisClient redisClient = RedisClient.create();StatefulRedisMasterSlaveConnection<String, String> connection = MasterSlave.connect(redisClient,new Utf8StringCodec(), nodes);connection.setReadFrom(ReadFrom.SLAVE);RedisCommands<String, String> redisCommand = connection.sync();redisCommand.set('master','master write test2');String value = redisCommand.get('master');System.out.println(value);connection.close();redisClient.shutdown(); }}

補充:Redis 客戶端之Lettuce配置使用(基于Spring Boot 2.x)

開發(fā)環(huán)境:使用Intellij IDEA + Maven + Spring Boot 2.x + JDK 8

Spring Boot 從 2.0版本開始,將默認(rèn)的Redis客戶端Jedis替換問Lettuce,下面描述Lettuce的配置使用。

1.在項目的pom.xml文件下,引入Redis在Spring Boot 下的相關(guān)Jar包依賴

properties><redisson.version>3.8.2</redisson.version> </properties> <dependencies><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency> </dependencies>2.在項目的resources目錄下,在application.yml文件里添加lettuce的配置參數(shù)

#Redis配置spring: redis: database: 6 #Redis索引0~15,默認(rèn)為0 host: 127.0.0.1 port: 6379 password: #密碼(默認(rèn)為空) lettuce: # 這里標(biāo)明使用lettuce配置 pool:max-active: 8 #連接池最大連接數(shù)(使用負(fù)值表示沒有限制)max-wait: -1ms #連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)max-idle: 5 #連接池中的最大空閑連接min-idle: 0 #連接池中的最小空閑連接 timeout: 10000ms #連接超時時間(毫秒)3.添加Redisson的配置參數(shù)讀取類RedisConfig

package com.dbfor.redis.config;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport { /** * RedisTemplate配置 * @param connectionFactory * @return */ @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {// 配置redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//value序列化redisTemplate.afterPropertiesSet();return redisTemplate; }}4.構(gòu)建Spring Boot的啟動類RedisApplication

package com.dbfor.redis;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class RedisApplication { public static void main(String[] args) {SpringApplication.run(RedisApplication.class); }}5.編寫測試類RedisTest

package com.dbfor.redis;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest@RunWith(SpringRunner.class)@Componentpublic class RedisTest { @Autowired private RedisTemplate redisTemplate; @Test public void set() {redisTemplate.opsForValue().set('test:set1', 'testValue1');redisTemplate.opsForSet().add('test:set2', 'asdf');redisTemplate.opsForHash().put('hash1', 'name1', 'lms1');redisTemplate.opsForHash().put('hash1', 'name2', 'lms2');redisTemplate.opsForHash().put('hash1', 'name3', 'lms3');System.out.println(redisTemplate.opsForValue().get('test:set'));System.out.println(redisTemplate.opsForHash().get('hash1', 'name1')); }}6.在Redis上查看運行結(jié)果

Java使用Lettuce客戶端在Redis在主從復(fù)制模式下命令執(zhí)行的操作

從上圖可以看到,Lettuce配置操作數(shù)據(jù)庫成功!

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 日韩一区二区免费视频 | 亚洲视频在线观看 | 精品久久久久久久 | 精品成人 | 四影虎影www4hu23cmo| 伊人二区| 日本妇人成熟免费视频 | 日韩精品免费在线视频 | 国产999精品久久久久久麻豆 | 久久久久亚洲一区二区三区 | 欧美成人精品一区二区 | 久久精品日产高清版的功能介绍 | 国产一级特黄毛片在线毛片 | 日韩在线一区二区三区 | 欧美日韩精品久久久 | 一区二区三区国产好 | 中文字幕精品一区久久久久 | 婷婷五月在线视频 | 精品亚洲网 | 国产在线不卡一区 | 国产91富婆养生按摩会所 | 国产精品久久久久无码av | 午夜网| 日韩在线播放一区 | 四虎永久免费在线 | 特黄视频 | 综合久久网 | 精品视频免费观看 | 国产a区 | 国产女人高潮视频在线观看 | 日韩av免费在线观看 | 欧美日韩一区在线 | 日韩av福利 | 四虎成人在线 | 性一级录像片片视频免费看 | 国产视频福利一区 | 精品欧美乱码久久久久久 | 欧美黑人一级爽快片淫片高清 | 国产美女一区二区 | 久久精品成人一区二区三区蜜臀 | 国产日产欧美a级毛片 |