1. 程式人生 > 資料庫 >Redis配置優化

Redis配置優化

Redis配置優化

Redis配置檔案部分引數介紹

配置引數(/etc/redis/6379.conf)
bind:監聽的主機地址
port:埠
daemonize yes:啟用守護程序
pidfile:指定PID檔案
loglevel notice:日誌級別
logfile:指定日誌檔案

Redis資料庫常用命令

redis-cli命令列工具

連線資料庫

  • 連線本地資料庫
[root@server1 utils]# redis-cli 
127.0.0.1:6379>
  • 連線遠端資料庫
[root@server1 utils]# redis-cli -h 192.168.10.14 -p 6379
192.168.10.14:6379>

存放、獲取資料

set:存放資料
get:獲取資料

192.168.10.14:6379> set name tony
OK
192.168.10.14:6379> keys *
1) "name"
192.168.10.14:6379> get name
"tony"

key相關命令

  • keys:獲取符合規則的鍵值列表
#keys *:檢視所有鍵;萬用字元*和?都支援
192.168.10.14:6379> keys nam?
1) "name"
192.168.10.14:6379> keys na??
1) "name"
  • exists:判斷鍵值是否存在
192.168.10.14:6379> exists name
(integer) 1    #執行失敗返回0,執行成功返回非0值
  • del:刪除當前資料庫的指定key
192.168.10.14:6379> keys *
1) "name"
2) "age"
192.168.10.14:6379> del age
(integer) 1
192.168.10.14:6379> keys *
1) "name"
  • type:獲取key對應的value值型別
192.168.10.14:6379> type name
string
  • rename(覆蓋)/renamenx(不覆蓋):對已有的key進行重新命名
192.168.10.14:6379> rename name mingzi
OK
  • dbsize:檢視當前資料庫中key的數目
192.168.10.14:6379> dbsize
(integer) 1

redis-benchmark測試工具(壓測)

  • 向IP地址為192.168.10.14、埠為6379的Redis伺服器傳送100個併發連線與10000個請求測試效能
[root@server1 ~]# redis-benchmark -h 192.168.10.14 -p 6379 -c 100 -n 10000
  • 測試存取大小為100位元組的資料包的效能
[root@server1 ~]# redis-benchmark -h 192.168.10.14 -p 6379 -q -d 100

Redis多數庫操作

  • Redis支援多資料庫,預設支援16個數據庫,0-15命名
  • 多資料庫相互獨立,互不干擾
  • 多資料庫常用命令
    多資料庫間切換
    多資料庫間移動資料
    清除資料庫內資料
127.0.0.1:6379> select 5   #選擇資料庫5
OK
127.0.0.1:6379[5]> set age 5  #建立鍵名age,值5
OK
127.0.0.1:6379[5]> keys *  
1) "age"
127.0.0.1:6379[5]> move age 1  #移動鍵值到資料庫1
(integer) 1
127.0.0.1:6379[5]> select 1
OK
127.0.0.1:6379[1]> keys *
1) "age"
  • Redis支援存物件
例如:物件是student
127.0.0.1:6379> hset student name lisi
(integer) 1
127.0.0.1:6379> hset student age 18
(integer) 1
127.0.0.1:6379> hset student score 90
(integer) 1
127.0.0.1:6379> keys *
1) "student"
127.0.0.1:6379> hget student name
"lisi"
127.0.0.1:6379> hget student age
"18"

Redis持久化

  • 持久化概述
    Redis是執行在記憶體中,記憶體中的資料斷電丟失
    為了能夠重用Redis資料,或者防止系統故障,需要將Redis中的資料寫入到磁碟空間中,即持久化
  • 持久化分類
    RDB方式:建立快照的方式獲取某一時刻Redis中所有資料的副本
    (缺點:只能是一個時刻,不可以連續,存在盲區,可能導致少量資料丟失)
    AOF方式:將執行的寫命令寫到檔案的末尾,以日誌的方式來記錄資料的變化
    (缺點:日誌檔案的量多,人力成本大)
  • 注意:
    生產環境RDB+AOF方式,兩個快照中間部分採用AOF方式,查詢日誌中對應時間的寫命令

RDB持久化

Redis預設的持久化方式
預設檔名為dump.rdb

[root@server1 ~]# cd /var/lib/redis/6379/
[root@server1 6379]# ll
總用量 232
-rw-r--r--. 1 root root 233881 12月 21 15:59 dump.rdb
  • 觸發條件
    在指定的時間間隔內,執行指定次數的寫操作(配置檔案控制)
    執行save或者是bgsave(非同步)命令
    執行flushall命令,清空資料庫所有資料
    執行shutdown命令,保證伺服器正常關閉且不丟失任何資料
  • 優缺點
    適合大規模的資料恢復
    如果業務對資料完整性和一致性要求不高,RDB是很好的選擇
    資料的完整性和一致性不高
    備份時佔用記憶體
  • 通過RDB檔案恢復資料
    將dump.rdb檔案拷貝到redis的安裝目錄的bin目錄下,重啟redis服務即可
