1. 程式人生 > >【分散式快取】——-基於redis分散式快取的實現

【分散式快取】——-基於redis分散式快取的實現

一:Redis 是什麼?

Redis是基於記憶體、可持久化的日誌型、Key-Value資料庫 高效能儲存系統,並提供多種語言的API.

二:出現背景

  • 資料結構(Data Structure)需求越來越多, 但memcache中沒有, 影響開發效率
  • 效能需求, 隨著讀操作的量的上升需要解決,經歷的過程有: 
    資料庫讀寫分離(M/S)–>資料庫使用多個Slave–>增加Cache (memcache)–>轉到Redis
  • 解決寫的問題: 
    水平拆分,對錶的拆分,將有的使用者放在這個表,有的使用者放在另外一個表;
  • 可靠性需求 
    Cache的"雪崩"問題讓人糾結 
    Cache面臨著快速恢復的挑戰

  • 開發成本需求 
    Cache和DB的一致性維護成本越來越高(先清理DB, 再清理快取, 不行啊, 太慢了!) 
    開發需要跟上不斷湧入的產品需求 
    硬體成本最貴的就是資料庫層面的機器,基本上比前端的機器要貴幾倍,主要是IO密集型,很耗硬體;

  • 維護性複雜 
    一致性維護成本越來越高; 
    BerkeleyDB使用B樹,會一直寫新的,內部不會有檔案重新組織;這樣會導致檔案越來越大;大的時候需要進行檔案歸檔,歸檔的操作要定期做; 
    這樣,就需要有一定的down time;

基於以上考慮, 選擇了Redis

三:Redis 應用

Redis簡介

1. 支援5種資料結構

支援strings, hashes, lists, sets, sorted sets 


string是很好的儲存方式,用來做計數儲存。sets用於建立索引庫非常棒;

2. K-V 儲存 vs K-V 快取

新浪微博目前使用的98%都是持久化的應用,2%的是快取,用到了600+伺服器 
Redis中持久化的應用和非持久化的方式不會差別很大: 
非持久化的為8-9萬tps,那麼持久化在7-8萬tps左右; 
當使用持久化時,需要考慮到持久化和寫效能的配比,也就是要考慮redis使用的記憶體大小和硬碟寫的速率的比例計算;

3. 社群活躍

Redis目前有3萬多行程式碼, 程式碼寫的精簡,有很多巧妙的實現,作者有技術潔癖 
Redis的社群活躍度很高,這是衡量開源軟體質量的重要指標,開源軟體的初期一般都沒有商業技術服務支援,如果沒有活躍社群做支撐,一旦發生問題都無處求救;

Redis基本原理

redis持久化(aof) append online file: 
寫log(aof), 到一定程度再和記憶體合併. 追加再追加, 順序寫磁碟, 對效能影響非常小

1. 單例項單程序

Redis使用的是單程序,所以在配置時,一個例項只會用到一個CPU; 
在配置時,如果需要讓CPU使用率最大化,可以配置Redis例項數對應CPU數, Redis例項數對應埠數(8核Cpu, 8個例項, 8個埠), 以提高併發: 
單機測試時, 單條資料在200位元組, 測試的結果為8~9萬tps;

2. Replication

過程: 資料寫到master–>master儲存到slave的rdb中–>slave載入rdb到記憶體。 
儲存點(save point): 當網路中斷了, 連上之後, 繼續傳. 
Master-slave下第一次同步是全傳,後面是增量同步;、

3. 資料一致性

長期執行後多個結點之間存在不一致的可能性; 
開發兩個工具程式: 
1.對於資料量大的資料,會週期性的全量檢查; 
2.實時的檢查增量資料,是否具有一致性;

對於主庫未及時同步從庫導致的不一致,稱之為延時問題; 
對於一致性要求不是那麼嚴格的場景,我們只需要要保證最終一致性即可; 
對於延時問題,需要根據業務場景特點分析,從應用層面增加策略來解決這個問題; 
例如: 
1.新註冊的使用者,必須先查詢主庫; 
2.註冊成功之後,需要等待3s之後跳轉,後臺此時就是在做資料同步。

四:分散式快取的架構設計

