SpringBoot使用Redis實(shí)現(xiàn)分布式緩存

springboot使用Redis實(shí)現(xiàn)分布式緩存
1、環(huán)境構(gòu)建
? 1.1 通過(guò)MybatisX工具逆向功能快速初始化一個(gè)工程(springboot+mybatis-plus)
? 1.2 構(gòu)建controller層測(cè)試各模塊的功能
? 1.3 相同的請(qǐng)求沒(méi)有實(shí)現(xiàn)共享數(shù)據(jù),需要開(kāi)啟mybatis的二級(jí)緩存
? 1.4 springboot環(huán)境下開(kāi)啟mybatis-plus的二級(jí)緩存



1.5編寫(xiě)獲取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編寫(xiě)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ù)寫(xiě)入redis
@Override
public void putObject(Object key, Object value) {
log.info("===============將查詢的數(shù)據(jù)開(kāi)始寫(xiě)入緩存===============");
RedisTemplate redisTemplate = getRedisTemplate();
redisTemplate.opsForHash().put(id, key.toString(), value);
log.info("===============將查詢的數(shù)據(jù)寫(xiě)入緩存完畢===============");
}
// 獲取緩存中的數(shù)據(jù)
@Override
public Object getObject(Object key) {
log.info("============開(kāi)始從緩存中獲取數(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()) // 通過(guò)該操作可以減少key的長(zhǎng)度
Redis實(shí)現(xiàn)主從復(fù)制
1.準(zhǔn)備三臺(tái)已經(jīng)安裝Redis的虛擬機(jī)

???????2.查看三臺(tái)虛擬機(jī)的ip地址



3.通過(guò)遠(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ù)庫(kù)的虛擬機(jī)

開(kāi)啟虛擬機(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 表示連接密碼 沒(méi)有可省略 -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微信公眾平臺(tái)開(kāi)發(fā)(10) 微信自定義菜單的創(chuàng)建實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第十步,微信自定義菜單的創(chuàng)建實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Springboot搭建JVM監(jiān)控(Springboot + Prometheus +&n
在應(yīng)用開(kāi)發(fā)時(shí),監(jiān)控報(bào)警必不可少,本文主要介紹了Springboot搭建JVM監(jiān)控(Springboot + Prometheus + Grafana),具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
@Autowired 自動(dòng)注入接口失敗的原因及解決
這篇文章主要介紹了@Autowired 自動(dòng)注入接口失敗的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java多線程開(kāi)發(fā)工具之CompletableFuture的應(yīng)用詳解
做Java編程,難免會(huì)遇到多線程的開(kāi)發(fā),但是JDK8這個(gè)CompletableFuture類很多開(kāi)發(fā)者目前還沒(méi)聽(tīng)說(shuō)過(guò),但是這個(gè)類實(shí)在是太好用了,本文就來(lái)聊聊它的應(yīng)用吧2023-03-03
java反射機(jī)制及beanUtils的實(shí)現(xiàn)原理分析
本文介紹了Java的反射機(jī)制、VO、DTO、PO的概念以及BeanUtils的實(shí)現(xiàn)原理和簡(jiǎn)單示例,通過(guò)反射可以在運(yùn)行時(shí)動(dòng)態(tài)操作類、方法和字段,BeanUtils用于在不同bean之間進(jìn)行屬性復(fù)制2024-12-12
關(guān)于MyBatisSystemException異常產(chǎn)生的原因及解決過(guò)程
文章講述了在使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作時(shí)遇到的異常及其解決過(guò)程,首先考慮了事務(wù)問(wèn)題,但未解決,接著懷疑是MyBatis的一級(jí)緩存問(wèn)題,關(guān)閉緩存后問(wèn)題依舊存在,最終發(fā)現(xiàn)是SQL映射文件中的參數(shù)傳遞錯(cuò)誤,使用了錯(cuò)誤的標(biāo)簽導(dǎo)致循環(huán)插入2025-01-01
關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理)
這篇文章主要介紹了關(guān)于json序列化(javaBean轉(zhuǎn)Json的細(xì)節(jié)處理),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-03-03
java中創(chuàng)建寫(xiě)入文件的6種方式詳解與源碼實(shí)例
這篇文章主要介紹了java中創(chuàng)建寫(xiě)入文件的6種方式詳解與源碼實(shí)例,Files.newBufferedWriter(Java 8),Files.write(Java 7 推薦),PrintWriter,File.createNewFile,FileOutputStream.write(byte[] b) 管道流,需要的朋友可以參考下2022-12-12

