導航:首頁 > IDC知識 > redis數據保存伺服器

redis數據保存伺服器

發布時間:2020-11-13 00:48:29

1、用了redis後,介面是不是就可以多台伺服器了,用一個redis 或一個redis集群 就可以

Set集合中不允許抄出現重復的元素,這一點和C++標准庫中的set容器是完全相同的。換句話說,如果多次添加相同元素,Set中將僅保留該元素的一份拷貝。和List類型相比,Set類型在功能上還存在著一個非常重要的特性,即在伺服器端完成多個Sets之間的聚合計算操作,如unions、intersections和differences。由於這些操作均在服務端完成,因此效率極高,而且也節省了大量的網路IO開銷。

2、數據存到redis 過後怎麼處理放到資料庫

1、 快照的方式持久化到磁碟
自動持久化規則配置
save 900 1
save 300 10
save 60 10000
上面的配置規則意思如下:
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
redis也可以關閉自動持久化,注釋掉這些save配置,或者save 「」
如果後台保存到磁碟發生錯誤,將停止寫操作.
stop-writes-on-bgsave-error yes
使用LZF壓縮rdb文件,這會耗CPU, 但是可以減少磁碟佔用.
rdbcompression yes
保存rdb和載入rdb文件的時候檢驗,可以防止錯誤,但是要付出約10%的性能,可以關閉他,提高性能。
rdbchecksum yes
導出的rdb文件名
dbfilename mp.rdb
設置工作目錄, rdb文件會寫到該目錄, append only file也會存儲在該目錄下.
dir ./
Redis自動快照保存到磁碟或者調用bgsave,是後台進程完成的,其他客戶端仍然和可以讀寫redis伺服器,後台保存快照到磁碟會佔用大量內存。調用save保存內存中的數據到磁碟,將阻塞客戶端請求,直到保存完畢。
調用shutdown命令,Redis伺服器會先調用save,所有數據持久化到磁碟之後才會真正退出。
對於數據丟失的問題:
如果伺服器crash,從上一次快照之後的數據將全部丟失。所以在設置保存規則的時候,要根據實際業務設置允許的范圍。
如果對於數據敏感的業務,在程序中要使用恰當的日誌,在伺服器crash之後,通過日誌恢復數據。
2、 Append-only file 的方式持久化

另外一種方式為遞增的方式,將會引起數據變化的操作, 持久化到文件中, 重啟redis的時候,通過操作命令,恢復數據.

每次執行寫操作命令之後,都會將數據寫到server.aofbuf中。
# appendfsync always
appendfsync everysec
# appendfsync no

當配置為always的時候,每次server.aofbuf中的數據寫入到文件之後,才會返回給客戶端,這樣可以保證數據不丟,但是頻繁的IO操作,會降低性能。

everysec每秒寫一次,這可能會丟失一秒內的操作。

aof最大的問題就是隨著時間append file會變的很大,所以我們需要bgrewriteaof命令重新整理文件,只保留最新的kv數據。

3、Linux伺服器如何自定義安裝Redis

一、安裝步聚:
1、從Redis官網下載指定版本(http://redis.io/download):
wget http://download.redis.io/releases/redis-2.8.24.tar.gz
2、解壓縮:
tar xzf redis-2.8.24.tar.gz
3、進入解壓縮目錄:
cd redis-2.8.24
4、安裝至指定目錄:
make PREFIX=/alidata/server/redis install
二、配置Redis:

1、復制redis-2.8.24文件夾中的配置文件至etc目錄:cp redis.conf /etc/
2、修改配置文件:vi /etc/redis.conf

#查找daemonize no改為
#以守護進程方式運行
daemonize yes
#修改dir ./為絕對路徑,
#默認的話redis-server啟動時會在當前目錄生成或讀取mp.rdb
#所以如果在根目錄下執行redis-server /etc/redis.conf的話,
#讀取的是根目錄下的mp.rdb,為了使redis-server可在任意目錄下執行
#所以此處將dir改為絕對路徑
dir /alidata/server/redis
#修改appendonly為yes
#指定是否在每次更新操作後進行日誌記錄,
#Redis在默認情況下是非同步的把數據寫入磁碟,
#如果不開啟,可能會在斷電時導致一段時間內的數據丟失。
#因為 redis本身同步數據文件是按上面save條件來同步的,
#所以有的數據會在一段時間內只存在於內存中。默認為no
appendonly yes
#如果要設置登陸密碼,則開啟requirepass
requirepass 123456
3、#將redis添加到自啟動中
echo "/alidata/server/redis/bin/redis-server /etc/redis.conf" >> /etc/rc.d/rc.local
#啟動redis
/alidata/server/redis/bin/redis-server /etc/redis.conf
#查看redis是否己啟動
ps -ef | grep redis
#停止redis
/alidata/server/redis/bin/redis-cli shutdown(浦東數據中心為您解答)

4、如何用redis做session伺服器

布式Session幾種實現式

1.基於資料庫Session共享
2.基於NFS共享文件系統
3.基於memcached session何保證 memcached 本身高用性
4. 基於resin/tomcat web容器本身session復制機制
5. 基於TT/Redis 或 jbosscache 進行 session 共享

6. 基於cookie 進行session共享

或者:

、Session Replication 式管理 (即session復制)

簡介:台機器Session數據廣播復制集群其餘機器

使用場景:機器較少網路流量較

優點:實現簡單、配置較少、網路機器Down掉影響用戶訪問

缺點:廣播式復制其餘機器定廷帶定網路銷

二、Session Sticky 式管理

簡介:即粘性Session、用戶訪問集群某台機器強制指定續所請求均落機器

使用場景:機器數適、穩定性要求非苛刻

優點:實現簡單、配置便、沒額外網路銷

缺點:網路機器Down掉、用戶Session丟失、容易造單點故障

三、緩存集式管理

簡介:Session存入布式緩存集群某台機器用戶訪問同節點先緩存拿Session信息

使用場景:集群機器數、網路環境復雜

優點:靠性

缺點:實現復雜、穩定性依賴於緩存穩定性、Session信息放入緩存要合理策略寫入

二SessionCookie區別聯系及Session實現原理

1、session保存伺服器客戶端知道其信息;cookie保存客戶端伺服器能夠知道其信息

2、session保存象cookie保存字元串

3、session能區路徑同用戶訪問網站期間所session任何都訪問cookie設置路徑參數同網站同路徑cookie互相訪問

4、session需要藉助cookie才能<nobr oncontextmenu="return false;"
onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);"
style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR:
transparent; TEXT-DECORATION: underline" onclick="return kwC();"
onmouseout="kwL(event, this);"
target="_blank">工作客戶端完全禁止cookiesession失效

http狀態協議客戶每讀取web頁面伺服器都打新且伺服器自維護客戶文信息要才能實現網商店
購物車呢session種保存文信息機制針每用戶變數值保存伺服器端通SessionID區同客
戶,sessioncookie或URL重寫基礎默認使用cookie實現系統創造名JSESSIONID輸cookie我
叫做session cookie,區別persistent
cookies,我通所說cookie,注意session
cookie存儲於瀏覽器內存並寫硬碟我剛才看JSESSIONID我通情看JSESSIONID
我瀏覽器cookie禁止web伺服器採用URL重寫式傳遞Sessionid我址欄看
sessionid=KWJHUG6JJM65HS2K6類字元串
明白原理我容易辨persistent cookiessession
cookie區別網些關於兩者安全性討論目session cookie針某言結束session
cookie隨著消失persistent
cookie存於客戶端硬碟段文本(通加密)且能遭cookie欺騙及針cookie跨站腳本攻擊自
session cookie安全
通session
cookie能跨窗口使用新瀏覽器窗口進入相同頁面系統賦予新sessionid我信息共享目達
我先sessionid保存persistent
cookie新窗口讀窗口SessionID通session cookiepersistent
cookie結合我實現跨窗口session tracking(跟蹤)
些web發書往往簡單Sessioncookie作兩種並列http傳送信息式session
cookies位於伺服器端persistent
cookie位於客戶端sessioncookie基礎明白兩者間聯系區別我難選擇合適技術發web
service
總:

