溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux安裝配置Redis

發(fā)布時(shí)間:2020-06-16 14:48:51 來(lái)源:網(wǎng)絡(luò) 閱讀:28390 作者:justin_peng 欄目:數(shù)據(jù)庫(kù)

一、Redis介紹

Redis是由意大利人Salvatore Sanfilippo(網(wǎng)名:antirez)開(kāi)發(fā)的一款內(nèi)存高速緩存數(shù)據(jù)庫(kù)。Redis全稱為:Remote Dictionary Server(遠(yuǎn)程數(shù)據(jù)服務(wù)),該軟件使用C語(yǔ)言編寫,Redis是一個(gè)key-value存儲(chǔ)系統(tǒng),它支持豐富的數(shù)據(jù)類型,如:string、list、set、zset(sorted set)、hash。和Memcache類似,但很大程度補(bǔ)償了Memcache的不足,它支持存儲(chǔ)的value類型相對(duì)更多,包括string、list、set、zset和hash。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作。在此基礎(chǔ)上,Redis支持各種不同方式的排序。

Redis以內(nèi)存作為數(shù)據(jù)存儲(chǔ)介質(zhì),所以讀寫數(shù)據(jù)的效率極高,遠(yuǎn)遠(yuǎn)超過(guò)數(shù)據(jù)庫(kù)。以設(shè)置和獲取一個(gè)256字節(jié)字符串為例,它的讀取速度可高達(dá)110000次/s,寫速度高達(dá)81000次/s。Redis的存儲(chǔ)分為內(nèi)存存儲(chǔ)、磁盤存儲(chǔ)和log文件三部分,重啟后,Redis可以從磁盤重新將數(shù)據(jù)加載到內(nèi)存中,這些可以通過(guò)配置文件對(duì)其進(jìn)行配置,正因?yàn)檫@樣,Redis才能實(shí)現(xiàn)持久化。因?yàn)镽edis交換數(shù)據(jù)快,所以在服務(wù)器中常用來(lái)存儲(chǔ)一些需要頻繁調(diào)取的數(shù)據(jù),這樣可以大大節(jié)省系統(tǒng)直接讀取磁盤來(lái)獲得數(shù)據(jù)的I/O開(kāi)銷,更重要的是可以極大提升速度。

Memcache只能將數(shù)據(jù)緩存到內(nèi)存中,無(wú)法自動(dòng)定期寫入硬盤,一斷電或重啟,內(nèi)存清空,數(shù)據(jù)丟失。所以Memcache的應(yīng)用場(chǎng)景適用于緩存無(wú)需持久化的數(shù)據(jù).


Redis從它的許多競(jìng)爭(zhēng)繼承來(lái)的三個(gè)主要特點(diǎn):

1.Redis數(shù)據(jù)庫(kù)完全在內(nèi)存中,使用磁盤僅用于持久性。

2.相比許多鍵值數(shù)據(jù)存儲(chǔ),Redis擁有一套較為豐富的數(shù)據(jù)類型。

3.Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從服務(wù)器。

4、Redis能支持超過(guò) 100K+ 每秒的讀寫頻率

5、單個(gè)value限制是1GB,memcached為1M數(shù)據(jù)


Redis優(yōu)勢(shì)

         異常快速:Redis的速度非???,每秒能執(zhí)行約11萬(wàn)集合,每秒約81000+條記錄。

         支持豐富的數(shù)據(jù)類型:Redis支持最大多數(shù)開(kāi)發(fā)人員已經(jīng)知道像列表,集合,有序集合,散列數(shù)據(jù)類型。這使得它非常容易解決各種各樣的問(wèn)題,因?yàn)槲覀冎滥男﹩?wèn)題是可以處理通過(guò)它的數(shù)據(jù)類型更好。

         操作都是原子性:所有Redis操作是原子的,這保證了如果兩個(gè)客戶端同時(shí)訪問(wèn)的Redis服務(wù)器將獲得更新后的值。

        多功能實(shí)用工具:Redis是一個(gè)多實(shí)用的工具,可以在多個(gè)用例如緩存,消息,隊(duì)列使用(Redis原生支持發(fā)布/訂閱),任何短暫的數(shù)據(jù),應(yīng)用程序,如Web應(yīng)用程序會(huì)話,網(wǎng)頁(yè)命中計(jì)數(shù)等。


二、Redis的安裝

