簡介: Redis 是一個開源的,高性能的 key-value 系統,可以用來緩存或存儲數據。 Redis 數據可以持久化,並且支持多種數據類型:字元串(string),列表(list),哈希(hash),集合(set)和有序集合(sorted set)。 能夠對關係型資料庫起到很好的補充作用。它還 ...
簡介:
Redis 是一個開源的,高性能的 key-value 系統,可以用來緩存或存儲數據。
Redis 數據可以持久化,並且支持多種數據類型:字元串(string),列表(list),哈希(hash),集合(set)和有序集合(sorted set)。
能夠對關係型資料庫起到很好的補充作用。它還提供了多種客戶端 Python 、Ruby 、Erlang 、PHP ,可以方便調用。
持久化:
Redis 是一種記憶體資料庫(跟 memcache 類似),在數據存取效率方面很優秀,由於記憶體中的數據時刻面臨丟失的危險,Redis 提供了兩種持久化機制,及時將記憶體中的數據寫入磁碟。
RDB 利用存儲快照的方式把記憶體數據定期寫入磁碟,半持久化
AOF 利用寫日誌的方式(類似 mysql 的 binlog),每執行一條更改 Redis 數據的命令,就寫入到磁碟的一個 aof 文件中
Redis 預設開啟 RDB 模式,關閉 AOF 模式,因為 AOF 更耗資源,但是對數據安全極高,稱為全持久化,按需選擇哪種模式。
主從功能:
為了防止 Redis 磁碟損壞,導致數據丟失,Redis 提供了複製功能,將一個主資料庫的數據自動同步到從資料庫,防止數據丟失。
主從原理:
1、從資料庫啟動後,向主資料庫發送 SYNC 命令
2、主資料庫收到 SYNC 命令後開始保存快照,在此期間所有發給主資料庫的命令都被緩存起來
3、快照保存完後,主資料庫把快照和緩存的命令一起發給從資料庫
4、從資料庫保存主數據發來的快照文件,並依次執行主資料庫發來的緩存命令
在同步過程中,從資料庫不會阻塞,它預設使用同步之前的數據繼續響應客戶端發來的命令
下載地址:https://code.google.com/p/redis/downloads/list
一、安裝 Redis
shell > tar zxf redis-2.6.10.tar.gz shell > cd redis-2.6.10; make; make install
二、調整 Redis
shell > mkdir /usr/local/redis shell > cd !$ shell > cp ../src/redis-2.6.10/redis.conf . shell > cp ../src/redis-2.6.10/src/redis-cli . shell > cp ../src/redis-2.6.10/src/redis-server . shell > cp ../src/redis-2.6.10/src/redis-sentinel . shell > cp ../src/redis-2.6.10/src/redis-benchmark . shell > cp ../src/redis-2.6.10/src/redis-check-aof . shell > cp ../src/redis-2.6.10/src/redis-check-dump .
## redis.conf 主配置文件
## redis-cli 命令行操作工具
## redis-server 啟動程式
## redis-sentinel 集群管理工具
## redis-benchmark 性能測試工具,測試 redis 在當前系統配置下的讀寫性能
## redis-check-aof 更新日誌檢查,--fix 可以修複 log 文件
## redis-check-dump 檢查本地數據文件
三、編輯 redis.conf
shell > mv redis.conf redis.conf.bak shell > vim redis.conf
daemonize yes # 以守護進程方式啟動 pidfile /usr/local/redis/logs/redis.pid # 定義 pid 文件存放路徑 port 6379 # 監聽埠 timeout 300 # 請求超時時間 loglevel debug # 定義日誌級別 logfile /usr/local/redis/logs/redis.log # 定義日誌文件路徑 databases 16 # 啟動資料庫實例數,預設連接的資料庫為 0 ,可以通過 select N 來連接不同的資料庫
# 從記憶體保存數據到磁碟的策略:
save 900 1 # 當有 1 條 keys 數據改變時,900 秒刷新到磁碟一次
save 300 10 # 當有 10 條 keys 數據改變時,300 秒刷新到磁碟一次
save 60 10000 # 當有 1W 條 keys 數據改變時,60 秒刷新到磁碟一次
rdbcompression yes # dump .rdb 資料庫時,是否壓縮數據對象
dbfilename dump.rdb # dump 資料庫時,資料庫保存的文件名
dir /usr/local/redis/data/ # dump 時資料庫保存的路徑
#----------------------------------------------------------------------------------------------------- appendonly no # 是否開啟日誌功能,如果開啟每次操作都會記錄一條日誌,相當於 mysql 的 binlog ,但是會影響效率 #appendfilename appendonly.aof # AOF 文件名稱,預設為 ppendonly.aof #appendfsync everysec # 同步數據到磁碟的規則: #1、 no 不主動寫入磁碟,依賴與系統的寫入,一般 30 秒左右寫入一次,性能最好,但是持久化沒有保證。 #2、 everysec 每秒強制寫入磁碟一次,在性能跟持久化方面折中,推薦使用。 #3、 always 每次收到寫操作就立即強制寫入磁碟,是最有保證的完全持久化,但是速度慢。 #no-appendfsync-on-rewrite yes # 在日誌重寫時,不進行命令追加操作,而只是將其放在緩衝區里,避免與命令的追加造成磁碟 IO 上的衝突 #auto-aof-rewrite-percentage 100 # 當前 AOF 文件的大小是上次日誌重寫得到的 AOF 文件大小的兩倍時,自動啟動新的日誌重寫過程 #auto-aof-rewrite-min-size 64mb # 當前 AOF 文件啟動新的日誌重寫過程的最小值,避免剛啟動 redis 時由於文件較小導致頻繁重寫 #-----------------------------------------------------------------------------------------------------
## 設置在向客戶端應答時,是否把較小的包合併為一個包發送
四、啟動 Redis
shell > echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf shell > sysctl vm.overcommit_memory=1
## 調整內核參數,如果不調整 redis 會報一個警告信息
shell > mkdir /usr/local/redis/data # 創建 data 目錄 shell > mkdir /usr/local/redis/logs # 創建 logs 目錄 shell > redis-server /usr/local/redis/redis.conf # 啟動 redis ,需要指定配置文件路徑 shell > netstat -anpt | grep redis tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1176/redis-server
五、測試 Redis
-----------------------------------------------------------------------------------------------------
shell > redis-cli redis 127.0.0.1:6379> set password 123 OK redis 127.0.0.1:6379> get password "123" redis 127.0.0.1:6379> quit
## 登陸本機的 redis ,寫入 keys/value ,讀取 keys
shell > ls /usr/local/redis/data/
## 沒有生成 dump.rdb ,因為半持久化的 save 規則沒有觸發
shell > redis-cli shutdown shell > ls /usr/local/redis/data/ dump.rdb
## 當關閉 redis 的時候,會將記憶體中的數據保存為 dump.rdb
shell > redis-server /usr/local/redis/redis.conf shell > redis-cli redis 127.0.0.1:6379> get password "123" redis 127.0.0.1:6379> quit
## redis 啟動後從 dump.rdb 文件中讀取數據,所以數據依然存在
-----------------------------------------------------------------------------------------------------
shell > rm -rf /usr/local/redis/data/* shell > redis-cli redis 127.0.0.1:6379> set password abcdef OK redis 127.0.0.1:6379> get password "abcdef" redis 127.0.0.1:6379> quit shell > kill -9 `cat /usr/local/redis/logs/redis.pid`
## 當不是正常關閉 redis 時,如 kill -9 、redis 伺服器突然宕機等
shell > ls /usr/local/redis/data/
## 是不會將記憶體中的數據同步到磁碟的,也就是說不會生成 dump.rdb 文件
shell > redis-server /usr/local/redis/redis.conf shell > redis-cli redis 127.0.0.1:6379> get password (nil) redis 127.0.0.1:6379> quit
## 這時啟動 redis ,發現數據丟失了 。如果不能忍受這種丟失可以啟動 AOF 全持久化。
-----------------------------------------------------------------------------------------------------
參考文獻:
http://blog.csdn.net/qtyl1988/article/details/39553339