、cookie機制session機制區別
具體說cookie機制採用客戶端保持狀態案session機制採用伺服器端保持狀態案
同我看由於伺服器端保持狀態案客戶端需要保存標識所session機制能需要藉助於cookie機制達保存標識目實際其選擇
二、cookie持久cookie區別
設置期間則表示cookie命周期瀏覽器期間要關閉瀏覽器窗口cookie消失種命期瀏覽期cookie稱cookiecookie般保存硬碟保存內存
設置期間瀏覽器cookie保存硬碟關閉再打瀏覽器些cookie依效直超設定期間
存儲硬碟cookie同瀏覽器進程間共享比兩IE窗口於保存內存cookie同瀏覽器同處理式
三、何利用實現自登錄
用戶某網站注冊收惟用戶IDcookie客戶重新連接用戶ID自返伺服器進行檢查確定否注冊用戶且選擇自登錄使用戶需給明確用戶名密碼訪問伺服器資源
四、何根據用戶定製站點
網站使用cookie記錄用戶意願於簡單設置網站直接頁面設置存儲cookie完定製於更復雜定製網站需僅惟標識符發送給用戶由伺服器端資料庫存儲每標識符應頁面設置
五、cookie發送
1.創建Cookie象
2.設置效
3.Cookie放入HTTP響應報
 
 創建cookie並發送瀏覽器默認情況級別cookie:存儲瀏覽器內存用戶退瀏覽器刪除
希望瀏覽器該cookie存儲磁碟則需要使用maxAge並給秒單位間效設0則命令瀏覽器刪除該
cookie
 
 發送cookie需要使用插入 Set-Cookie
HTTP請求報由於並修改任何前指定Set-Cookie報創建新報我稱addCookie
非setCookie同要記住響應報必須任何文檔內容發送客戶端前設置
六、cookie讀取
1.調用request.getCookie
要獲取瀏覽器發送cookie需要調用HttpServletRequestgetCookies調用返Cookie象數組應由HTTP請求Cookie報輸入值
2.數組進行循環調用每cookiegetName直找興趣cookie止
cookie與主機(域)相關非servlet或JSP頁面盡管servlet能發送單cookie能許相關cookie
例:
String cookieName = userID;
Cookie cookies[] = request.getCookies();
if (cookies!=null){
for(int i=0;i
Cookie
cookie = cookies[i];
if (cookieName.equals(cookie.getName())){
doSomethingWith(cookie.getValue());
}
}
}
七、何使用cookie檢測初訪者
A.調用HttpServletRequest.getCookies()獲取Cookie數組
B.循環檢索指定名字cookie否存及應值否確
C.則退循環並設置區別標識
D.根據區別標識判斷用戶否初訪者進行同操作
八、使用cookie檢測初訪者見錯誤
能僅僅cookie數組存特定數據項認用戶初訪者cookie數組null客戶能初訪者能由於用戶cookie刪除或禁用造結
 
 數組非null,顯示客戶曾經網站或域並能說明曾經訪問servlet其servlet、JSP頁面及
非Java Web應用都設置cookie依據路徑設置其任何cookie都能返給用戶瀏覽器
確做判斷cookie數組否空且否存指定Cookie象且值確
九、使用cookie屬性注意問題
屬性伺服器發送瀏覽器報部;屬於由瀏覽器返給伺服器報 
除名稱值外cookie屬性適用於伺服器輸客戶端cookie;伺服器端自於瀏覽器cookie並沒設置些屬性 
 
 要期望通request.getCookiescookie使用屬性意味著能僅僅通設置cookie效
發隨輸入數組查找適cookie,讀取值修改並存Cookie實現斷改變cookie值
十、何使用cookie記錄各用戶訪問計數
1.獲取cookie數組專門用於統計用戶訪問數cookie值
2.值轉換int型
3.值加1並用原名稱重新創建Cookie象
4.重新設置效
5.新cookie輸
十、session同環境同含義
session文經翻譯其本含義指始終系列作/消息比打電拿起電撥號掛斷電間系列程稱session
session詞與網路協議相關聯往往隱含面向連接/或保持狀態兩含義
sessionWeb發環境語義新擴展含義指類用客戶端與伺服器端間保持狀態解決案候Session用指種解決案存儲結構
十二、session機制
session機制種伺服器端機制伺服器使用種類似於散列表結構(能使用散列表)保存信息