[root@localhost app]# ls
redis-3.2.8.tar.gz
[root@localhost app]# tar zxvf redis-3.2.8.tar.gz 
[root@localhost app]# cd redis-3.2.8
[root@localhost redis-3.2.8]# yum -y install gcc gcc-c++
[root@localhost redis-3.2.3]# make  #make MALLOC=libc  如果在make的時(shí)候不指定內(nèi)存管理方式,會(huì)報(bào)錯(cuò)的: zmalloc.h:50:31: 致命錯(cuò)誤:jemalloc/jemalloc.h:沒(méi)有那個(gè)文件或目錄。 malloc是管理內(nèi)存碎片的。
Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory `/app/redis-3.2.3/src'
[root@localhost redis-3.2.3]#

在執(zhí)行完make之后,在最后的程序中會(huì)輸出(t's a good idea to run 'make test'),它建議我們執(zhí)行make test進(jìn)行測(cè)試,那么接下來(lái)我們就輸入make test,檢查測(cè)試,是否出現(xiàn)問(wèn)題,如出現(xiàn)如圖所示:則說(shuō)明測(cè)試沒(méi)有問(wèn)題:

[root@localhost redis-3.2.3]# cd src/
[root@localhost src]# make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1
[root@localhost src]# cd /app/
[root@localhost app]# wget 
[root@localhost app]# tar zxvf tcl8.6.1-src.tar.gz 
[root@localhost app]# cd tcl8.6.1/unix/
[root@localhost unix]# ./configure
[root@localhost unix]# make && make install
[root@localhost unix]# cd /app/redis-3.2.3/
[root@localhost redis-3.2.3]# make clean
[root@localhost redis-3.2.3]# make
[root@localhost redis-3.2.3]# cd src/
[root@localhost src]# make test
  215 seconds - integration/replication-3
  212 seconds - integration/replication-4
  98 seconds - unit/hyperloglog
  151 seconds - unit/obuf-limits

\o/ All tests passed without errors!

Cleanup: may take some time... OK
[root@localhost src]# make install  #make PREFIX=/app/redis install 注意PREFIX大寫

Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
[root@localhost src]#

注意:這里很可能會(huì)在make test 這步出現(xiàn)以下錯(cuò)誤:

錯(cuò)誤一

!!! WARNING The following tests failed:

*** [err]: Test replication partial resync: ok psync (diskless: yes, reconnect: 1) in tests/integration/replication-psync.tcl
Expected condition '[s -1 sync_partial_ok] > 0' to be true ([s -1 sync_partial_ok] > 0)
Cleanup: may take some time... OK
make: *** [test] Error 1
[root@localhost src]#

有2個(gè)方法可以避免:

1、在解壓目錄中修改 tests/integration/replication-psync.tcl,把 after 100 改成 after 500,這個(gè)參數(shù)貌似是等待的毫秒數(shù)

[root@localhost redis-3.2.3]# vim tests/integration/replication-psync.tcl
                if ($reconnect) {
                    for {set j 0} {$j < $duration*10} {incr j} {
                        after 500
                        # catch {puts "MASTER [$master dbsize] keys, SLAVE [$slave dbsize] keys"}
[root@localhost redis-3.2.3]#

 2、用taskset來(lái)make test

 taskset -c 1 make test


錯(cuò)誤二

[exception]: Executing test client: NOREPLICAS Not enough good slaves to write..
NOREPLICAS Not enough good slaves to write.
......
Killing still running Redis server 63439
Killing still running Redis server 63486
Killing still running Redis server 63519
Killing still running Redis server 63546
Killing still running Redis server 63574
Killing still running Redis server 63591
I/O error reading reply
......
"createComplexDataset $r $ops"
    (procedure "bg_complex_data" line 4)
    invoked from within
"bg_complex_data [lindex $argv 0] [lindex $argv 1] [lindex $argv 2] [lindex $argv 3]"
    (file "tests/helpers/bg_complex_data.tcl" line 10)
Killing still running Redis server 21198
make: *** [test] Error 1
[root@localhost src]# vim ../tests/integration/replication-2.tcl 
start_server {tags {"repl"}} {
    start_server {} {
        test {First server should have role slave after SLAVEOF} {
            r -1 slaveof [srv 0 host] [srv 0 port]
            after 10000    #修改成10000
            s -1 role
        } {slave}


錯(cuò)誤三

[err]: Slave should be able to synchronize with the master in tests/integration/replication-psync.tcl
Replication not started.

這個(gè)錯(cuò)誤我重新make test就可以了,只遇到過(guò)一次


三、redis的配置

 啟動(dòng):

[root@localhost src]# redis-server ../redis.conf 
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 35217
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

35217:M 29 Mar 11:30:21.454 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
35217:M 29 Mar 11:30:21.454 # Server started, Redis version 3.2.3
35217:M 29 Mar 11:30:21.454 # 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.
35217:M 29 Mar 11:30:21.454 * The server is now ready to accept connections on port 6379
^C35217:signal-handler (1490758240) Received SIGINT scheduling shutdown...
35217:M 29 Mar 11:30:40.180 # User requested shutdown...
35217:M 29 Mar 11:30:40.180 * Saving the final RDB snapshot before exiting.
35217:M 29 Mar 11:30:40.191 * DB saved on disk
35217:M 29 Mar 11:30:40.191 * Removing the pid file.
35217:M 29 Mar 11:30:40.191 # Redis is now ready to exit, bye bye...
[root@localhost src]#

這里直接執(zhí)行Redis-server 啟動(dòng)的Redis服務(wù),是在前臺(tái)直接運(yùn)行的(效果如上圖),也就是說(shuō),執(zhí)行完該命令后,如果Lunix關(guān)閉當(dāng)前會(huì)話,則Redis服務(wù)也隨即關(guān)閉。正常情況下,啟動(dòng)Redis服務(wù)需要從后臺(tái)啟動(dòng),并且指定啟動(dòng)配置文件。 

編輯conf文件,將daemonize屬性改為yes(表明需要在后臺(tái)運(yùn)行)

[root@localhost src]# vim ../redis.conf 
daemonize yes
[root@localhost src]# redis-server ../redis.conf 
[root@localhost src]# netstat -anotp|grep :6379
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      35415/redis-server  off (0.00/0/0)
[root@localhost src]# redis-cli shutdown   #停止redis服務(wù)
[root@localhost src]# netstat -anotp|grep :6379

配置

為了方便管理,將Redis文件中的conf配置文件和常用命令移動(dòng)到統(tǒng)一文件中

[root@localhost app]# mkdir -p redis6379/{log,conf,data,bin}
[root@localhost src]# cp redis-server redis-benchmark redis-cli mkreleasehdr.sh redis-check-aof /app/redis6379/bin/
[root@localhost src]# cp ../redis.conf /app/redis6379/conf/
[root@localhost src]# pwd
/app/redis-3.2.3/src
[root@localhost src]# cd /app/redis6379/bin/
[root@localhost bin]# redis-server ../conf/redis.conf 
[root@localhost bin]# netstat -antp|grep :6379
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      36334/redis-server  
[root@localhost bin]# cp /etc/sysctl.conf{,.bak}
[root@localhost bin]# vim /etc/sysctl.conf
vm.overcommit_memory = 1
[root@localhost bin]# sysctl -p

  • redis-benchmark  redis性能檢測(cè)工具

測(cè)試Redis的讀寫性能:

[root@localhost bin]# ./redis-benchmark -h localhost -p 6979 -c 100 -n 100000       #100個(gè)并發(fā)連接,100000個(gè)請(qǐng)求
......
====== MSET (10 keys) ======
  100000 requests completed in 0.94 seconds    #100000個(gè)請(qǐng)求完成于 0.94 秒
  100 parallel clients                         #每個(gè)請(qǐng)求有100個(gè)并發(fā)客戶端
  3 bytes payload                              #每次寫入3字節(jié)              
  keep alive: 1                                #保持1個(gè)連接

99.92% <= 1 milliseconds
100.00% <= 1 milliseconds
106609.80 requests per second                 #每秒106609.80次查詢

參數(shù):

-h    設(shè)置檢測(cè)主機(jī)IP地址,默認(rèn)為127.0.0.1
-p    設(shè)置檢測(cè)主機(jī)的端口號(hào),默認(rèn)為6379
-s<socket>    服務(wù)器套接字(壓倒主機(jī)和端口)
-c    并發(fā)連接數(shù)
-n    請(qǐng)求數(shù)
-d    測(cè)試使用的數(shù)據(jù)集的大小/字節(jié)的值(默認(rèn)3字節(jié))
-k    1:表示保持連接(默認(rèn)值)0:重新連接
-r    SET/GET/INCR方法使用隨機(jī)數(shù)插入數(shù)值,設(shè)置10則插入值為rand:000000000000 - rand:000000000009
-P    默認(rèn)為1(無(wú)管道),當(dāng)網(wǎng)絡(luò)延遲過(guò)長(zhǎng)時(shí),使用管道方式通信(請(qǐng)求和響應(yīng)打包發(fā)送接收)
-q    簡(jiǎn)約信息模式,只顯示查詢和秒值等基本信息。
--csv    以CSV格式輸出信息
-l    無(wú)線循環(huán)插入測(cè)試數(shù)據(jù),ctrl+c停止
-t<tests>    只運(yùn)行<tests>測(cè)試逗號(hào)分隔的列表命令,如:-t ping,set,get    
-I    空閑模式。立即打開(kāi)50個(gè)空閑連接和等待。


  • redis-check-rdb 檢查rbd日志的工具



  • redis-check-dump    檢查本地?cái)?shù)據(jù)庫(kù)文件

redis-check-dump  dump.rdb


  • redis-sentinel  Redis集群的管理工具 監(jiān)控多個(gè)master-slave集群,發(fā)現(xiàn)master宕機(jī)后能進(jìn)行自動(dòng)切換


  • redis-check-aof  檢查aof日志的工具

redis-check-aof appendonly.aof

--fix參數(shù)為修復(fù)log文件


  • redis-cli    Redis命令行操作工具 

參數(shù):

-h    設(shè)置檢測(cè)主機(jī)IP地址,默認(rèn)為127.0.0.1
-p    設(shè)置檢測(cè)主機(jī)的端口號(hào),默認(rèn)為6379
-s<socket>    服務(wù)器套接字(壓倒主機(jī)和端口)
-a    連接到Master服務(wù)器時(shí)使用的密碼
-r    執(zhí)行指定的N次命令,eg:redis-cli -r 3 info 重復(fù)執(zhí)行info命令三次

-i    執(zhí)行命令后等待N秒,如–i 0.1 info(執(zhí)行后等0.1秒),eg:redis-cli -r 100 -i 1 info | grep used_memory_human

-n    指定連接N號(hào)ID數(shù)據(jù)庫(kù),如 –n 3(連接3號(hào)數(shù)據(jù)庫(kù))
-x    從控制臺(tái)輸入的信息中讀取最后一個(gè)參數(shù),eg:cat testStr.txt | redis-cli -x set testStr讀取testStr.txt文件所有內(nèi)容設(shè)置為testStr的值

-d    定義多個(gè)定界符為默認(rèn)輸出格式(默認(rèn): \n)
--raw    使用原數(shù)據(jù)格式返回輸出內(nèi)容
--latency    進(jìn)入一個(gè)不斷延時(shí)采樣的特殊模式
--slave    模擬一個(gè)從服務(wù)器到主服務(wù)器的命令顯示反饋
--pipe    使用管道協(xié)議模式
--bigkeys    監(jiān)聽(tīng)顯示數(shù)據(jù)量大的key值,--bigkeys -i 0.1
--help    顯示命令行幫助信息
--version    顯示版本號(hào)

[root@localhost bin]# ./redis-cli -h 10.15.97.136 -p 6979 -a ywbz97.136 info      #查看info信息
[root@localhost bin]# ./redis-cli -h 10.15.97.136 -p 6979 -a ywbz97.136
Warning: Using a password with '-a' option on the command line interface may not be safe.
10.15.97.136:6979> keys \*    #查看所有鍵值信息
(empty list or set)
10.15.97.136:6979> 
[root@localhost bin]# ./redis-cli -h 10.15.97.136 -p 6979 -a ywbz97.136 -n 15    #登陸15號(hào)數(shù)據(jù)庫(kù)
[root@localhost bin]# ./redis-cli -h 10.15.97.136 -p 6979 -a ywbz97.136 info|grep "\<used_memory\>"     #過(guò)濾查詢used_memory屬性
Warning: Using a password with '-a' option on the command line interface may not be safe.
used_memory:902799
[root@localhost bin]#

當(dāng)used_memory_rss接近maxmemory或者used_memory_peak超過(guò)maxmemory時(shí),要加大maxmemory 負(fù)責(zé)性能下降。

maxmemory:

不要用比設(shè)置的上限更多的內(nèi)存。一旦內(nèi)存使用達(dá)到上限,Redis會(huì)根據(jù)選定的回收策略(參見(jiàn):maxmemmory-policy:內(nèi)存策略設(shè)置)刪除key。如果因?yàn)閯h除策略問(wèn)題Redis無(wú)法刪除key,或者策略設(shè)置為 "noeviction",Redis會(huì)回復(fù)需要更多內(nèi)存的錯(cuò)誤信息給命令。例如,SET,LPUSH等等。但是會(huì)繼續(xù)合理響應(yīng)只讀命令,比如:GET。在使用Redis作為L(zhǎng)RU緩存,或者為實(shí)例設(shè)置了硬性內(nèi)存限制的時(shí)候(使用 "noeviction" 策略)的時(shí)候,這個(gè)選項(xiàng)還是滿有用的。當(dāng)一堆slave連上達(dá)到內(nèi)存上限的實(shí)例的時(shí)候,響應(yīng)slave需要的輸出緩存所需內(nèi)存不計(jì)算在使用內(nèi)存當(dāng)中。當(dāng)請(qǐng)求一個(gè)刪除掉的key的時(shí)候就不會(huì)觸發(fā)網(wǎng)絡(luò)問(wèn)題/重新同步的事件,然后slave就會(huì)收到一堆刪除指令,直到數(shù)據(jù)庫(kù)空了為止。slave連上一個(gè)master的話,建議把master內(nèi)存限制設(shè)小點(diǎn)兒,確保有足夠的系統(tǒng)內(nèi)存用作輸出緩存。(如果策略設(shè)置為"noeviction"的話就不無(wú)所謂了),設(shè)置最大內(nèi)存,達(dá)到最大內(nèi)存設(shè)置后,Redis會(huì)先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理后,任到達(dá)最大內(nèi)存設(shè)置,將無(wú)法再進(jìn)行寫入操作。

設(shè)置內(nèi)存分配策略vm.overcommit_memory = 1 ;否則Redis腳本在重啟或停止redis時(shí),將會(huì)報(bào)錯(cuò),并且不能自動(dòng)在停止服務(wù)前同步數(shù)據(jù)到磁盤上

/proc/sys/vm/overcommit_memory可選值:0、1、2。

0, 表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。

1, 表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。

2, 表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存

值得注意的一點(diǎn)是,redis在dump數(shù)據(jù)的時(shí)候,會(huì)fork出一個(gè)子進(jìn)程,理論上child進(jìn)程所占用的內(nèi)存和parent是一樣的,比如parent占用的內(nèi)存為8G,這個(gè)時(shí)候也要同樣分配8G的內(nèi)存給child,如果內(nèi)存無(wú)法負(fù)擔(dān),往往會(huì)造成redis服務(wù)器的down機(jī)或者IO負(fù)載過(guò)高,效率下降。所以這里比較優(yōu)化的內(nèi)存分配策略應(yīng)該設(shè)置為 1(表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何)

redis服務(wù)關(guān)閉后,緩存數(shù)據(jù)會(huì)自動(dòng)dump到硬盤上,硬盤地址為redis.conf中的配置項(xiàng)dbfilename dump.rdb所設(shè)定

redis配置文件簡(jiǎn)介

[root@localhost conf]# vim redis.conf
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
#當(dāng)配置中需要配置內(nèi)存大小時(shí),可以使用 1k, 5GB, 4M 等類似的格式,其內(nèi)存單位轉(zhuǎn)換方式如下(不區(qū)分大小寫,比如 1gb 1Gb 1GB 1gB均可)
daemonize yes    #是否以后臺(tái)進(jìn)程運(yùn)行,默認(rèn)為no
pidfile /var/run/redis_6379.pid    #如以后臺(tái)進(jìn)程運(yùn)行,需指定一個(gè)pid路徑,默認(rèn)為/var/run/redis.pid   
port 6379    #監(jiān)聽(tīng)端口,默認(rèn)為6379 
# unixsocket /tmp/redis.sock    #指定用來(lái)監(jiān)聽(tīng)連接的unxi套接字的路徑。這個(gè)沒(méi)有默認(rèn)值,所以如果不指定的話,Redis就不會(huì)通過(guò)unix套接字來(lái)監(jiān)聽(tīng)。
# unixsocketperm 700 
timeout 300    #超時(shí)時(shí)間,當(dāng)客戶端在這段時(shí)間內(nèi)沒(méi)有發(fā)出任何指令,那么關(guān)閉該連接,默認(rèn)為0(秒),永不超時(shí)
loglevel notice    #日志記錄等級(jí),有4個(gè)可選值,debug適用于開(kāi)發(fā)和測(cè)試,verbose更詳細(xì)信息,notice適用于生產(chǎn)環(huán)境,warning只記錄警告或錯(cuò)誤信息 
logfile /app/redis6379/log/redis.log    #日志記錄方式,默認(rèn)值為stdout
# syslog-enabled no    #是否將日志輸出到系統(tǒng)日志
# syslog-ident redis    #設(shè)置linux系統(tǒng)日志syslog的標(biāo)示符,若是"syslog-enabled=no",則這個(gè)選項(xiàng)無(wú)效。
# syslog-facility local0    #設(shè)置syslog的facility,必須是USER或者是 LOCAL0-LOCAL7之間的值。
slave-serve-stale-data yes    #當(dāng)slave與master之間的連接斷開(kāi)或slave正在與master進(jìn)行數(shù)據(jù)同步時(shí),如果有slave請(qǐng)求,當(dāng)設(shè)置為yes時(shí),slave仍然響應(yīng)請(qǐng)求,此時(shí)可能有問(wèn)題,如果設(shè)置no時(shí),slave會(huì)返回"SYNC with master in progress"錯(cuò)誤信息。但I(xiàn)NFO和SLAVEOF命令除外。
databases 16    #可用數(shù)據(jù)庫(kù)數(shù),默認(rèn)值為16,
############### 快照方式 ###############
save 900 1    #900秒(15分鐘)內(nèi)至少有1個(gè)key被改變,則快照
save 300 10    #300秒(5分鐘)內(nèi)至少有10個(gè)key被改變  ,則快照
save 60 10000    #60秒內(nèi)至少有10000個(gè)key被改變,則快照,如果不需要寫磁盤,則把所有 "save" 設(shè)置注釋掉 
rdbcompression yes    #存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes,如果你希望保存子進(jìn)程節(jié)省點(diǎn) cpu ,你就設(shè)置它為 no ,不過(guò)這個(gè)數(shù)據(jù)集可能就會(huì)比較大
dbfilename dump.rdb    #本地?cái)?shù)據(jù)庫(kù)文件名,默認(rèn)值為dump.rdb  
rdbchecksum yes    #是否校驗(yàn)rdb文件
dir /app/redis6379/data    #本地?cái)?shù)據(jù)庫(kù)存放路徑,默認(rèn)值為 ./ 工作目錄
tcp-keepalive 60    #tcp 心跳包,推薦一個(gè)合理的值就是60秒,防止死的 peers
############### 主從復(fù)制 ###############
# slaveof <masterip> <masterport>
#slaveof 10.0.0.12 6379 #當(dāng)本機(jī)為從服務(wù)時(shí),設(shè)置主服務(wù)的IP及端口
# masterauth <master-password>
#masterauth justin #當(dāng)master設(shè)置密碼認(rèn)證,slave用此選項(xiàng)指定master認(rèn)證密碼
# repl-ping-slave-period 10    #Slaves在一個(gè)預(yù)定義的時(shí)間間隔內(nèi)發(fā)送ping命令到server, 默認(rèn)為10秒??梢酝ㄟ^(guò) repl_ping_slave_period 來(lái)設(shè)置
 # repl-timeout 60    #設(shè)置主從復(fù)制大塊數(shù)據(jù)I/O、向master請(qǐng)求數(shù)據(jù)和ping響應(yīng)的過(guò)期時(shí),這個(gè)值一定要比repl-ping-slave-period大,否則master和slave之間的傳輸過(guò)期時(shí)間比預(yù)想的要短。
# requirepass foobared
# requirepass justin    #設(shè)置redis密碼
# maxclients 10000    #設(shè)置最大同時(shí)連接客戶端數(shù)量,0為不限制,這個(gè)關(guān)系到Redis進(jìn)程能夠打開(kāi)的文件描述符數(shù)量,一旦達(dá)到這個(gè)限制,Redis會(huì)關(guān)閉所有新連接并發(fā)送錯(cuò)誤"達(dá)到最大用戶數(shù)上限(max number of clients reached)"
# maxmemory <bytes>    #指定Redis最大內(nèi)存限制,Redis在啟動(dòng)時(shí)會(huì)把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后,Redis會(huì)先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理后,仍然到達(dá)最大內(nèi)存設(shè)置,將無(wú)法再進(jìn)行寫入操作,但仍然可以進(jìn)行讀取操作。Redis新的vm機(jī)制,會(huì)把Key存放內(nèi)存,Value會(huì)存放在swap區(qū)
appendonly no    #指定是否在每次更新操作后進(jìn)行日志記錄,Redis在默認(rèn)情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開(kāi)啟,可能會(huì)在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)?nbsp;redis本身同步數(shù)據(jù)文件是按上面save條件來(lái)同步的,所以有的數(shù)據(jù)會(huì)在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)為no
# maxmemory-policy noeviction    #如果達(dá)到maxmemory值,采用此策略,可以采取的動(dòng)作,volatile-lru :默認(rèn)策略,只對(duì)設(shè)置過(guò)期時(shí)間的key進(jìn)行LRU算法刪除,allkeys-lru :刪除不經(jīng)常使用的key,volatile-random :隨機(jī)刪除即將過(guò)期的key,allkeys-random :隨機(jī)刪除一個(gè)key,volatile-ttl :刪除即將過(guò)期的key,noeviction :不過(guò)期,寫操作返回報(bào)錯(cuò)。
# maxmemory-samples 5    #默認(rèn)隨機(jī)選擇5個(gè)key,從中淘汰最不經(jīng)常用的
appendfilename "appendonly.aof"    #更新日志文件名,默認(rèn)值為appendonly.aof
appendfsync everysec    #更新日志條件,共有3個(gè)可選值。no表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤,always表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫到磁盤,everysec表示每秒同步一次
no-appendfsync-on-rewrite no    #日志文件即將增長(zhǎng)到指定百分比時(shí),redis通過(guò)調(diào)用BGREWRITEAOF是否自動(dòng)重寫AOF日志文件。
really-use-vm yes   
vm-enabled yes    #是否使用虛擬內(nèi)存,默認(rèn)值為no,VM機(jī)制將數(shù)據(jù)分頁(yè)存放,由Redis將訪問(wèn)量較少的頁(yè)即冷數(shù)據(jù)swap到磁盤上,訪問(wèn)多的頁(yè)面由磁盤自動(dòng)換出到內(nèi)存中   
vm-swap-file /tmp/redis.swap    #虛擬內(nèi)存文件路徑,默認(rèn)值為/tmp/redis.swap,不可多個(gè)Redis實(shí)例共享   
vm-max-memory 0    #vm大小限制。0:不限制,建議60-80% 可用內(nèi)存大小。將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無(wú)論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲(chǔ)的(Redis的索引數(shù)據(jù) 就是keys),也就是說(shuō),當(dāng)vm-max-memory設(shè)置為0的時(shí)候,其實(shí)是所有value都存在于磁盤。默認(rèn)值為0   
vm-page-size 32    #根據(jù)緩存內(nèi)容大小調(diào)整,默認(rèn)32字節(jié)。Redis swap文件分成了很多的page,一個(gè)對(duì)象可以保存在多個(gè)page上面,但一個(gè)page上不能被多個(gè)對(duì)象共享,vm-page-size是要根據(jù)存儲(chǔ)的 數(shù)據(jù)大小來(lái)設(shè)定的,作者建議如果存儲(chǔ)很多小對(duì)象,page大小最好設(shè)置為32或者64bytes;如果存儲(chǔ)很大大對(duì)象,則可以使用更大的page,如果不 確定,就使用默認(rèn)值   
vm-pages 134217728    #page數(shù)。每 8 page,會(huì)占用1字節(jié)內(nèi)存。設(shè)置swap文件中的page數(shù)量,由于頁(yè)表(一種表示頁(yè)面空閑或使用的bitmap)是在放在內(nèi)存中的,,在磁盤上每8個(gè)pages將消耗1byte的內(nèi)存。   
vm-page-size    #vm-pages 等于 swap 文件大小   
vm-max-threads 4    #vm 最大io線程數(shù)。注意: 0 標(biāo)志禁止使用vm,設(shè)置訪問(wèn)swap文件的線程數(shù),最好不要超過(guò)機(jī)器的核數(shù),如果設(shè)置為0,那么所有對(duì)swap文件的操作都是串行的,可能會(huì)造成比較長(zhǎng)時(shí)間的延遲。默認(rèn)值為4
include /path/to/local.conf   #指定包含其它的配置文件,可以在同一主機(jī)上多個(gè)Redis實(shí)例之間使用同一份配置文件,而同時(shí)各個(gè)實(shí)例又擁有自己的特定配置文件

maxmemory <bytes> 設(shè)置最大內(nèi)存,maxmemory是bytes字節(jié)類型,注意轉(zhuǎn)換,如果設(shè)置了maxmemory,一般都要設(shè)置過(guò)期策略,默認(rèn)策略maxmemory-policy volatile-lru對(duì)設(shè)置過(guò)期時(shí)間的key進(jìn)行LRU(Least Recently Used 近期最少使用算法)算法刪除,如果set時(shí)候沒(méi)有加上過(guò)期時(shí)間就會(huì)導(dǎo)致數(shù)據(jù)寫滿maxmemory,此時(shí)將無(wú)法再進(jìn)行寫入操作。

volatile-lru -> 根據(jù)LRU算法生成的過(guò)期時(shí)間來(lái)刪除。

allkeys-lru -> 根據(jù)LRU算法刪除任何key。

volatile-random -> 根據(jù)過(guò)期設(shè)置來(lái)隨機(jī)刪除key。

allkeys->random -> 無(wú)差別隨機(jī)刪。

volatile-ttl -> 根據(jù)最近過(guò)期時(shí)間來(lái)刪除(輔以TTL)

noeviction -> 誰(shuí)也不刪,直接在寫操作時(shí)返回錯(cuò)誤。

maxmemory 16777216  #設(shè)置最大內(nèi)存16GB,一般推薦Redis設(shè)置內(nèi)存為最大物理內(nèi)存的四分之三。

Redis使用超過(guò)設(shè)置的最大值,在debug模式下的頁(yè)面,提示錯(cuò)誤:OOM command not allowed when used memory > ‘maxmemory’.


redis的持久化方式分兩種

1.rdb模式

其實(shí)就是對(duì)內(nèi)存中的東西按一些策略定期做snapshot,也就是快照,rdb保存的是二進(jìn)制文件,是redis的默認(rèn)方式。

save <seconds> <changes>
#100秒內(nèi)至少有10個(gè)key值發(fā)生改變才做持久化
save 100  10 
#最新的快照保存失敗時(shí)停止寫操作
stop-writes-on-bgsave-error yes
#做快照時(shí)是不是需要做壓縮
rdbcompression yes
#數(shù)據(jù)校驗(yàn),保證數(shù)據(jù)正確性
rdbchecksum yes
#快照的文件名
dbfilename dump.rdb
#存放快照的目錄
dir /var/lib/redis

2.Append only file(AOF)的方式

它將每一步操作的命令強(qiáng)制保存到磁盤上,持久性比較好,但對(duì)于寫比較頻繁的情況不適合,不推薦。 配置如下:

appendonly no
#append only file的名稱,默認(rèn)為appendonly.aof
appendfilename "appendonly.aof"
#在日志重寫時(shí),不進(jìn)行命令追加操作,而只是將其放在緩沖區(qū)里,避免與命令的追加造成DISK IO上的沖突。
no-appendfsync-on-rewrite yes

強(qiáng)制同步數(shù)據(jù)到磁盤: redis-cli save  或 redis-cli -p 6380 save (根據(jù)端口號(hào)指定某臺(tái)服務(wù)器同步)


info命令查看Redis內(nèi)存使用情況

[root@localhost redis6379]# cd bin/
[root@localhost bin]# ./redis-cli 
127.0.0.1:6379> info
# Server
redis_version:3.2.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9f41557dffea5d14
redis_mode:standalone
os:Linux 2.6.32-642.el6.x86_64 x86_64
arch_bits:64        #64位系統(tǒng)
multiplexing_api:epoll  # Redis 所使用的事件處理機(jī)制
gcc_version:4.4.7
process_id:1381        #當(dāng)前服務(wù)器進(jìn)程id
run_id:94e9454ecd837dc2b3fc6e41499ecc058679daae    #Redis 服務(wù)器的隨機(jī)標(biāo)識(shí)符(用于 Sentinel 和集群)
tcp_port:6379
uptime_in_seconds:723584    #正常工作時(shí)間(秒)
uptime_in_days:8            #正常工作天數(shù)
hz:10
lru_clock:16736529
executable:/app/redis6379/bin/redis-server
config_file:/app/redis6379/conf/redis.conf

# Clients
connected_clients:1                #客戶端連接數(shù)
connected_slaves:0                #從服務(wù)器連接數(shù)
client_longest_output_list:0    #當(dāng)前連接的客戶端當(dāng)中,最長(zhǎng)的輸出列表
client_biggest_input_buf:0    #當(dāng)前連接的客戶端當(dāng)中,最大輸入緩存
blocked_clients:0            #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數(shù)量

# Memory
used_memory:289912               #由Redis分配器分配的內(nèi)存總量(edis數(shù)據(jù)占用的內(nèi)存),以字節(jié)(byte)為單位
used_memory_human:283.12K        #以人類可讀的格式返回Redis分配的內(nèi)存總量,重點(diǎn)關(guān)注
used_memory_rss:1196032        #從操作系統(tǒng)的角度,返回Redis已分配的內(nèi)存總量(redis占用的物理內(nèi)存)。這個(gè)值和top、ps等命令的輸出一致。
used_memory_rss_human:1.14M
used_memory_peak:289912        #redis使用物理內(nèi)存的峰值(以字節(jié)為單位)
used_memory_peak_human:283.12K
total_system_memory:505806848
total_system_memory_human:482.38M
used_memory_lua:37888    # Lua 引擎所使用的內(nèi)存大小(以字節(jié)為單位)
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:4.13    #內(nèi)存碎片率,used_memory_rss和used_memory之間的比率
mem_allocator:jemalloc-4.0.3    #內(nèi)存分配器版本,在編譯時(shí)指定的Redis所使用的內(nèi)存分配器??梢允莑ibc、jemalloc或者tcmalloc。
#在理想情況下, used_memory_rss 的值應(yīng)該只比 used_memory 稍微高一點(diǎn)兒。
#當(dāng) rss > used ,且兩者的值相差較大時(shí),表示存在(內(nèi)部或外部的)內(nèi)存碎片。內(nèi)存碎片的比率可以通過(guò) mem_fragmentation_ratio 的值看出。
#當(dāng) used > rss 時(shí),表示 Redis 的部分內(nèi)存被操作系統(tǒng)換出到交換空間了,在這種情況下,操作可能會(huì)產(chǎn)生明顯的延遲。當(dāng) Redis 釋放內(nèi)存時(shí),分配器可能會(huì),也可能不會(huì),將內(nèi)存返還給操作系統(tǒng)。如果 Redis 釋放了內(nèi)存,卻沒(méi)有將內(nèi)存返還給操作系統(tǒng),那么 used_memory 的值可能和操作系統(tǒng)顯示的 Redis 內(nèi)存占用并不一致。查看 used_memory_peak 的值可以驗(yàn)證這種情況是否發(fā)生。

# Persistence    RDB 和 AOF 的相關(guān)信息
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0             #后臺(tái)異步保存數(shù)據(jù)的進(jìn)程數(shù)      
rdb_last_save_time:1492407953
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:1                        #是否開(kāi)啟純累加模式
aof_rewrite_in_progress:0            
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_current_size:0
aof_base_size:0
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

# Stats   一般統(tǒng)計(jì)信息
total_connections_received:1        #接受到的總連接數(shù)
total_commands_processed:1            #服務(wù)器處理的命令數(shù)量
instantaneous_ops_per_sec:0
total_net_input_bytes:31
total_net_output_bytes:5935693
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0                #失效key的總數(shù)量
evicted_keys:0                #已刪除的key的總數(shù)量
keyspace_hits:0                #Key命中次數(shù)
keyspace_misses:0                #Key未命中次數(shù)
pubsub_channels:0                    #訂閱信息
pubsub_patterns:0
latest_fork_usec:0                #最近子進(jìn)程
migrate_cached_sockets:0

# Replication   主/從復(fù)制信息
role:master                        #master為主服務(wù)器slave為從服務(wù)器
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:386.43    #Cpu使用率
used_cpu_user:218.25
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

#commandstats  Redis 命令統(tǒng)計(jì)信息

# Cluster   Redis 集群信息
cluster_enabled:0

# Keyspace   數(shù)據(jù)庫(kù)相關(guān)的統(tǒng)計(jì)信息
db0:keys=2,expires=0,avg_ttl=0      #1號(hào)數(shù)據(jù)庫(kù)保存的key數(shù)量,及超時(shí)時(shí)間

127.0.0.1:6379>


將Redis配置成服務(wù)

[root@localhost conf]# cp /usr/local/redis-3.2.8/utils/redis_init_script /etc/rc.d/init.d/redis
[root@localhost conf]# cat /etc/rc.d/init.d/redis 
#!/bin/bash
#chkconfig: 2345 10 90
#description: Redis server is an open source, advanced key-value store.
# source function library
source /etc/rc.d/init.d/functions
port="6379"
pidfile="/var/run/redis_$port.pid"
lockfile="/var/lock/subsys/redis-server"
rootpath="/app/redis$port"
config="$rootpath/conf/redis.conf"
binpath="$rootpath/bin"
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
reids_status(){
               status -p $pidfile redis-server
}
start() {
        if [ -e $pidfile ];then
            echo "Redis Server aleady running......"
            exit 1
        else
            echo -n "Starting Redis Server......"
            $binpath/redis-server $config
            value=$?
            [ $value -eq 0 ] && touch $lockfile && echo "OK"
            return $value
        fi
}
stop() {
       echo -n "Stop Redis Server......"
       killproc redis-server
#      $binpath/redis-cli save && $binpath/redis-cli shutdown
       value=$?
       [ $value -eq 0 ] && rm -rf $lockfile $pidfile 
       return $value
}
restart() {
          stop
          start
}
case "$1" in
start)
      start
;;
stop)
     stop
;;
restart)
        restart
;;
status)
       reids_status
;;
*)
  echo $"Usage: $0 {start|stop|restart|status}"
esac
[root@localhost conf]# chkconfig --add redis
[root@localhost conf]# chkconfig --level 2345 redis on
[root@localhost conf]# chmod +x /etc/rc.d/init.d/redis


三、redis的測(cè)試

[root@localhost src]# redis-cli  #redis-cli -h host -p port -a password
127.0.0.1:6379> set justin "WeChat ID:ityunwei2017"  #向redis中插入鍵值對(duì)數(shù)據(jù),鍵為justin,值為WeChat ID:ityunwei2017
OK
127.0.0.1:6379> get justin   #根據(jù)鍵取值
"WeChat ID:ityunwei2017"
127.0.0.1:6379> exists justin    #查看鍵是否存在
(integer) 1
127.0.0.1:6379> exists justin1
(integer) 0
127.0.0.1:6379> del justin    #刪除當(dāng)前key
(integer) 1
127.0.0.1:6379> exists justin
(integer) 0
127.0.0.1:6379> keys *    #查看所有鍵
127.0.0.1:6379> dbsize    #鍵總數(shù)
127.0.0.1:6379>
127.0.0.1:6379> quit
[root@localhost src]# redis-benchmark -h 127.0.0.1 -p 6379 -n 10 -c 50

redis-benchmark -h 127.0.0.1 -p 6379 -n 10 -c 50    向redis服務(wù)器發(fā)送10個(gè)請(qǐng)求,每個(gè)請(qǐng)求附帶50個(gè)并發(fā)客戶端,-n 接請(qǐng)求數(shù),-c 接并發(fā)數(shù)  


Redis并沒(méi)有自己實(shí)現(xiàn)內(nèi)存池,沒(méi)有在標(biāo)準(zhǔn)的系統(tǒng)內(nèi)存分配器上再加上自己的東西。所以系統(tǒng)內(nèi)存分配器的性能及碎片率會(huì)對(duì)Redis造成一些性能上的影響。Redis在編譯時(shí),會(huì)先判斷是否使用tcmalloc,如果是,會(huì)用tcmalloc對(duì)應(yīng)的函數(shù)替換掉標(biāo)準(zhǔn)的libc中的函數(shù)實(shí)現(xiàn)。其次會(huì)判斷jemalloc是否使得,最后如果都沒(méi)有使用才會(huì)用標(biāo)準(zhǔn)的libc中的內(nèi)存管理函數(shù)。
從最新的版本中,jemalloc已經(jīng)作為源碼包的一部分包含在源碼包中,所以可以直接被使用。而如果你要使用tcmalloc的話,是需要自己安裝的。


與標(biāo)準(zhǔn)的glibc庫(kù)的malloc相比,TCMalloc在內(nèi)存的分配上效率和速度要高得多,可以在很大程度上提高MySQL服務(wù)器在高并發(fā)情況下的性能,降低系統(tǒng)負(fù)載。

tcmalloc(Thread-Caching Malloc)是google-proftools( http://code.google.com/p/gperftools/downloads/list)中的一部分,所以我們實(shí)際上需要安裝google-proftools。64位操作系統(tǒng)需先安裝libunwind庫(kù)(32位操作系統(tǒng)不要安裝)
libunwind
庫(kù)為基于64位CPU和操作系統(tǒng)的程序提供了基本的堆棧輾轉(zhuǎn)開(kāi)解功能,其中包括用于輸出堆棧跟蹤的API、用于以編程方式輾轉(zhuǎn)開(kāi)解堆棧的API以及支持C++異常處理機(jī)制的API。

  • 編譯環(huán)境

[root@justin ~]# yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel 


  • 安裝tcmalloc包

wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
tar zxvf libunwind-0.99-alpha.tar.gz
cd libunwind-0.99-alpha/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
  • 安裝google-preftools包

wget http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz
tar zxvf google-perftools-1.8.1.tar.gz
cd google-perftools-1.8.1/
./configure  --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
make && make install
sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  #如果沒(méi)有這個(gè)文件,自己建一個(gè)
sudo /sbin/ldconfig
cd /usr/local/lib
ln -sv libtcmalloc_minimal.so.4.1.2 libtcmalloc.so
  • 安裝Redis包

cd redis-4.11
make PREFIX=/opt/redis USE_TCMALLOC=yes FORCE_LIBC_MALLOC=yes
make install
  • 對(duì)于tcmalloc,jemalloc和libc對(duì)應(yīng)的三個(gè)內(nèi)存分配器。其性能和碎片率如何,可以使用Redis自帶的redis-benchmark寫入等量數(shù)據(jù)進(jìn)行測(cè)試
    1、測(cè)試數(shù)據(jù)都是小數(shù)據(jù),也就是說(shuō)單條數(shù)據(jù)并不大時(shí),采用tcmalloc時(shí)碎片率是最低的,為1.01,jemalloc為1.02,而libc的分配器碎片率為1.31
    2、設(shè)置benchmark的-d參數(shù),將value值調(diào)整為1k大小,采用tcmalloc時(shí)碎片率是最低的,為1.02,jemalloc為1.01,而libc的分配器碎片率為1.04


四、Redis配置多實(shí)例

多實(shí)例比較簡(jiǎn)單,通過(guò)不通配置文件就可以生成不通的實(shí)例,這里我們生成100歌實(shí)例為例

先將默認(rèn)的配置文件配置好,例如端口、日志名稱、數(shù)據(jù)文件名等改成帶有端口號(hào)表示的(根據(jù)自己的愛(ài)好來(lái)定義)

[root@localhost ~]# vim /app/redis/etc/redis.conf
...
port 6979
pidfile /var/run/redis_6979.pid
logfile /app/redis/logs/redis_6979.log
dbfilename 6979.rdb
...
[root@localhost ~]# for n in `seq 8000 8099`;do cp redis.conf redis$n.conf && sed -i "s/6379/$n/g" redis$n.conf;done
[root@localhost ~]# for n in `seq 8000 8099`;do /app/redis/bin/redis-server /app/redis/etc/redis$n.conf;done


五、Redis主從配置

Redis的主從復(fù)制功能非常強(qiáng)大,一個(gè)master可以擁有多個(gè)slave,而一個(gè)slave又可以擁有多個(gè)slave,如此下去,形成了強(qiáng)大的多級(jí)服務(wù)器集群架構(gòu)。

1、redis主不需要特別配置,按照正常配置即可

2、redis從,需要在配置文件里指定redis主

我這里在一臺(tái)主機(jī)上配置多實(shí)例做為主從

[root@localhost etc]# vim redis6380.conf
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
# masterauth <master-password>   如果master設(shè)置了驗(yàn)證密碼,還需配置masterauth
masterauth justin

啟動(dòng)master、slave的redis執(zhí)行info命令查看結(jié)果:

master

[root@localhost etc]# ../bin/redis-cli -h 127.0.0.1 -p 6379 -a justin
127.0.0.1:6379> info
# Replication
role:master       #主
connected_slaves:3  #3個(gè)從連接信息
slave0:ip=127.0.0.1,port=6380,state=online,offset=2314790043,lag=1 
slave1:ip=127.0.0.1,port=6381,state=online,offset=2314790043,lag=1
slave2:ip=127.0.0.1,port=6382,state=online,offset=2314790043,lag=1
master_replid:10f3abe30f7ff3991dd6a15ccccd4ebdce1bb35a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2314790043
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2313741468
repl_backlog_histlen:1048576

slave

[root@localhost etc]# ../bin/redis-cli  -p 6380
127.0.0.1:6380> info 
# Replication
role:slave   #從
master_host:127.0.0.1
master_port:6379
master_link_status:up   #狀態(tài)為UP說(shuō)明和主連接上了,否則為down
master_last_io_seconds_ago:1                #距離最后一次的連接時(shí)間
master_sync_in_progress:0                    #同步主服務(wù)器進(jìn)程數(shù)
slave_repl_offset:2320002171
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:10f3abe30f7ff3991dd6a15ccccd4ebdce1bb35a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2320002171
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2318953596
repl_backlog_histlen:1048576

此時(shí)在master里set個(gè)值,在slave里get就可以得到該值說(shuō)明配置成功

slave:6380   master:6379

[root@localhost bin]# ./redis-cli -p 6380 -a abcdef
127.0.0.1:6380> keys *
(empty list or set)
127.0.0.1:6380> quit
[root@localhost bin]# ./redis-cli -p 6379 -a 123456
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set justin 51cto
OK
127.0.0.1:6379> get justin
"51cto"
127.0.0.1:6379> quit
[root@localhost bin]# ./redis-cli -p 6379 -a 123456
127.0.0.1:6379> keys *
1) "justin"
127.0.0.1:6379> quit
[root@localhost bin]# ./redis-cli -p 6380 -a abcdef
127.0.0.1:6380> keys *
1) "justin"
127.0.0.1:6380> set justin1 51cto   #Slave不可以寫,只可以讀
(error) READONLY You can't write against a read only slave.
127.0.0.1:6380> quit
[root@localhost bin]# ./redis-cli -p 6379 -a 123456
127.0.0.1:6379> del justin
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> exit
[root@localhost bin]# ./redis-cli -p 6380 -a abcdef
127.0.0.1:6380> keys *
(empty list or set)
127.0.0.1:6380>


六、最大緩存設(shè)置

示例:maxmemory 100mb 

單位:mb,gb。

默認(rèn)不限制,如果有新的數(shù)據(jù)添加,超過(guò)最大內(nèi)存,則會(huì)使redis崩潰,設(shè)置最好為物理內(nèi)存的3/4,或者比例更小,因?yàn)閞edis復(fù)制數(shù)據(jù)等其他服務(wù)時(shí),也是需要緩存的。以防緩存數(shù)據(jù)過(guò)大致使redis崩潰,造成系統(tǒng)出錯(cuò)不可用。設(shè)置maxmemory之后,配合的要設(shè)置緩存數(shù)據(jù)回收策略。

當(dāng)maxmemory限制到達(dá)的時(shí)候,Redis將采取的準(zhǔn)確行為是由maxmemory-policy配置指令配置的。
(1)、noeviction:當(dāng)?shù)竭_(dá)內(nèi)存限制時(shí)返回錯(cuò)誤。當(dāng)客戶端嘗試執(zhí)行命令時(shí)會(huì)導(dǎo)致更多內(nèi)存占用(大多數(shù)寫命令,除了DEL和一些例外)。

(2)、allkeys-lru:回收最近最少使用(LRU)的鍵,為新數(shù)據(jù)騰出空間。

(3)、volatile-lru:回收最近最少使用(LRU)的鍵,但是只回收有設(shè)置過(guò)期的鍵,為新數(shù)據(jù)騰出空間。

(4)、allkeys-random:回收隨機(jī)的鍵,為新數(shù)據(jù)騰出空間。

(5)、volatile-random:回收隨機(jī)的鍵,但是只回收有設(shè)置過(guò)期的鍵,為新數(shù)據(jù)騰出空間。

(6)、volatile-ttl:回收有設(shè)置過(guò)期的鍵,嘗試先回收離TTL最短時(shí)間的鍵,為新數(shù)據(jù)騰出空間。

如果數(shù)據(jù)呈現(xiàn)冪律分布,也就是一部分?jǐn)?shù)據(jù)訪問(wèn)頻率高,一部分?jǐn)?shù)據(jù)訪問(wèn)頻率低,則使用allkeys-lru,如果數(shù)據(jù)呈現(xiàn)平等分布,也就是所有的數(shù)據(jù)訪問(wèn)頻率都相同,則使用allkeys-random。


redis啟動(dòng)時(shí)日志的幾個(gè)報(bào)警錯(cuò)誤

1、The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128

TCP  backlog設(shè)置值,511沒(méi)有成功,因?yàn)?/proc/sys/net/core/somaxconn這個(gè)設(shè)置的是更小的128;baklog參數(shù)實(shí)際控制的是已經(jīng)3次握手成功的還在accept queue的大小。

echo 511 > /proc/sys/net/core/somaxconn (將其寫入/etc/rc.local文件中)


2、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.

overcommit_memory參數(shù)設(shè)置為0!在內(nèi)存不足的情況下,后臺(tái)程序save可能失敗。建議在文件 /etc/sysctl.conf 中將overcommit_memory修改為1。

echo "vm.overcommit_memory=1" > /etc/sysctl.conf


3、you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue 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 thesetting after a reboot. Redis must be restarted after THP is disabled.

使用的是透明大頁(yè),可能導(dǎo)致redis延遲和內(nèi)存使用問(wèn)題。執(zhí)行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 修復(fù)該問(wèn)題。

echo never > /sys/kernel/mm/transparent_hugepage/enabled (將其寫入/etc/rc.local文件中)

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI