內建Redis作為緩存或資料存儲系統具有以下幾個重要的原因:
- 提升性能:Redis是一種高性能的記憶體資料庫,它以鍵值對的方式存儲資料,并且資料存儲在記憶體中,是以讀寫速度非常快。通過将熱點資料存儲在Redis中,可以顯著提升應用程式的響應速度和吞吐量。
- 緩存支援:Redis提供了對緩存的支援,可以将經常通路的資料緩存到Redis中,以減少對後端資料庫的頻繁通路。由于Redis的高速讀寫能力,可以大大減少資料庫負載,提高系統的整體性能和可擴充性。
- 分布式鎖:在分布式環境中,確定資料的一緻性和避免并發沖突是一個挑戰。Redis提供了分布式鎖的功能,可以幫助開發人員實作對共享資源的安全通路。通過使用Redis的分布式鎖,可以防止多個執行個體同時修改同一資料,確定資料的正确性和完整性。
- 釋出/訂閱功能:Redis支援釋出/訂閱模式,可以實作實時消息的傳遞和廣播。這對于需要實時通知或實時資料更新的應用程式非常有用。例如,在聊天應用程式或實時資料監控系統中,可以使用Redis的釋出/訂閱功能實作消息的實時傳遞。
- 計數器和排行榜:Redis提供了原子性的操作,可以用于實作計數器和排行榜等功能。開發人員可以使用Redis的原子遞增和遞減操作來實作對資料的計數,或者使用有序集合來存儲和排名資料,如使用者積分排行榜。
- 會話管理:對于需要跨多個伺服器執行個體管理使用者會話的應用程式,Redis可以用作會話存儲。将會話資料存儲在Redis中可以實作會話的共享和集中管理,提高應用程式的可伸縮性和容錯性。
綜上所述,內建Redis在Java項目中可以提供高性能的緩存支援、分布式鎖、實時消息傳遞、計數器和排行榜等功能,以及會話管理等優勢,進而改善應用程式的性能、擴充性和可靠性。
Redis叢集具有以下優點:
- 高可用性:Redis叢集提供了主從複制和故障轉移功能,當其中一個節點失敗時,系統可以自動切換到其他可用節點,保證服務的高可用性。這樣可以避免單點故障導緻整個系統不可用的情況發生。
- 提高性能:Redis叢集允許在多個節點上進行資料分片,每個節點負責處理一部分資料。這種資料分片方式可以提高系統的并發處理能力和讀寫性能,因為多個節點可以并行處理請求和存儲資料。
- 擴充性:随着業務的增長,資料量也會增加,通過使用Redis叢集可以輕松地擴充存儲容量。當資料量超過單個節點的存儲能力時,可以簡單地添加新的節點來擴充叢集的存儲容量和性能。
- 負載均衡:Redis叢集會自動進行資料分布和負載均衡,将資料均勻地分布到各個節點上。這樣可以避免某個節點負載過高,而其他節點負載過低的情況,保證系統整體的負載均衡。
- 資料備援和備份:Redis叢集使用主從複制機制,将主節點的資料複制到從節點上,實作資料的備援和備份。當主節點發生故障時,可以自動切換到從節點,確定資料的可用性和持久性。
- 故障恢複:Redis叢集支援故障自動轉移功能,當主節點發生故障時,系統可以自動選擇一個從節點作為新的主節點,保證系統的連續可用性。這種故障轉移的機制可以大大減少系統停機時間和人工幹預的需求。
引用Spring Boot Redis依賴
# pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${org.springframework.boot}</version>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis}</version>
</dependency>
配置Redis 叢集連結池
# platform-config/src/main/resources/application-redis.yml.vm
# maven 編譯後會自動在每個項目的class目錄下生成application-redis.yml。
## Duration轉換字元串方式,預設為正,負以-開頭,緊接着P,(字母不區分大小寫)D :天 T:天和小時之間的分隔符 H :小時 M:分鐘 S:秒 每個機關都必須是數字,且時分秒順序不能亂。例如PT20M,就是設定為20分鐘,
# group ID: com.tinem
# data ID: redis.yaml
spring:
redis:
timeout: 1000
jedis:
pool:
# 連接配接池中的最大空閑連接配接
max-idle: 10
# 連接配接池中的最小空閑連接配接
min-idle: 5
# 連接配接池最大連接配接數(使用負值表示沒有限制)
max-active: 10
# 連接配接池最大阻塞等待時間(使用負值表示沒有限制))
max-wait: PT3S
# 每ms運作一次空閑連接配接回收器(獨立線程)
time-between-eviction-runs: PT1M
cluster:
max-redirects: 3
nodes:
# redis叢集節點位址
- ${REDIS_SERVER_HOST_1}:${REDIS_SERVER_PORT_1:7000}
- ${REDIS_SERVER_HOST_2}:${REDIS_SERVER_PORT_2:7000}
- ${REDIS_SERVER_HOST_3}:${REDIS_SERVER_PORT_3:7000}
- ${REDIS_SERVER_HOST_4}:${REDIS_SERVER_PORT_4:7000}
- ${REDIS_SERVER_HOST_5}:${REDIS_SERVER_PORT_5:7000}
- ${REDIS_SERVER_HOST_6}:${REDIS_SERVER_PORT_6:7000}
在多子產品項目中如果需要啟用Redis則在application.yaml中引用Redis配置檔案
spring:
profiles:
include: redis
代碼建議
- redis的key盡量使用英文冒号【:】分隔,很多redis可視化客戶可以通過:給redis key做目錄區分。
- redis的key在保持可讀性的情況下盡量短。
- 盡量使用字元串類型來存儲,友善我們調試問題,如果是要存對象可以使用redis的hash資料結構或者使用json序列化對象,會造成一些性能損耗,但是一般問題不大。
- 所有的key都要設定過期時間,如果不确定過期時間,可以設定的長一些。但一定不要不設定。
Redis叢集可視化管理工具
AnotherRedisDesktopManager
https://github.com/qishibo/AnotherRedisDesktopManager