程序需要某客戶端請求創建session候伺服器首先檢查客戶端請求否包含session標識-稱session
id,已經包含session id則說明前已經客戶創建session伺服器按照session
idsession檢索使用(檢索能新建種情況能現服務端已經刪除該用戶應session象用戶
請求URL面附加JSESSION參數)
客戶請求包含session id則客戶創建session並且與session相關聯session idsession id本響應返給客戶端保存
十三、保存session id幾種式
A.保存session id式採用cookie交互程瀏覽器自按照規則標識發送給伺服器
B.
由於cookie禁止必須其機制便cookie禁止仍能夠session
id傳遞伺服器經採用種技術叫做URL重寫session
id附加URL路徑面附加式兩種種作URL路徑附加信息另種作查詢字元串附加URL面網路整交互程始終
保持狀態必須每客戶端能請求路徑面都包含session
id
C.另種技術叫做表單隱藏欄位伺服器自修改表單添加隱藏欄位便表單提交能夠session id傳遞伺服器
十四、session候創建
見錯誤session客戶端訪問創建事實直某server端程序(Servlet)調用HttpServletRequest.getSession(true)語句才創建
十五、session何刪除
session列情況刪除:
A.程序調用HttpSession.invalidate()
B.距離收客戶端發送session id間間隔超session效間
C.伺服器進程停止
再注意關閉瀏覽器使存儲客戶端瀏覽器內存session cookie失效使伺服器端session象失效

5、redis 緩存伺服器 怎麼給外部系統用

  Redis介紹
Redis本質上一個Key/Value資料庫,與Memcached類似的NoSQL型資料庫,但是他的數據可以持久化的保存在磁碟上,解決了服務重啟後數據不丟失的問題,他的值可以是string(字元串)、list(列表)、sets(集合)或者是ordered sets(被排序的集合),所有的數據類型都具有push/pop、add/remove、執行服務端的並集、交集、兩個sets集中的差別等等操作,這些操作都是具有原子性的,Redis還支持各種不同的排序能力
Redis 2.0更是增加了很多新特性,如:提升了性能、增加了新的數據類型、更少的利用內存(AOF和VM)
Redis支持絕大部分主流的開發語言,如:C、Java、C#、PHP、Perl、Python、Lua、Erlang、Ruby等等
官網:http://code.google.com/p/redis/

Redis性能
根據Redis官方的測試結果:在50個並發的情況下請求10w次,寫的速度是110000次/s,讀的速度是81000次/s
地址:http://code.google.com/p/redis/wiki/Benchmarks

一、安裝過程:
最新穩定版,Redis 2.0.4 stable
wget http://redis.googlecode.com/files/redis-2.6.7.tar.gz (其他版本到官網下載即可)
tar zxf redis-2.6.7.tar.gz
cd redis-2.6.7
與其它軟體不同的是,不需要configure。
make
裝完了。

創建一個目錄
mkdir /usr/local/redis2
cd src
cp redis-server redis-benchmark redis-cli ../redis.conf /usr/local/redis2

二、啟動與停止:
cd /usr/local/redis2
啟動 ./redis-server > /dev/null & 或者 ./redis-server redis.conf 或者 ./redis-server redis.conf 1>log.log 2>errlog.log (1為標准輸出,2為錯誤輸出)

停止 ./redis-cli shutdown
客戶端連接 ./redis-cli

三、測試:

存值:
./redis-cli set hx value
取值:
./redis-cli get hx

> quit
退出連接
> dbsize
(integer) 12
當前資料庫中key的數量
> info
伺服器基本信息
monitor
實時轉儲收到的請求
config get
獲取伺服器的參數配置
flushdb
清空當前資料庫
flushall
清除所有資料庫

四、附註
redis.conf配置文件:
引用
#是否作為守護進程運行
daemonize yes
#配置pid的存放路徑及文件名,默認為當前路徑下
pidfile redis.pid
#Redis默認監聽埠
port 6379
#客戶端閑置多少秒後,斷開連接
timeout 300
#日誌顯示級別
loglevel verbose
#指定日誌輸出的文件名,也可指定到標准輸出埠
logfile stdout
#設置資料庫的數量,默認連接的資料庫是0,可以通過select N來連接不同的資料庫
databases 16
#保存數據到disk的策略
#當有一條Keys數據被改變是,900秒刷新到disk一次
save 900 1
#當有10條Keys數據被改變時,300秒刷新到disk一次
save 300 10
#當有1w條keys數據被改變時,60秒刷新到disk一次
save 60 10000
#當mp .rdb資料庫的時候是否壓縮數據對象
rdbcompression yes
#mp資料庫的數據保存的文件名
dbfilename mp.rdb
#Redis的工作目錄
dir /home/falcon/redis-2.0.0/
########### Replication #####################
#Redis的復制配置
# slaveof <masterip> <masterport>
# masterauth <master-password>

############## SECURITY ###########
# requirepass foobared

############### LIMITS ##############
#最大客戶端連接數
# maxclients 128
#最大內存使用率
# maxmemory <bytes>

########## APPEND ONLY MODE #########
#是否開啟日誌功能
appendonly no
# 刷新日誌到disk的規則
# appendfsync always
appendfsync everysec
# appendfsync no
################ VIRTUAL MEMORY ###########
#是否開啟VM功能
vm-enabled no
# vm-enabled yes
vm-swap-file logs/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
############# ADVANCED CONFIG ###############
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
#是否重置Hash表
activerehashing yes

6、兩台伺服器,一個放程序的,一個放資料庫換季,redis裝在哪個伺服器上好

應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入mysql,此種情況存在的問題主要是如何保證mysql與redis的數據同步,二者數據同步的關鍵在於mysql資料庫中
主鍵,方案是在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫數據時,對redis主鍵自增並進行讀取,若mysql更新
失敗,則需要及時清除緩存及同步redis主鍵。Stringtbname="login";//獲取mysql表主鍵值--redis啟動時
longid=MySQL.getID(tbname);//設置redis主鍵值--redis啟動時
redisService.set(tbname,String.valueOf(id));System.out.println(id);longl=redisService.incr(tbname);
System.out.println(l);Loginlogin=newLogin();login.setId(l);
login.setName("redis");redisService.hmset(String.valueOf(login.getId()),login);booleanb=MySQL.insert("insertintologin(id,name)values("+login.getId()+",'"+login.getName()+"')");
/****隊列處理器更新mysql失敗:**清除緩存數據,同時主鍵值自減*/if(!b)
{redisService.delKeyAndDecr(tbname,"Login:"+String.valueOf(login.getId()));}System.out.println(redisService.exists("Login:"+String.valueOf(login.getId())));System.out.println(redisService.get(tbname))

7、游戲伺服器使用MongoDB作為資料庫,還有必要使用Redis緩存嗎

MongoDB不多說,不是一個類型copy的東西,Redis相對Memcached來說功能和特性上的優勢已經很明顯了。而對於性能,Redis作者的說法是平均到單個核上的性能,在單條數據不大的情況下Redis更好。為什麼這么說呢,理由就是Redis是單線程運行的。因為是單線程運行,所以和Memcached的多線程相比,整體性能肯定會偏低。因為是單線程運行,所以IO是串列化的,網路IO和內存IO,因此當單條數據太大時,由於需要等待一個命令的所有IO完成才能進行後續的命令,所以性能會受影響。

8、游戲伺服器使用MongoDB作為資料庫,還有必要使用Redis緩存嗎

相比memcached:

1、redis具有持久化機制,可以定期將內存中的數據持久化到硬碟上回。

2、redis具備binlog功能,可以將所有操作寫入日誌答,當redis出現故障,可依照binlog進行數據恢復。

3、redis支持virtual memory,可以限定內存使用大小,當數據超過閾值,則通過類似lru的演算法把內存中的最不常用數據保存到硬碟的頁面文件中。

4、redis原生支持的數據類型更多,使用的想像空間更大。

5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在負載非常高需要水平擴展時使用。我們還沒有用到這方面的功能,一般的項目,單機足夠支撐並發了。redis 3.0將推出cluster,功能更加強大。

6、redis更多優點,請移步官方網站查詢。

9、web伺服器怎麼使用redis分步式緩存

Redis復制流程概述
Redis的復制功能是完全建立在之前我們討論過的基於內存快照的持久化策略基礎上的,也就是說無論你的持久化策略選擇的是什麼,只要用到了Redis的復制功能,就一定會有內存快照發生,那麼首先要注意你的系統內存容量規劃,原因可以參考我上一篇文章中提到的Redis磁碟IO問題。
Redis復制流程在Slave和Master端各自是一套狀態機流轉,涉及的狀態信息是:
Slave 端:
REDIS_REPL_NONEREDIS_REPL_CONNECTREDIS_REPL_CONNECTED
Master端:
REDIS_REPL_WAIT_BGSAVE_STARTREDIS_REPL_WAIT_BGSAVE_ENDREDIS_REPL_SEND_BULKREDIS_REPL_ONLINE
整個狀態機流程過程如下:
Slave端在配置文件中添加了slave of指令,於是Slave啟動時讀取配置文件,初始狀態為REDIS_REPL_CONNECT。
Slave端在定時任務serverCron(Redis內部的定時器觸發事件)中連接Master,發送sync命令,然後阻塞等待master發送回其內存快照文件(最新版的Redis已經不需要讓Slave阻塞)。
Master端收到sync命令簡單判斷是否有正在進行的內存快照子進程,沒有則立即開始內存快照,有則等待其結束,當快照完成後會將該文件發送給Slave端。
Slave端接收Master發來的內存快照文件,保存到本地,待接收完成後,清空內存表,重新讀取Master發來的內存快照文件,重建整個內存表數據結構,並最終狀態置位為 REDIS_REPL_CONNECTED狀態,Slave狀態機流轉完成。
Master端在發送快照文件過程中,接收的任何會改變數據集的命令都會暫時先保存在Slave網路連接的發送緩存隊列里(list數據結構),待快照完成後,依次發給Slave,之後收到的命令相同處理,並將狀態置位為 REDIS_REPL_ONLINE。

