1. 程式人生 > >Redis 緩存數據庫

Redis 緩存數據庫

redis

Redis 緩存數據庫

技術分享圖片

第1章 Redis簡介:

redis是使用C語言編寫的開源的,支持網絡,基於內存,可持久性的鍵值對存儲數據庫,20135月之前,Redis是最流行的鍵值對存儲數據庫

Redis采用內存數據集,支持多種數據類型

官方網站:https://redis.io

官方各版本下載地址:http://download.redis.io/releases/

Redis 中文命令參考:http://redisdoc.com

中文網站1http://redis.cn

中文網站2http://www.redis.net.cn

1.1 Redis特性:

1. 高速讀寫,數據類型豐富

2. 支持持久化,多種內存分配及回收策略

3. 支持弱事務,消息隊列,消息訂閱

4. 支持高可用,支持分布式分片集群

1.2 企業緩存數據庫解決方案對比:

memcached:

1. 優點 : 高性能讀寫,單一數據類型,支持客戶端式分布式集群,一致性hash多核結構,多線程讀寫性能高

2. 缺點 : 無持久化,節點故障可能出現緩存穿透,分布式需要客戶端實現,跨房數據同步困難,架構擴容復雜

Redis:

1. 優點 : 高性能讀寫,多數據類型支持,數據持久化,高可用架構,支持定義虛擬內存,支持分布式分片集群,單線程讀寫性能極高

2. 缺點 : 多線程讀寫比memcached

Tair:

1.

優點 : 高性能讀寫,支持三種存儲引擎(ddb;rdb;ldb)支持高可用,支持分布式分片集群,支撐了幾乎所有淘寶業務的緩存

2. 缺點 : 單機情況下,讀寫性能較其他兩種產品較慢

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

1.1 Redis應用場景:

數據高速緩存,web會話緩存

排行榜應用

消息隊列,發布訂閱

技術分享圖片

第1章 Redis安裝部署:

1.1 環境說明:

[root@gitlab ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@gitlab ~]# uname -r
3.10.0-327.el7.x86_64
[root@gitlab ~]# getenforce
Disabled
[root@gitlab ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

1.2 下載地址:

wget http://download.redis.io/releases/redis-3.2.10.tar.gz

1.3 安裝redis:

[root@gitlab application]# tar xzf  redis-3.2.10.tar.gz
[root@gitlab application]# ll
total 1520
drwxrwxr-x 6 root root    4096 Jul 28  2017 redis-3.2.10
-rw-r--r-- 1 root root 1550261 Jul 29  2017 redis-3.2.10.tar.gz
[root@gitlab application]# mv redis-3.2.10 redis
[root@gitlab application]# mv redis-3.2.10.tar.gz /server/tools/
[root@gitlab application]# ll
total 4
drwxrwxr-x 6 root root 4096 Jul 28  2017 redis
[root@gitlab application]# cd redis/
[root@gitlab redis]# make

至此安裝完成

1.4 啟動第一個Redis實例

[root@gitlab redis]# cd src/
[root@gitlab src]# ./redis-server &

第2章 Redis操作

2.1 Redis配置文件:


[root@gitlab src]# mkdir -p /data/6379
[root@gitlab src]# vim /etc/redis.conf
daemonize yes
port 6379
logfile /data/6379/redis.log
dbfilename dump.rdb
dir /data/6379
protected-mode no          保護模式,是否開啟本地訪問
bind 10.0.0.63          指定redis監聽地址,可以通過這個地址進行網絡連接到數據庫


2.1.1 在查詢配置:

10.0.0.63:6379> CONFIG GET *
  1) "dbfilename"
  2) "dump.rdb"

2.1.2 在線修改配置:

10.0.0.63:6379> CONFIG SET requirepass 123
OK
10.0.0.63:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required.
10.0.0.63:6379> auth
(error) ERR wrong number of arguments for 'auth' command
10.0.0.63:6379> auth 123
OK
10.0.0.63:6379> CONFIG GET requirepass
1) "requirepass"
2) "123"
10.0.0.63:6379>

第3章 Redis數據持久化

3.1 什麽是持久化?

緩存數據庫在宕機或者重啟後,還可以重新構造內存中的數據,持久保持數據

3.2 持久化的種類:

RDB持久化:

基於快照的持久化功能,保存一個時刻的數據狀態,企業中常用的持久化功能,一般還可以以用作備份

AOF持久化:

只追加日誌模式,會將redis一段時間內的所有修改命令記錄下來,屬於比較安全的一種持久化方式

3.3 RDB持久化的優缺點:

