SpringBoot使用Redis實(shí)現(xiàn)分布式緩存
springboot使用Redis實(shí)現(xiàn)分布式緩存
1、環(huán)境構(gòu)建
? 1.1 通過MybatisX工具逆向功能快速初始化一個(gè)工程(springboot+mybatis-plus)
? 1.2 構(gòu)建controller層測(cè)試各模塊的功能
? 1.3 相同的請(qǐng)求沒有實(shí)現(xiàn)共享數(shù)據(jù),需要開啟mybatis的二級(jí)緩存
? 1.4 springboot環(huán)境下開啟mybatis-plus的二級(jí)緩存
1.5編寫獲取spring工廠的工具類
@Component public class ApplicationContextUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public static Object getBean(String beanName){ return applicationContext.getBean(beanName); } }
1.6編寫Redis緩存類
@Slf4j public class RedisCache implements Cache { private final String id; public RedisCache(String id){ this.id = id; } // 操作模塊的mapper文件的命名空間 唯一標(biāo)識(shí)符 @Override public String getId() { log.info("id= {}",id); return this.id; } // 將數(shù)據(jù)寫入redis @Override public void putObject(Object key, Object value) { log.info("===============將查詢的數(shù)據(jù)開始寫入緩存==============="); RedisTemplate redisTemplate = getRedisTemplate(); redisTemplate.opsForHash().put(id, key.toString(), value); log.info("===============將查詢的數(shù)據(jù)寫入緩存完畢==============="); } // 獲取緩存中的數(shù)據(jù) @Override public Object getObject(Object key) { log.info("============開始從緩存中獲取數(shù)據(jù)============="); RedisTemplate redisTemplate = getRedisTemplate(); log.info("============從緩存中獲取數(shù)據(jù)完畢============="); return redisTemplate.opsForHash().get(id, key.toString()); } // 移除緩存中的數(shù)據(jù) @Override public Object removeObject(Object key) { return null; } // 清空緩存 @Override public void clear() { log.info("==========清空緩存============="); RedisTemplate redisTemplate = getRedisTemplate(); redisTemplate.delete(id); } // 獲取緩存的數(shù)量 @Override public int getSize() { RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); int size = redisTemplate.opsForHash().size(id).intValue(); return size; } private RedisTemplate getRedisTemplate(){ RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate"); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); return redisTemplate; } }
1.7Redis中有關(guān)聯(lián)關(guān)系緩存數(shù)據(jù)的處理
@CacheNamespaceRef(DeptMapper.class) // 引用有關(guān)聯(lián)關(guān)系的命名空間 public interface EmpMapper extends BaseMapper<Emp> { } 注:以上設(shè)置完成后,兩個(gè)模塊會(huì)使用相同的key(命名空間)存儲(chǔ)數(shù)據(jù)到緩存中
1.8 Redis中key進(jìn)行摘要算法
DigestUtils.md5DigestAsHex(key.toString().getBytes()) // 通過該操作可以減少key的長度
Redis實(shí)現(xiàn)主從復(fù)制
1.準(zhǔn)備三臺(tái)已經(jīng)安裝Redis的虛擬機(jī)
???????2.查看三臺(tái)虛擬機(jī)的ip地址
3.通過遠(yuǎn)程連接工具FinalShell連接
4.修改從節(jié)點(diǎn)配置文件
啟動(dòng)三臺(tái)服務(wù)器上的redis后,輸入一下命令查看redis主從配置狀態(tài)
info replication
修改從節(jié)點(diǎn)服務(wù)器的配置文件redis.conf
replicaof 主機(jī)ip 主機(jī)redis接口 masterauth 密碼
修改后重啟兩個(gè)從機(jī),在主機(jī)和從機(jī)分別輸入一下命令查看如下:
info replication
驗(yàn)證主從架構(gòu)
至此主從架構(gòu)設(shè)置完成
Redis集群的構(gòu)建
以上結(jié)構(gòu)的集群構(gòu)建可以在一臺(tái)虛擬機(jī)環(huán)境中進(jìn)行模擬,首先創(chuàng)建一臺(tái)已經(jīng)安裝好Redis數(shù)據(jù)庫的虛擬機(jī)
開啟虛擬機(jī)并在虛擬機(jī)的根路徑下創(chuàng)建好7000,7001,7002,7003,7004,7005六個(gè)文件夾,之后將redis解壓目錄下的redis.conf配置文件拷貝到以上幾個(gè)文件夾中,同時(shí)按照以下參數(shù)完成配置文件的修改
修改配置文件中的參數(shù)
以上6個(gè)文件夾中文件全部修改完畢之后,可以按照以下指令啟動(dòng)全部的redis節(jié)點(diǎn)
查看redis服務(wù)是否已經(jīng)全部啟動(dòng)成功
ps aux|grep redis
全部啟動(dòng)成功之后,執(zhí)行以下指令,將多個(gè)節(jié)點(diǎn)組合成集群,同時(shí)實(shí)現(xiàn)主從備份
確認(rèn)集群的主從從節(jié)點(diǎn)信息
輸入yes,確認(rèn)主從節(jié)點(diǎn)信息后,輸出以下信息,表示集群構(gòu)建成功
使用一下指令登錄集群中的任意節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)的操作,查看集群是否可正常工作
./redis-cli -a cyclone -c -h 192.168.220.11 -p 7001 連接 -a 表示連接密碼 沒有可省略 -c 表示集群方式進(jìn)行啟動(dòng) -h ip 地址 -p 表示端口號(hào)
如果在springboot項(xiàng)目中連接Redis集群可按照一下方式進(jìn)行配置
redis: cluster: nodes: 192.168.1.1:6379 ,.....
以上就是SpringBoot使用Redis實(shí)現(xiàn)分布式緩存的詳細(xì)內(nèi)容,更多關(guān)于Springboot Redis分布式緩存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析Java的Spring框架的基本結(jié)構(gòu)
這篇文章主要介紹了Java的Spring框架的基本結(jié)構(gòu),作者從Spring的設(shè)計(jì)角度觸發(fā)解析其基礎(chǔ)的架構(gòu)內(nèi)容,需要的朋友可以參考下2016-03-03Java如何導(dǎo)入Jsoup庫做一個(gè)有趣的爬蟲項(xiàng)目
Jsoup庫是一款Java的HTML解析器,可用于從網(wǎng)絡(luò)或本地文件中獲取HTML文檔并解析其中的數(shù)據(jù),這篇文章給大家介紹Java導(dǎo)入Jsoup庫做一個(gè)有趣的爬蟲項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2023-11-11SpringCloud:feign對(duì)象傳參和普通傳參及遇到的坑解決
這篇文章主要介紹了SpringCloud:feign對(duì)象傳參和普通傳參及遇到的坑解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Springboot如何實(shí)現(xiàn)對(duì)配置文件中的明文密碼加密
這篇文章主要介紹了Springboot如何實(shí)現(xiàn)對(duì)配置文件中的明文密碼加密問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南
ActiveMQ是一種開源的基于JMS規(guī)范的一種消息中間件的實(shí)現(xiàn),ActiveMQ的設(shè)計(jì)目標(biāo)是提供標(biāo)準(zhǔn)的,面向消息的,能夠跨越多語言和多系統(tǒng)的應(yīng)用集成消息通信中間件,這篇文章主要給大家介紹了關(guān)于spring?boot學(xué)習(xí)筆記之操作ActiveMQ指南的相關(guān)資料,需要的朋友可以參考下2021-11-11ThreadLocal原理介紹及應(yīng)用場(chǎng)景
本文詳細(xì)講解了ThreadLocal原理介紹及應(yīng)用場(chǎng)景,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12springboot新建項(xiàng)目jdk只有17/21,無法選中1.8解決辦法
最近博主也有創(chuàng)建springboot項(xiàng)目,發(fā)現(xiàn)了IntelliJ IDEA在通過Spring Initilizer初始化項(xiàng)目的時(shí)候已經(jīng)沒有java8版本的選項(xiàng)了,這里給大家總結(jié)下,這篇文章主要給大家介紹了springboot新建項(xiàng)目jdk只有17/21,無法選中1.8的解決辦法,需要的朋友可以參考下2023-12-12springBoot中的CORS跨域注解@CrossOrigin詳解
這篇文章主要介紹了springBoot中的CORS跨域注解@CrossOrigin詳解,通常,服務(wù)于?JS?的主機(jī)(例如?example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如?api.example.com)是不同的,在這種情況下,CORS?可以實(shí)現(xiàn)跨域通信,需要的朋友可以參考下2023-12-12