1.架構設計

由於redis是單點,專案中需要使用,必須自己實現分散式。基本架構圖如下所示

2.分散式實現

通過key做一致性雜湊,實現key對應redis結點的分佈。

一致性雜湊的實現:

l        hash值計算:通過支援MD5與MurmurHash兩種計算方式,預設是採用MurmurHash,高效的hash計算。

l        一致性的實現:通過Java的TreeMap來模擬環狀結構,實現均勻分佈

3.client的選擇

對於jedis修改的主要是分割槽模組的修改,使其支援了跟據BufferKey進行分割槽,跟據不同的redis結點資訊,可以初始化不同的 ShardInfo,同時也修改了JedisPool的底層實現,使其連線pool池支援跟據key,value的構造方法,跟據不同 ShardInfos,建立不同的jedis連線客戶端,達到分割槽的效果,供應用層呼叫

4.模組的說明

l        髒資料處理模組,處理失敗執行的快取操作。

l        遮蔽監控模組,對於jedis操作的異常監控,當某結點出現異常可控制redis結點的切除等操作。

整個分散式模組通過hornetq,來切除異常redis結點。對於新結點的增加,也可以通過reload方法實現增加。(此模組對於新增結點也可以很方便實現)

對於以上分散式架構的實現滿足了專案的需求。另外使用中對於一些比較重要用途的快取資料可以單獨設定一些redis結點,設定特定的優先順序。另外對 於快取介面的設計,也可以跟據需求,實現基本介面與一些特殊邏輯介面。對於cas相關操作,以及一些事物操作可以通過其watch機制來實現。

相關推薦

分散式快取——-基於redis分散式快取實現

一:Redis 是什麼? Redis是基於記憶體、可持久化的日誌型、Key-Value資料庫 高效能儲存系統,並提供多種語言的API. 二:出現背景 資料結構(Data Structure)需求

