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

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



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文件的命名空間 唯一標識符
@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中有關聯(lián)關系緩存數(shù)據(jù)的處理
@CacheNamespaceRef(DeptMapper.class) // 引用有關聯(lián)關系的命名空間
public interface EmpMapper extends BaseMapper<Emp> {
}
注:以上設置完成后,兩個模塊會使用相同的key(命名空間)存儲數(shù)據(jù)到緩存中
1.8 Redis中key進行摘要算法
DigestUtils.md5DigestAsHex(key.toString().getBytes()) // 通過該操作可以減少key的長度
Redis實現(xiàn)主從復制
1.準備三臺已經(jīng)安裝Redis的虛擬機

???????2.查看三臺虛擬機的ip地址



3.通過遠程連接工具FinalShell連接


4.修改從節(jié)點配置文件
啟動三臺服務器上的redis后,輸入一下命令查看redis主從配置狀態(tài)
info replication

修改從節(jié)點服務器的配置文件redis.conf
replicaof 主機ip 主機redis接口 masterauth 密碼

修改后重啟兩個從機,在主機和從機分別輸入一下命令查看如下:
info replication


驗證主從架構


至此主從架構設置完成
Redis集群的構建

以上結構的集群構建可以在一臺虛擬機環(huán)境中進行模擬,首先創(chuàng)建一臺已經(jīng)安裝好Redis數(shù)據(jù)庫的虛擬機

開啟虛擬機并在虛擬機的根路徑下創(chuàng)建好7000,7001,7002,7003,7004,7005六個文件夾,之后將redis解壓目錄下的redis.conf配置文件拷貝到以上幾個文件夾中,同時按照以下參數(shù)完成配置文件的修改

修改配置文件中的參數(shù)

以上6個文件夾中文件全部修改完畢之后,可以按照以下指令啟動全部的redis節(jié)點


查看redis服務是否已經(jīng)全部啟動成功
ps aux|grep redis

全部啟動成功之后,執(zhí)行以下指令,將多個節(jié)點組合成集群,同時實現(xiàn)主從備份


確認集群的主從從節(jié)點信息

輸入yes,確認主從節(jié)點信息后,輸出以下信息,表示集群構建成功


使用一下指令登錄集群中的任意節(jié)點實現(xiàn)數(shù)據(jù)的操作,查看集群是否可正常工作
./redis-cli -a cyclone -c -h 192.168.220.11 -p 7001 連接 -a 表示連接密碼 沒有可省略 -c 表示集群方式進行啟動 -h ip 地址 -p 表示端口號

如果在springboot項目中連接Redis集群可按照一下方式進行配置
redis:
cluster:
nodes: 192.168.1.1:6379 ,.....
以上就是SpringBoot使用Redis實現(xiàn)分布式緩存的詳細內容,更多關于Springboot Redis分布式緩存的資料請關注腳本之家其它相關文章!
相關文章
Java微信公眾平臺開發(fā)(10) 微信自定義菜單的創(chuàng)建實現(xiàn)
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第十步,微信自定義菜單的創(chuàng)建實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
Springboot搭建JVM監(jiān)控(Springboot + Prometheus +&n
在應用開發(fā)時,監(jiān)控報警必不可少,本文主要介紹了Springboot搭建JVM監(jiān)控(Springboot + Prometheus + Grafana),具有一定的參考價值,感興趣的可以了解一下2024-05-05
Java多線程開發(fā)工具之CompletableFuture的應用詳解
做Java編程,難免會遇到多線程的開發(fā),但是JDK8這個CompletableFuture類很多開發(fā)者目前還沒聽說過,但是這個類實在是太好用了,本文就來聊聊它的應用吧2023-03-03
java反射機制及beanUtils的實現(xiàn)原理分析
本文介紹了Java的反射機制、VO、DTO、PO的概念以及BeanUtils的實現(xiàn)原理和簡單示例,通過反射可以在運行時動態(tài)操作類、方法和字段,BeanUtils用于在不同bean之間進行屬性復制2024-12-12
關于MyBatisSystemException異常產生的原因及解決過程
文章講述了在使用MyBatis進行數(shù)據(jù)庫操作時遇到的異常及其解決過程,首先考慮了事務問題,但未解決,接著懷疑是MyBatis的一級緩存問題,關閉緩存后問題依舊存在,最終發(fā)現(xiàn)是SQL映射文件中的參數(shù)傳遞錯誤,使用了錯誤的標簽導致循環(huán)插入2025-01-01
關于json序列化(javaBean轉Json的細節(jié)處理)
這篇文章主要介紹了關于json序列化(javaBean轉Json的細節(jié)處理),具有很好的參考價值,希望對大家有所幫助。2022-03-03
java中創(chuàng)建寫入文件的6種方式詳解與源碼實例
這篇文章主要介紹了java中創(chuàng)建寫入文件的6種方式詳解與源碼實例,Files.newBufferedWriter(Java 8),Files.write(Java 7 推薦),PrintWriter,File.createNewFile,FileOutputStream.write(byte[] b) 管道流,需要的朋友可以參考下2022-12-12

