Nosql——Redis配置與優化

DingLiZhe714發表於2020-12-20

一.資料庫及資料分類

1.儲存資料型別

結構化資料:可以通過二維表格形式表達這個資料
非結構化資料:不方便以二維表的形式表達這種型別的資料

2.根據不同種儲存資料型別分類分成兩種不同的資料庫

結構化資料庫(sql):裡面儲存的資料型別是結構化資料。(關係型資料庫)
非結構化資料庫(nosql):裡面儲存的資料型別是非結構化資料。(非關係型資料庫)

3.資料庫種類

關係型資料庫:Oracle、Mysql、SQLServer、MicrosoftAccess、DB2等
非關係型資料庫:Redis、MoryDB、Hbase、CouhDB等

二.非關係型資料庫產生的背景

High performance——對資料庫高併發讀寫需求
High storage——對海量資料高效儲存與訪問的需求
High scalability && High Availability——對資料庫高擴充套件性與高可用性需求

三.Redis簡介

1.Redis基於記憶體執行並支援持久化

2.採用key-value(鍵值對)的儲存形式

3.優點

具有極高的資料讀寫速度
支援豐富的資料型別
支援資料的持久化
原子性
支援資料備份

4.五種資料型別

string(字串)
hash(雜湊)
list(列表)
set(集合)
zset (sorted set:有序集合)

(1)strry

1.是redis最基本型別 ,二進位制安全的,最大儲存512M。
例項:  set鍵  設定鍵值對          get鍵   獲取鍵值對
 Set string1   8
 Get string1
 8
 Incr string1    //自增
 9
 Decr string1    //自減
 8
 Decrby string1 2   //設定減少值
 6
 Incrby string1 5     //設定增加值
 11

(2)Hash

1. 一個鍵值對集合(key=>value)
2.是一個string型別的filed和value的對映表
3.特別適合用於儲存物件
例項:
hset hash1 key1 a	#hset新增hash資料
hset hash1 key2 b
hset hash1 key3 c
hset hash1 field1 a1 field2 a2
hget hash1 key1		//hget獲取hash資料
hmget hash1 key1 key2 key3		//hmget獲取多個hash資料
hmget hash1 filed1 filed2

(3)List

1. Redis列表是簡單的字串列表,按照插入順序,可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)
例項:
Lpush:從左邊推入值
Lpop:從左邊彈出值
Rpush:從右邊推入值
Rpop:從右邊彈出值
Lien:檢視某個list資料型別的長度
Lrange List1 列出所有List1的值(從0開始排)

(4)set

Redis的set是string型別的無序集合
集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)
例項:
sadd set1 12	#sadd key member新增一個string元素到key對應的set集合中,成功返回1,如果元素已經在集合中返回0
1
sadd set1 13
1
sadd set1 12
0
scard set1		//scard檢視set資料中存在的元素個數
2
sismember set1 11		//sismember判斷set資料中是否     存在某個元素
0
sismember set1 13
1
srem set1 13		//srem刪除某個set資料中的元素
1
sismember set1 13
0
smember set1      //列出所有set1的值 

(5)zset

1.Redis zset和set一樣也是string型別元素的集合,且不允許重複的值
2.不同的是每個元素都會關聯一個double型別的分數,redis正是通過分數來為集合中的成員進行從小到大的排序
3.zset的成員是唯一的,但分數(score)卻可以重複
例項:
zadd zset1 1.1 val1		//zadd key score member天啊及    元素到集合,元素在集合中存在則更新對應score
zadd zset1 2.2 val2
zcard		#查詢
zrang			#資料排序

四.redis配置

1.安裝部署

# 安裝必要安裝包
yum install gcc gcc-c++ -y 
# 掛載必要軟體包
mount.cifs //192.168.100.3/mem /mnt
#解壓安裝包
cd /mnt
tar zxvf redis-5.0.7.tar.gz -C /opt
# 編譯安裝
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis/ install
#進入util目錄,執行指令碼
cd utils/
./install_server.sh
# 執行後一路回車在這裡新增/usr/local/redis/bin/redis-    server一句
Please select the redis executable path [ ]     /usr/local/redis/bin/redis-server

