介紹
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
編譯安裝
下載redis
############目前最新穩定版########## [root@redis ~]# wget http://download.redis.io/releases/redis-2.8.19.tar.gz
解壓縮redis
[root@redis ~]# tar xzf redis-2.8.19.tar.gz
編譯redis
redis的編譯非常簡單,已經有現成的Makefile文件,直接運行make命令即可
[root@redis redis-2.8.19]# cd redis-2.8.19 [root@redis redis-2.8.19]# 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: Redis實例的監控管理、通知和實例失效備援服務,是Redis集群的管理工具
安裝redis
[root@redis src]# make install
配置redis的配置文件
[root@redis redis-2.8.19]# cp redis.conf /etc/ ##########編輯Redis配置文件################### [root@redis redis-2.8.19]# vim /etc/redis.conf daemonize yes #37行 #是否以后臺daemon方式運行,默認不是后臺運行 pidfile /var/run/redis/redis.pid #41行 #redis的PID文件路徑 bind 10.168.85.25 #64行 #綁定主機IP,默認值為127.0.0.1,我們是跨機器運行,所以需要更改 logfile /var/log/redis/redis.log #104行 #定義log文件位置,模式log信息定向到stdout,輸出到/dev/null save 60 1000 #145行 #重新定義快照的頻率 dir /usr/local/rdbfile #188行 #本地數據庫存放路徑,默認為./,編譯安裝默認存在在/usr/local/bin下
啟動測試Redis服務器
#############啟動Redis服務器############ [root@redis redis-2.8.19]# redis-server /etc/redis.conf #############查看是否啟動成功########### [root@redis redis-2.8.19]# ss -tanlp | grep redis LISTEN 0 128 10.168.85.25:6379 *:* users:(("redis-server",17379,4)) #############測試Redis################## [root@redis redis-2.8.19]# redis-cli -h 10.168.85.25 -p 6379 10.168.85.25:6379> set test hello OK 10.168.85.25:6379> get test "hello"
更改內核信息
#############查看日志信息############### [root@redis redis-2.8.19]# tail -f /var/log/redis/redis.log [5033] 04 Jan 15:47:05.378 # Server started, Redis version 2.8.19 [5033] 04 Jan 15:47:05.379 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. [5033] 04 Jan 15:47:05.379 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. [5033] 04 Jan 15:47:05.380 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. [5033] 04 Jan 15:47:05.380 * DB loaded from disk: 0.000 seconds [5033] 04 Jan 15:47:05.380 * The server is now ready to accept connections on port 6379
日志顯示有兩個關于內核設置的警告信息! ##############sysctl文件############### [root@redis ~]# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf [root@redis ~]# sysctl -p #############kerbel#################### [root@redis ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
重新啟動Redis服務器
#######將緩存保存到硬盤上##### [root@redis ~]# redis-cli -h 10.168.85.25 -p 6379 BGSAVE Background saving started #######關閉Redis############# [root@redis ~]# redis-cli -h 10.168.85.25 -p 6379 SHUTDOWN ########啟動Redis############ [root@redis ~]# redis-server /etc/redis.conf
編輯Redis啟動腳本
[root@redis ~]# vi /etc/init.d/redis #!/bin/sh # # redis init file for starting up the redis daemon # # chkconfig: - 20 80 # description: Starts and stops the redis daemon. # Source function library. . /etc/rc.d/init.d/functions name="redis-server" exec="/usr/local/bin/$name" # 指定redis-server命令的位置(whereis redis-server) pidfile="/var/run/redis/redis.pid" # 指定redis的pid文件路徑(和配置文件里保持一致) REDIS_CONFIG="/etc/redis.conf" # 指定redis的配置文件路徑 [ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis lockfile=/var/lock/subsys/redis start() { [ -f $REDIS_CONFIG ] || exit 6 [ -x $exec ] || exit 5 echo -n $"Starting $name: " daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG" retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $name: " killproc -p $pidfile $name retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { stop start } reload() { false } rh_status() { status -p $pidfile $name } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 restart ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}" exit 2 esac exit $? [root@redis ~]# chmod 700 /etc/init.d/redis [root@redis ~]# servcie redis restart
附加信息
Redis無法編譯安裝報錯處理?
###########make時錯誤信息######### [root@redis redis-2.8.19]# make cd src && make all make[1]: Entering directory `/root/redis-2.8.19/src' CC adlist.o In file included from adlist.c:34: zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory zmalloc.h:55:2: error: #error "Newer version of jemalloc required" make[1]: *** [adlist.o] Error 1 make[1]: Leaving directory `/root/redis-2.8.19/src' make: *** [all] Error 2 ############解決方法############# make MALLOC=libc
vm.overcommit_memory參數解析
如果內存情況比較緊張的話,需要設定內核參數overcommit_memory,指定內核針對內存分配的策略,其值可以是0、1、2。 0,表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,并把錯誤返回給應用進程。 1,表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。 2,表示內核允許分配超過所有物理內存和交換空間總和的內存Redis在dump數據的時候,會fork出一個子進程,理論上child進程所占用的內存和parent是一樣的,比如parent占用的內存為 8G,這個時候也要同樣分配8G的內存給child, 如果內存無法負擔,往往會造成redis服務器的down機或者IO負載過高,效率下降。所以這里比較優化的內存分配策略應該設置為 1(表示內核允許分配所有的物理內存,而不管當前的內存狀態如何)。 設置方式有兩種,需確定當前用戶的權限活使用root用戶修改: 1:重設文件echo 1 > /proc/sys/vm/overcommit_memory(默認為0) 2:echo "vm.overcommit_memory=1" >> /etc/sysctl.conf && sysctl -p
BGSAVE參數解析
在后臺異步(Asynchronously)保存當前數據庫的數據到磁盤。 BGSAVE 命令執行之后立即返回 OK ,然后 Redis fork 出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,然后退出。 客戶端可以通過 LASTSAVE 命令查看相關信息,判斷 BGSAVE 命令是否執行成功。 請移步 持久化文檔 查看更多相關細節。 可用版本:>= 1.0.0時間復雜度:O(N), N 為要保存到數據庫中的 key 的數量。返回值:反饋信息。 redis> BGSAVE Background saving started
原創文章,作者:ZhaoYong,如若轉載,請注明出處:http://www.www58058.com/536