[root@server1 ~]# vim /etc/redis/6379.conf
save 900 1    #900秒之內至少一次寫操作
save 300 10  #300秒內至少10次操作
save 60 10000 #60秒內至少10000次寫操作
#只要滿足其一都會觸發快照操作,註釋所有的save項表示關閉RDB
dbfilename dump.rdb  #RDB檔名稱
dir /var/lib/redis/6379  #RDB檔案路徑
rdbcompression yes   #是否進行壓縮

AOF持久化

1、Redis預設不開啟
2、彌補RDB的不足(資料的不一致性)
3、採用日誌的形式來記錄每個寫操作,並追加到檔案中
4、Redis重啟會根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作
5、根據AOF檔案恢復資料
將appendonly.aof檔案拷貝到redis安裝目錄的bin目錄下,重啟redis服務即可
6、配置檔案選項

[root@server1 ~]# vim /etc/redis/6379.conf
appendonly yes  #開啟AOF持久化
appendfilename "appendonly.aof"   #AOF檔名稱
#appendfsync always     #同步持久化,每次發生資料變化會立刻寫入磁碟;
appendfsync everysec    #預設推薦,每秒非同步記錄一次(預設值)
#appendfsync no      #不同步,交給作業系統決定如何同步
aof-load-truncated yes   #忽略最後一條可能存在問題的指令
  • AOF的重寫機制
    AOF的工作原理是將寫操作追加到檔案中,檔案的冗餘內容會越來越多
    當AOF檔案的大小超過所設定的閥值時,Redis就會對AOF檔案的內容壓縮
  • AOF的重寫的原理
    Redis會fork出一條新程序,讀取記憶體中的資料(並沒有讀取舊檔案),並重新寫到一個臨時檔案中,最後替換舊的aof檔案
  • AOF的重寫配置
[root@redis 6379]# vim /etc/redis/6379.conf 
no-appendfsync-on-rewrite no	#在日誌進行BGREWRITEAOF時, 如果設定為yes表示新寫操作不進行同步fsync,只暫存在緩衝區裡,避免造成磁碟I0操作衝突,等重寫完成後在寫入。redis中預設為no
auto-aof-rewrite-percentage 100	#當前AOF檔案大小是上次日誌重寫時AOF檔案大小兩倍時,發生BGREWRITEAOF操作
auto-aof-rewrite-min-size 64mb	#當前AOF檔案執行BGREWRITEAOF命令的最小值,避免剛開始啟動Reids時由於檔案尺寸較小導致頻繁的BGREWRITEAOF.當AOF檔案到達64M的時候,發生BGREWRITEAOF操作

Redis效能管理

檢視Redis記憶體使用

[root@server1 ~]# redis-cli
127.0.0.1:6379> info memory
#Memory
used_memory:11315280                #記憶體使用總量
used_memory_human:10.79M
...省略內容
mem_fragmentation_ratio:1.76      #記憶體碎片率
mem_fragmentation_bytes:8566768  

記憶體碎片率介紹

1、作業系統分配的記憶體值used_memory_rss除以redis使用的記憶體值
used_ memory計算得出
2、記憶體碎片是由作業系統低效的分配/回收物理記憶體導致的
不連續的實體記憶體分配
3、跟蹤記憶體碎片率對理解redis例項的資源效能是非常重要的
記憶體碎片率稍大於1是合理的,這個值表示記憶體碎片率比較低
記憶體碎片率超過1.5,說明redis消耗了實際需要實體記憶體的150%,其中50%是 記憶體碎片率
記憶體碎片率低於1的,說明Redis記憶體分配超出了實體記憶體,作業系統正在進行記憶體交換
(記憶體碎片率為1是最佳,低於1訪問速度會慢,高於1說明碎片太多)

記憶體使用率介紹

1、redis例項的記憶體使用率超過可用最大記憶體,作業系統將開始進行
記憶體與swap空間交換(這時redis響應速度會變慢)
2、避免記憶體交換
針對快取資料大小選擇
儘可能的使用Hash資料結構
設定key的過期時間

如何回收key

1、保證合理分配redis有限的記憶體資源
2、當達到設定的最大閾值時,需選擇一種key的回收策略
預設情況下回收策略是noeviction(禁止收回)
/etc/redis/6379.conf配置檔案中修改maxmemory-policy屬性值
volatile-lru:使用LRU演算法從已設定過期時間的資料集合中淘汰資料
volatile-ttl:從已設定過期時間的資料集合中挑選即將過期的資料淘汰(建議使用)
volatile-random:從已設定過期時間的資料集合中隨機挑選資料淘汰
allkeys-lru:使用LRU演算法從所有資料集合中淘汰資料
allkeys-random:從資料集合中任意選擇資料淘汰
no-enviction:禁止淘汰資料
去掉#註釋後,配置檔案一定要頂格寫