# 建立命令連線
ln -s /usr/local/redis/bin/* /usr/local/bin 

netstat -ntap | grep 6379    //檢視服務是否開啟
#使用/etc/init.d/redis_6379可以控制服務的開啟和關閉
/etc/init.d/redis_6379 stop //停止服務
/etc/init.d/redis_6379 start //啟動服務

2.配置檔案

配置引數

bind:監聽的主機地址
port: 埠
daemonize yes:啟用守護程式
pidfile:指定PID檔案
loglevel notice:日誌級別
logfile:指定日誌檔案

3.Redis資料庫常用命令

Redis-cil命令列工具

1.連線本地資料庫
  redis-cil
2.連線遠端資料庫
   redis-cil -h 192.168.45.131 -p 6379
3.獲取命令幫助
   127.0.0.1:6379> help @list
   127.0.0.1:6379> help set
4.set:存放資料
   127.0.0.1:6379> set teacher lisi
5.get:獲取資料
   127.0.0.1:6379> get teacher

key相關命令

1.keys:獲取符合規則的鍵值列表
  127.0.0.1:6379> keys *           //檢視當前資料庫中所有的鍵
  127.0.0.1:6379> keys v*          //檢視當前資料庫中以v開頭的鍵
  127.0.0.1:6379> keys v?          //檢視當前資料庫中以v開頭後面包含任意一個字元的鍵
  127.0.0.1:6379> keys v??         //看當前資料庫中以v開頭後面包含任意二個字元的鍵

2.exists:判斷鍵值是否存在
 127.0.0.1:6379> exists teacher
 127.0.0.1:6379> exists tes

3.del:刪除當前資料庫的指定key
127.0.0.1:6379> del teacher

4.type:獲取key對應的value值型別
5.rename(覆蓋)/renamenx(不覆蓋):對已有的key進行重新命名
  127.0.0.1:6379> rename teacher tea

6.dbsize:檢視當前資料庫中key的數目
  127.0.0.1:6379> dbsize

4.redis-benchmark測試工具

-h:指定伺服器主機
-p:指定伺服器埠
-c:指定併發連線數
-n:指定請求書
-d:以位元組的形式指定SET/GET值的資料大小
-q:強制退出redis。僅顯示query/sec值

向IP地址192.168.45.131.埠為6379的redis伺服器傳送100個併發連線與100000個請求測試效能

redis-benchmark -h 192.168.45.131 -p 6379 -c 100 -n 100000

測試存取大小為100位元組的資料包的效能

redis-benchmark -h 192.168.45.131 -p 6379 -q -d 100

五.Redis多資料庫操作

Redis支援多資料庫,預設支援16個資料庫,0-15命名
多個資料庫相互獨立,互不干擾

1.多資料庫常用命令

多資料庫間切換

127.0.0.1:6379> select 10 //預設在第一個資料庫中
OK
127.0.0.1:6379[10]> select 15
OK
127.0.0.1:6379[15]>  

多資料庫間移動資料

127.0.0.1:6379[15]> move k1 3   //將k1鍵移動到資料庫3中 

清除資料庫內資料

127.0.0.1:6379> flushdb
127.0.0.1:6379> flushall     //慎用,清除所有資料庫資料

六.Redis持久化

1.持久化概述

1.Redis是執行在記憶體中,記憶體中的資料斷電丟失
2.為了能夠重用Redis資料,或者放置系統故障,我們需要將Redis中的資料寫入到磁碟空間中,即持久化

2.持久化分類

RDB方式:建立快照的方式獲取某一時刻Redis中所有資料的副本
AOF方式:將執行的寫入命令寫到檔案的末尾,以日誌的方式來記錄資料的變化

(1)RDB持久化

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

觸發條件

在指定的時間間隔內,執行指定次數的寫操作(配置檔案控制)
執行save或者是bgsave(非同步)命令
執行flushall命令,清空資料庫所有資料
執行shutdown命令,保證伺服器正常關閉且不丟失任何資料

優缺點

適合大規模的資料恢復
如果業務對資料的完整性和一致性要求不高,RDB是很好的選擇
資料的完整性和一致性不高
備份是佔用記憶體

通過RDB檔案恢復資料

將dump.rdb檔案拷貝到redis的安裝目錄的bin目錄下,重啟redis服務即可

配置檔案選項

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          //是否進行壓縮

(2)AOF持久化

Redis預設不開啟
彌補RDB的不足(資料的不一致性)
採用日誌的形式來記錄每個寫操作,並追加到檔案中
Redis重啟會根據日誌檔案的內容將寫入指令從前到後執行一次以完成資料的恢復工作

根據AOF檔案恢復資料

 將appendonly.aof檔案拷貝到redis的安裝目錄的bin目錄下,重啟redis服務即可

配置檔案選項

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 重寫配置

vim /etc/redis/6379.conf
# 在日誌進行BGPWRITEAOF時,如果設定為yes表示新寫入操作不進行同步fsync,只是暫存在快取區裡,避免造成磁碟IO操作衝突,等重寫完成後在寫入。redis中預設為no
no-appendfsunc-on-rewrite no

# 當前AOF檔案大小是上次日誌重寫時AOF檔案大小兩倍時,發生    BGPEWRITEAOF操作
auto-aof-rewrite-percentage 100

# 當前AOF檔案執行BGPEWRITEAOF命令的最小值,避免剛開始啟動Redis時由於檔案尺寸較小導致頻繁的BGPEWRITEAOF
auto-aof-rewrite-min-size 64mb

七.Redis效能管理

1.檢視redis記憶體使用

redis-cil
127.0.0.1:6379> info memory
used-memory:2650536
used-memory-human: 2.53M        //記憶體使用量

mem_fragmentation_ratio:4.57         //記憶體碎片

2.記憶體碎片率

作業系統分配的記憶體值used_memory_rss除以redis使用的記憶體值used_memory計算得出

記憶體碎片是由作業系統低效的分配/回收實體記憶體導致的

不連續的實體記憶體分配

跟蹤記憶體碎片率對理解redis示例的資源效能是非常重要的

記憶體碎片率稍大於1是合理的,這個值表示記憶體碎片率比較低
記憶體碎片率超過1.5,說明redis消耗了實際需要實體記憶體的150%,其中的50%是記憶體碎片率
記憶體碎片率低於1的,說明Redis記憶體分配超出實體記憶體,作業系統正在進行記憶體交換

3.記憶體使用率

redis例項的記憶體使用率超過可用最大記憶體,作業系統將開始進行記憶體與swap空間交換

避免記憶體交換

針對快取資料大小選擇
儘可能的使用Hash資料結構
設定key的過期時間

4.回收key

保證合理分配的redis有顯示的記憶體資源

當記憶體使用達到設定的最大閾值時,需要選擇一種key的回收策略

預設情況下回收策略是禁止刪除
redis.com配置檔案中修改maxmemory-policy屬性值

-volatile-lru:使用LRUS演算法從已設定過期時間的資料集合中淘汰資料
-volatile-ttl:從已設定過期時間的資料集合中挑選即將過期的資料淘汰
-volatile-random:從已設定過期時間的資料集合中隨機挑選資料淘汰
-alikeys-lru:使用LRU演算法從所有資料集合中淘汰資料
-alikeys-random:從資料集合中任意選擇資料淘汰
-no-enviction:禁止淘汰資料

相關文章