整個復制過程完成,流程如下圖所示:

Redis復制機制的缺陷
從上面的流程可以看出,Slave從庫在連接Master主庫時,Master會進行內存快照,然後把整個快照文件發給Slave,也就是沒有象MySQL那樣有復制位置的概念,即無增量復制,這會給整個集群搭建帶來非常多的問題。
比如一台線上正在運行的Master主庫配置了一台從庫進行簡單讀寫分離,這時Slave由於網路或者其它原因與Master斷開了連接,那麼當Slave進行重新連接時,需要重新獲取整個Master的內存快照,Slave所有數據跟著全部清除,然後重新建立整個內存表,一方面Slave恢復的時間會非常慢,另一方面也會給主庫帶來壓力。
所以基於上述原因,如果你的Redis集群需要主從復制,那麼最好事先配置好所有的從庫,避免中途再去增加從庫。
Cache還是Storage
在我們分析過了Redis的復制與持久化功能後,我們不難得出一個結論,實際上Redis目前發布的版本還都是一個單機版的思路,主要的問題集中在,持久化方式不夠成熟,復制機制存在比較大的缺陷,這時我們又開始重新思考Redis的定位:Cache還是Storage?
如果作為Cache的話,似乎除了有些非常特殊的業務場景,必須要使用Redis的某種數據結構之外,我們使用Memcached可能更合適,畢竟Memcached無論客戶端包和伺服器本身更久經考驗。
如果是作為存儲Storage的話,我們面臨的最大的問題是無論是持久化還是復制都沒有辦法解決Redis單點問題,即一台Redis掛掉了,沒有太好的辦法能夠快速的恢復,通常幾十G的持久化數據,Redis重啟載入需要幾個小時的時間,而復制又有缺陷,如何解決呢?
Redis可擴展集群搭建1. 主動復制避開Redis復制缺陷。
既然Redis的復制功能有缺陷,那麼我們不妨放棄Redis本身提供的復制功能,我們可以採用主動復制的方式來搭建我們的集群環境。
所謂主動復制是指由業務端或者通過代理中間件對Redis存儲的數據進行雙寫或多寫,通過數據的多份存儲來達到與復制相同的目的,主動復制不僅限於用在Redis集群上,目前很多公司採用主動復制的技術來解決MySQL主從之間復制的延遲問題,比如Twitter還專門開發了用於復制和分區的中間件gizzard(https://github.com/twitter/gizzard) 。
主動復制雖然解決了被動復制的延遲問題,但也帶來了新的問題,就是數據的一致性問題,數據寫2次或多次,如何保證多份數據的一致性呢?如果你的應用對數據一致性要求不高,允許最終一致性的話,那麼通常簡單的解決方案是可以通過時間戳或者vector clock等方式,讓客戶端同時取到多份數據並進行校驗,如果你的應用對數據一致性要求非常高,那麼就需要引入一些復雜的一致性演算法比如Paxos來保證數據的一致性,但是寫入性能也會相應下降很多。
通過主動復制,數據多份存儲我們也就不再擔心Redis單點故障的問題了,如果一組Redis集群掛掉,我們可以讓業務快速切換到另一組Redis上,降低業務風險。
2. 通過presharding進行Redis在線擴容。
通過主動復制我們解決了Redis單點故障問題,那麼還有一個重要的問題需要解決:容量規劃與在線擴容問題。
我們前面分析過Redis的適用場景是全部數據存儲在內存中,而內存容量有限,那麼首先需要根據業務數據量進行初步的容量規劃,比如你的業務數據需要100G存儲空間,假設伺服器內存是48G,那麼根據上一篇我們討論的Redis磁碟IO的問題,我們大約需要3~4台伺服器來存儲。這個實際是對現有業務情況所做的一個容量規劃,假如業務增長很快,很快就會發現當前的容量已經不夠了,Redis裡面存儲的數據很快就會超過物理內存大小,那麼如何進行Redis的在線擴容呢?
Redis的作者提出了一種叫做presharding的方案來解決動態擴容和數據分區的問題,實際就是在同一台機器上部署多個Redis實例的方式,當容量不夠時將多個實例拆分到不同的機器上,這樣實際就達到了擴容的效果。
拆分過程如下:
在新機器上啟動好對應埠的Redis實例。
配置新埠為待遷移埠的從庫。
待復制完成,與主庫完成同步後,切換所有客戶端配置到新的從庫的埠。
配置從庫為新的主庫。
移除老的埠實例。
重復上述過程遷移好所有的埠到指定伺服器上。

以上拆分流程是Redis作者提出的一個平滑遷移的過程,不過該拆分方法還是很依賴Redis本身的復制功能的,如果主庫快照數據文件過大,這個復制的過程也會很久,同時會給主庫帶來壓力。所以做這個拆分的過程最好選擇為業務訪問低峰時段進行。
Redis復制的改進思路
我們線上的系統使用了我們自己改進版的Redis,主要解決了Redis沒有增量復制的缺陷,能夠完成類似Mysql Binlog那樣可以通過從庫請求日誌位置進行增量復制。
我們的持久化方案是首先寫Redis的AOF文件,並對這個AOF文件按文件大小進行自動分割滾動,同時關閉Redis的Rewrite命令,然後會在業務低峰時間進行內存快照存儲,並把當前的AOF文件位置一起寫入到快照文件中,這樣我們可以使快照文件與AOF文件的位置保持一致性,這樣我們得到了系統某一時刻的內存快照,並且同時也能知道這一時刻對應的AOF文件的位置,那麼當從庫發送同步命令時,我們首先會把快照文件發送給從庫,然後從庫會取出該快照文件中存儲的AOF文件位置,並將該位置發給主庫,主庫會隨後發送該位置之後的所有命令,以後的復制就都是這個位置之後的增量信息了。

Redis與MySQL的結合
目前大部分互聯網公司使用MySQL作為數據的主要持久化存儲,那麼如何讓Redis與MySQL很好的結合在一起呢?我們主要使用了一種基於MySQL作為主庫,Redis作為高速數據查詢從庫的異構讀寫分離的方案。
為此我們專門開發了自己的MySQL復制工具,可以方便的實時同步MySQL中的數據到Redis上。

(MySQL-Redis 異構讀寫分離)
總結:
Redis的復制功能沒有增量復制,每次重連都會把主庫整個內存快照發給從庫,所以需要避免向在線服務的壓力較大的主庫上增加從庫。
Redis的復制由於會使用快照持久化方式,所以如果你的Redis持久化方式選擇的是日誌追加方式(aof),那麼系統有可能在同一時刻既做aof日誌文件的同步刷寫磁碟,又做快照寫磁碟操作,這個時候Redis的響應能力會受到影響。所以如果選用aof持久化,則加從庫需要更加謹慎。
可以使用主動復制和presharding方法進行Redis集群搭建與在線擴容。

10、阿里雲資料庫redis怎麼配置

根據下面步驟創建適應業務需求的雲資料庫Redis版實例。

使用下列方法中任意一種打開購內買頁:容

打開雲資料庫Redis版產品首頁,單擊立即購買。

說明 如果尚未登錄阿里雲賬號,單擊立即購買後需要先使用阿里雲賬號和密碼登錄。

登錄Redis管理控制台,單擊右上角的創建實例。

設置以下參數。

選擇密碼設置方式。

立即設置:在下方的輸入密碼區域設置密碼。

稍後設置:創建實例後再修改密碼。

設置實例名稱、購買數量,如果創建包年包月實例,還需設置時長。

在確認訂單頁,閱讀《雲資料庫KVStore版服務協議》,確認接受後在服務協議前的選框中單擊勾選。

單擊去開通。

因為這方面內容較多,這里也寫不開那麼多內容,所以你可以留言或到我的博客上搜索相關內容,老魏有寫過教程,還不止一篇,都挺詳細的內容,可以幫助你入門。

與redis數據保存伺服器相關的知識