3.3.1 優點:

1. RDB是一個非常緊湊的文件,它保存了Redis在某個時間點上的數據集,這種文件非常適用於進行備份,比如說你可以在最近的24小時內,每小時備份一次RDB文件,並且在每個月的每一天,也備份一個RDB文件,這樣,即使遇到問題,也可以隨時將數據集還原到不同的版本

2. RDB非常適用於災難恢復:它只有一個文件,並且內容都非常緊湊,可以將它傳送到別的數據中心

3. RDB可以最大化Redis的性能,父進程在保存RDB文件時唯一要做的就是fork出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤IO操作

4. RDB在恢復大數據集時的速度比AOF

3.3.2 缺點:

1. 如果你需要盡量避免在服務器故障時丟失數據,那麽RDB不適用,因為RDB文件需要保存整個數據集的狀態,所以這並不是一個輕松的操作,因此你可能至少5分鐘才保存一次文件,在這種情況下,一旦發生故障,你就可能會丟失幾分鐘的數據

2. 每次保存RDB的時候,Redis都要fork出一個子進程,並由子進程來進行實際的持久化工作,在數據集比較龐大時,fork可能會非常耗時,造成服務器在某某毫秒內停止處理客戶端,如果數據集非常龐大,並且CPU時間非常緊張的話,那麽這種停止時間可能會長達整整一秒,雖然AOF重寫也需要進行fork,但無論AOF重寫的執行間隔有多長,數據的耐久性都不會有任何損失

3.4 AOF持久化的優缺點:

優點:

1. 使用AOF會讓你的Redis更加耐久,你可以使用不同的fsync策略,fsync,每秒fsync,每次寫的時候fsync,使用默認的每秒fsync策略,Redis的性能依然很好,fsync是由後臺線程進行處理的,主線程會盡力處理客戶端請求,一旦出現故障,你最多丟死1秒的數據

2. Redis可以在AOF文件體積變的過大時,自動的在後臺對AOF進行重寫,重寫後端額AOF文件包含了恢復當前數據集所需的最小命令集合,整個重寫操作是絕對安全的,因為Redis在創建AOF文件的過程中,會繼續將命令追加到現有的AOF文件裏面,即使重寫過程中發生宕機,現有的AOF文件也不會丟失

3. 一旦新AOF文件創建完畢,Redis就會從舊AOF文件切換到新的AOF文件,並開始對AOF文件進行追加操作

4. AOF文件有序的保存了對數據庫執行的所有寫操作,這些寫入操作以Redis協議的格式保存,因此AOF文件的內容非常同意被人讀懂,對文件進行分析,也很輕松,導出AOF文件也非常簡單,舉個例子,如果你不小心執行了flushall命令,但只要AOF文件未被重寫,那麽只要停止服務器,移除AOF文件末尾的flushall命令,並重啟Redis,就可以將數據集恢復到flushall執行之前的狀態

缺點:

1. 對於相同的數據集來說,AOF文件的體積通常要大於RDB文件的體積,根據所使用的fsync策略,AOF的速度可能會慢於RDB

2. 在一般情況下,每秒fsync的性能依然非常高,而關閉fsync可以讓AOF的速度和RDB一樣快,即使在高負荷之下也是如此,不顧在處理巨大的寫入載入時,RDB可以提供更有保證的最大延遲時間

3. AOF在過去曾經發生過這樣的bug,因為個別命令的原因,導致AOF文件在重新載入時,無法將數據集恢復成保存時的原樣

3.5 如何選擇使用哪種持久化方式?

一般來說,如果想要達到很高的數據安全性,應該同時使用兩種持久化功能

如果你非常關心數據的安全,並且可以承受數分鐘內的數據丟失,建議使用RDB

有很多用戶只使用AOF,但是這種方式並不推薦,因為定時生成的RDB快照非常便於數據庫進行備份,並且RDB恢復數據的速度要比AOF快很多,而且好友AOFbug問題

3.6 快照實現持久化:

在默認情況下, Redis 將數據庫快照保存在名字為 dump.rdb的二進制文件中。你可以對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數據集。

你也可以通過調用 SAVE或者 BGSAVE 手動讓 Redis 進行數據集保存操作。

比如說, 以下設置會讓 Redis 在滿足“ 60 秒內有至少有 1000 個鍵被改動”這一條件時, 自動保存一次數據集: save 60 1000

這種持久化方式被稱為快照 snapshotting.

3.6.1 Redis 需要保存 dump.rdb 文件時, 服務器執行以下操作:

Redis 緩存數據庫