基於Redis Lua指令碼實現分散式鎖(Java實現

最近專案中需要用到一個分散式的鎖,考慮到基於會話節點實現的zookeeper鎖效能不夠,於是想使用redis來實現一個分散式的鎖。看了網上的幾個實現方案後,發現都不夠嚴謹。比如這篇:用Redis實現分散式鎖裡面設計的鎖有個最大的問題是鎖的超時值TTL會一直被改寫

開發筆記基於EasyUI框架,實現table列的動態繫結

使用easyUI從後臺獲取欄位,前臺動態繫結 如下圖效果,表頭小區動態載入,如果沒有賣出商品,就不顯示,並且表頭下方分欄顯示 後臺使用c#,Java程式碼也可以參考 不多說,直接上程式碼 html <table id="PayReport" class="

redis學習之七基於Redis分散式快取常見問題

在使用redis做全域性快取的時候,基本的流程大概是這樣的:     大概流程即為: ①判斷快取是否存在 ②若存在則直接返回呼叫端 ③若不存在則從資料庫載入資料 ④將載入的資料寫入快取 ⑤返回呼叫端     但是現實使用過程中還是有一些問題值

連載redis庫存操作,分散式鎖的四種實現方式[三]--基於Redis watch機制實現分散式

一、redis的事務介紹 1、 Redis保證一個事務中的所有命令要麼都執行,要麼都不執行。如果在傳送EXEC命令前客戶端斷線了,則Redis會清空事務佇列,事務中的所有命令都不會執行。而一旦客戶端傳送了EXEC命令,所有的命令就都會被執行,即使此後客戶端斷線也沒關係,因為Redis中已經記錄了所有要執行的

個人專案基於scrapy-redis的股票分散式爬蟲實現及其股票預測演算法研究

前言 都說做計算機的,專案實踐是最能帶給人成長的。之前學習了很多的大資料和AI的知識,但是從來沒有自己做過一個既包含大資料又包含AI的專案。後來就決定做了個大資料+AI的分散式爬蟲系統。下面筆者會講述整個專案的架構,以及所用到技術點的些許介紹。 專案介紹 這個專

基於redis分散式快取實現(新浪微博案例)

第一:Redis 是什麼? Redis是基於記憶體、可持久化的日誌型、Key-Value資料庫 高效能儲存系統,並提供多種語言的API. 第二:出現背景 資料結構(Data Structure)需求越來越多, 但memcache中沒有, 影響開發效率 效能需求, 隨

redis學習之六基於Redis分散式session實現

    在web應用中,我們經常會用session來儲存已登入使用者的相關資訊,在單機應用中,由於所有的使用者都訪問同一個應用,而session都儲存在此單機應用中所以並無不妥。但是隨著使用者併發量的上升,分散式系統勢在必行,這就導致一個使用者的訪問請求可能會分發到不同的叢集部署

redis學習之五基於redis分散式實現

    在單個JVM中,我們可以很方便的用sychronized或者reentrantLock在資源競爭時進行加鎖,保證高併發下資料執行緒安全。但是若是分散式環境下,多個JVM同時對一個資源進行競爭時,我們該如何保證執行緒安全呢?分散式鎖便能實現我們的要求。   &n

隨筆Java 基於Redis分散式

定義介面 public interface IDistributedLock { boolean tryLock(String var1, Object var2); boolean tryLock(String var1, Object var2, i

xbin-store基於springboot的分散式B2C電商開源專案

原文地址:https://blog.csdn.net/g290095142/article/details/79105219 致敬原作者CSDN下載地址核心技術(後臺)使用Spring Boot 構建整個專

Azure Redis 快取Azure Redis 服務不支援指令CONFIG

問題描述 在Azure Redis的門戶頁面中,通過Redis Console連線到Redis後,想通過CONFIG命令來配置Redis,但是系統提示CONFIG命令不能用。 錯誤訊息為:(error) ERR unknown command `config`。   根本原因 因為 Azure R

Azure Redis 快取Azure Redis功能性討論

關於使用Azure Redis服務在以下九大方面的功能性的解說: 高可用 備份可靠性 配置自動化 部署多樣性 快速回檔功能 資料擴容 SLA穩定性 資料安全性 監控系統   一:高可用 Azure Cache for Redis 具有內建的高可用性。 其高可用性體系結構的目標是確保託

Azure Redis 快取Azure Redis 功能性討論二

繼承上一次討論了Azure Redis的可用性,可靠性,穩定性,安全性,監控方面的九大功能點。詳情可回顧文章:【Azure Redis 快取】Azure Redis功能性討論 這次我們繼續討論Azure Redis的以下六點問題:   1:Redis能否暫停或重啟 2:Redis群集擴大分片後能否縮小

redis基於redis實現分布式並發鎖

val 內容 等待隊列 過多 具體實現 exec ret abs con 基於redis實現分布式並發鎖(註解實現) 說明   前提, 應用服務是分布式或多服務, 而這些"多"有共同的"redis";   GitHub: https:

Yii2中使用基於redis快取

背景知識: 快取顧名思義就是將資料儲存起來,下次要使用時直接獲取即可。程式中用的最多的就是將資料庫的資料進行快取從而減少查詢資料庫的次數,減輕伺服器壓力。 yii2框架預設使用的是檔案快取,本文將介紹redis快取的使用,因此需要安裝yii的redis擴充套件,傳送門 1.首

springboot 2.x 快取功能,基於redis封裝快取

spring boot整合redis進行資料快取功能         @Cacheable 表明Spring在呼叫方法之前,首先應該在快取中查詢方法的返回值。如果這個值能夠找到,就會返回快取的值。否則的話,這個方法就

大資料安裝偽分散式Hadoop叢集

壓縮包: eclipse-jee-photon-R-linux-gtk-x86_64.tar.gz hadoop-2.9.1.tar.gz jdk-10.0.1_linux-x64_bin.tar.gz 配置主機名和網路 配置主機名: #hostnamect

大資料安裝完全分散式Hadoop叢集

修改主機名和網路 master: #hostnamectl set-hostname master #vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BR

基於Redis分散式鎖(獲取鎖及解鎖)

  目前幾乎很多大型網站及應用都是分散式部署的,分散式場景中的資料一致性問題一直是一個比較重要的話題。分散式的CAP理論告訴我們“任何一個分散式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分割槽容錯性(Partition tolerance),最多隻能同時滿足兩項。