Redis官網 http://redis.iohtml
中文手冊 http://www.cnblogs.com/stephen-liu74/archive/2012/02/27/2370212.html
linux
1、 下載redis最新版c++
下載 http://redis.io/downloadredis
目前最新版 redis3.2.11
shell
cd /usr/local/src數據庫
wget http://download.redis.io/releases/redis-3.2.11.tar.gzcentos
2、 編譯安裝redis (詳情可見源碼根目錄的 README)緩存
tar -zxvf redis-3.2.11.tar.gz bash
cd redis-3.2.11服務器
make
make命令執行完成後,會在src目錄下生成6個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump、redis-sentinel,它們的做用以下:
redis-server:Redis服務器的daemon啓動程序
redis-cli:Redis命令行操做工具。固然,你也能夠用telnet根據其純文本協議來操做
redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-check-aof:更新日誌檢查
redis-check-dump:用於本地數據庫檢查
redis-sentinel:集羣管理工具
安裝:
make PREFIX=/usr/local/redis install
測試
make test
依賴 tcl,若沒有安裝請先安裝
yum -y install tcl tcl-devel
* make 編譯時出錯:server.c:xxxx:xx: error: ‘xxxxxxxx’ has no member named ‘xxxxx’
這主要是gcc版本問題,能夠升級爲gcc 9
查看gcc版本:
gcc -v
// centos 8的默認版本爲gcc 4.8.5
升級爲gcc 9
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash // 這時是當前shell會話的gcc使用新版本,退出shell或重啓就會恢復原系統gcc版本
使用全部shell會話都使用gcc 9
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
如下其餘版本同理,修改devtoolset版本號便可。
3、 配置 Redis
mkdir -p /usr/local/redis/etc /usr/local/redis/log /usr/local/redis/data #建立配置文件、日誌文件、數據庫保存目錄
cp /usr/local/src/redis-3.2.11/redis.conf /usr/local/redis/etc/
touch /usr/local/redis/log/redis.log
1. redis.conf 配置參數:
#是否做爲守護進程運行
daemonize yes
#如之後臺進程運行,則需指定一個pid,默認爲/var/run/redis.pid
pidfile /var/run/redis.pid
#綁定主機IP,默認值爲127.0.0.1
bind 0.0.0.0
#Redis默認監聽端口
port 6379
#客戶端閒置多少秒後,斷開鏈接,默認爲300(秒)
timeout 300
#日誌記錄等級,有4個可選值,debug,verbose,notice(默認值),warning
loglevel notice
#指定日誌輸出的文件名,默認值爲stdout,也可設爲/dev/null屏蔽日誌
logfile "/usr/local/redis/log/redis.log"
#可用數據庫數,默認值爲16,默認數據庫爲0
databases 16
#保存數據到disk的策略
#當有一條Keys數據被改變是,900秒刷新到disk一次
save 900 1
#當有10條Keys數據被改變時,300秒刷新到disk一次
save 300 10
#當有1w條keys數據被改變時,60秒刷新到disk一次
save 60 10000
#當dump .rdb數據庫的時候是否壓縮數據對象
rdbcompression yes
#本地數據庫文件名,默認值爲dump.rdb
dbfilename dump.rdb
#本地數據庫存放路徑,默認值爲 ./
dir /usr/local/redis/data
# 設置PID文件目錄
pidfile /usr/local/redis/redis.pid
########### Replication #####################
#Redis的複製配置
# slaveof <masterip> <masterport> 當本機爲從服務時,設置主服務的IP及端口
# masterauth <master-password> 當本機爲從服務時,設置主服務的鏈接密碼
#鏈接密碼
requirepass foobared
#最大客戶端鏈接數
maxclients 30000
#最大內存使用設置,達到最大內存設置後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,任到達最大內存設置,將沒法再進行寫入操做。
# maxmemory <bytes>
#是否在每次更新操做後進行日誌記錄,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認值爲no
appendonly no
#更新日誌文件名,默認值爲appendonly.aof
#appendfilename
#更新日誌條件,共有3個可選值。no表示等操做系統進行數據緩存同步到磁盤,always表示每次更新操做後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次(默認值)。
# appendfsync always
appendfsync everysec
# appendfsync no
################ VIRTUAL MEMORY ###########
#是否開啓VM功能,默認值爲no
vm-enabled no
# vm-enabled yes
#虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
vm-swap-file /tmp/redis.swap
# 將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的 (Redis的索引數據就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0。
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
注意:Redis官方文檔對VM的使用提出了一些建議:
當你的key很小而value很大時,使用VM的效果會比較好.由於這樣節約的內存比較大.
當你的key不小時,能夠考慮使用一些很是方法將很大的key變成很大的value,好比你能夠考慮將key,value組合成一個新的value.
最好使用linux ext3 等對稀疏文件支持比較好的文件系統保存你的swap文件.
vm-max-threads這個參數,能夠設置訪問swap文件的線程數,設置最好不要超過機器的核數.若是設置爲0,那麼全部對swap文件的操做都是串行的.可能會形成比較長時間的延遲,可是對數據完整性有很好的保證.
2. 調整系統內核參數
若是內存狀況比較緊張的話,須要設定內核參數:
echo 1 > /proc/sys/vm/overcommit_memory
這裏說一下這個配置的含義:/proc/sys/vm/overcommit_memory
該文件指定了內核針對內存分配的策略,其值能夠是0、一、2。
0,表示內核將檢查是否有足夠的可用內存供應用進程使用;若是有足夠的可用內存,內存申請容許;不然,內存申請失敗,並把錯誤返回給應用進程。
1,表示內核容許分配全部的物理內存,而無論當前的內存狀態如何。
2,表示內核容許分配超過全部物理內存和交換空間總和的內存
Redis 在dump數據的時候,會fork出一個子進程,理論上child進程所佔用的內存和parent是同樣的,好比parent佔用的內存爲 8G,這個時候也要一樣分配8G的內存給child, 若是內存沒法負擔,每每會形成redis服務器的down機或者IO負載太高,效率降低。因此這裏比較優化的內存分配策略應該設置爲 1(表示內核容許分配全部的物理內存,而無論當前的內存狀態如何)
四. 運行 Redis
添加環境變量
echo "export PATH=$PATH:/usr/local/redis/bin" >> /etc/profile
. /etc/profile
1. 運行服務
redis-server /etc/redis/redis.conf
便可在後臺啓動redis服務,確認運行了以後,能夠用redis-benchmark命令測試看看,還能夠經過redis-cli命令實際操做一下,好比:
redis-cli set foo bar
OK
redis-cli get foo
bar
2. 關閉服務
redis-cli shutdown
若是端口變化能夠指定端口:
redis-cli -p 6380 shutdown
3. 保存/備份
數據備份能夠經過按期備份該文件實現。
由於redis是異步寫入磁盤的,若是要讓內存中的數據立刻寫入硬盤能夠執行以下命令:
redis-cli save 或者 redis-cli -p 6380 save(指定端口)
注意,以上部署操做須要具有必定的權限,好比複製和設定內核參數等。
執行redis-benchmark命令時也會將內存數據寫入硬盤。
4. 同步機制
redis實現的同步機制相對簡單,缺乏同步機制常見的check point和校驗機制。
在 運行時,若是master -> slave同步請求轉發被丟棄, slave將沒法恢復該請求的相關信息,直到slave重啓時從master全量加載數據時才能修復。所以,建議使用redis儘可能利用其 key/value和value支持多種類型的特性,存儲一些相對不重要的數據。
五. 設置隨機啓動
vi /etc/init.d/redis #添加如下內容
#!/bin/bash
#
# redis - this script starts and stops the redis-server daemon
#
# chkconfig: - 80 12
# description: Redis is a persistent key-value database
# processname: redis-server
# config: /etc/redis/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
BIN="/usr/local/redis/bin"
CONFIG="/usr/local/redis/etc/redis.conf"
PIDFILE="/usr/local/redis/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
if [ -e $PIDFILE ];then
echo "$desc already running...."
exit 1
fi
echo -n $"Starting $desc: "
daemon $BIN/$prog $CONFIG
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop() {
echo -n $"Stop $desc: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
用這個腳本管理以前,須要先配置下面的內核參數,不然Redis腳本在重啓或中止redis時,可能會報錯,而且不能自動在中止服務前同步數據到磁盤上:
vi /etc/sysctl.conf
vm.overcommit_memory = 1
而後應用生效:
sysctl -p
(調整內存(若是內存狀況比較緊張的話,須要設定內核參數)
echo 1 > /proc/sys/vm/overcommit_memory
說明:
該文件指定了內核針對內存分配的策略,其值能夠是0、一、2。
0 表示內核將檢查是否有足夠的可用內存供應用進程使用;若是有足夠的可用內存,內存申請容許;不然,內存申請失敗,並把錯誤返回給應用進程。
1 表示內核容許分配全部的物理內存,而無論當前的內存狀態如何。
2 表示內核容許分配超過全部物理內存和交換空間總和的內存
)
而後增長服務並開機自啓動:
chmod 755 /etc/init.d/redis
chkconfig redis on
chkconfig --list redis
centos 7 啓動腳本
/usr/lib/systemd/system/redis.service
#####################################
[Unit]
Description=Startup script for the Redis
Documentation=http://redis.io
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/redis/redis.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
####
指定運行用戶,這種狀況,pid文件建議放在 /var/run/redis.pid,由於須要寫入權限
useradd -M -s /sbin/nologin redis
chown -R redis:redis /usr/local/redis/log /usr/local/redis/data pidfile所在目錄
cat /usr/lib/systemd/system/redis.service
###
[Unit]
Description=Startup script for the Redis
Documentation=http://redis.io
After=network.target remote-fs.target nss-lookup.target
[Service]
User=redis
Group=redis
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
###
systemctl enable redis; systemctl start redis