redis高階用法、持久化、主從
阿新 • • 發佈:2022-03-08
redis高階用法
1 redis高階用法之慢查詢
慢查詢是一個先進先出的佇列 # 通過配置檔案,兩個引數配置慢查詢 slowlog-max-len 慢查詢是一個先進先出的佇列 固定長度 儲存在記憶體中 slowlog-max-len 慢查詢閾值(單位:微秒) slowlog-log-slower-than=0,記錄所有命令 slowlog-log-slower-than <0,不記錄任何命令 # 只要時間超過配置的時候,命令就會放在佇列中 slowlog-max-len 1000 slowlog-log-slower-than 1000 # 後期從檢視佇列中有哪些慢命令,避免這些慢命令的執行 slowlog get [n] #獲取慢查詢佇列 ''' 日誌由4個屬性組成: 1)日誌的標識id 2)發生的時間戳 3)命令耗時 4)執行的命令和引數 ''' slowlog len #獲取慢查詢佇列長度 slowlog reset #清空慢查詢佇列 # slowlog-max-len 不要設定過大,預設10ms,通常設定1ms # slowlog-log-slower-than不要設定過小,通常設定1000左右
2 pipline事務
# 事務四個特性 事務隔離級別
# redis其實不支援事務,但是可以通過pipline來實現事務
# 本質:將一批命令,批量打包,在redis服務端批量計算(執行),然後把結果批量返回,
# execute才真正執行
# pipeline每次只能作用在一個Redis的節點上 (單臺redis例項做,叢集,沒有pipline功能)
import redis pool = redis.ConnectionPool(host='10.211.55.4', port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) #建立pipeline pipe = r.pipeline(transaction=True) #開啟事務 pipe.multi() pipe.set('name', 'lqz') #其他程式碼,可能出異常 pipe.set('role', 'nb') pipe.execute() # 這句話命令才真執行
3 釋出訂閱
釋出訂閱:觀察者模式 ,只要訂閱了你,你變化,我就能收到
# 釋出訊息
publish 頻道名 "hello world"
publish souhu:tv "hello world" #在souhu:tv頻道釋出一條hello world 返回訂閱者個數
# 訂閱訊息
subscribe souhu:tv #訂閱sohu:tv頻道
# 取消訂閱
unsubscribe [channel] #取消訂閱一個或多個頻道
4 點陣圖
# 本質就是字串,直接操作位元位 setbit getbit bitcount 統計1的個數,按位元組 一個位元組8個位元位 # 獨立使用者統計: int8 int16 int64 2的七次方-1 2的16次方-1 2的63次方-1 4個byte # 總結 1 點陣圖型別是string型別,最大512M 2 使用setbit時偏移量如果過大,會有較大消耗 3 點陣圖不是絕對好用,需要合理使用,數量上千萬級別可以使用 redis key值有沒有大小限制 我們沒有超過最大限制,但是他應該是有
5 HyperLogLog
# 超小記憶體去重,極小的空間完成獨立數量統計
pfadd uuids "uuid1" "uuid2" "uuid3" "uuid4" #向uuids中新增4個uuid
pfcount uuids #返回4
# 只能統計個數,不能取出原來的值,只能能做統計和去重
# 優點:佔記憶體很小
# 相對應的:布隆過濾器,去重 (超小記憶體去重) 白名單黑名單用到布隆過濾器
通過雜湊函式開設一個數組,所有資料全部置為0,一個元素過來時,通過雜湊函式得到不同的雜湊值,找到對應的陣列下表 並變為1,
查詢時 通盈通過雜湊函式求值,再去尋找對應下標,如果都是1 那麼你就在,如果有一個不是1那麼你就不在
但是,人無完人,他也有缺陷,有錯誤率,錯誤率大小取決於陣列的位數和雜湊函式的個數
https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11969224.html
https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11969232.html
示例一 不知道長度
#ScalableBloomFilter 可以自動擴容
from pybloom_live import ScalableBloomFilter
#指定錯誤率
bloom = ScalableBloomFilter(initial_capacity=100, error_rate=0.001, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
url = "www.cnblogs.com"
url2 = "www.liuqingzheng.top"
bloom.add(url)
print(url in bloom)
print(url2 in bloom)
示例一 知道長度
#BloomFilter 是定長的
from pybloom_live import BloomFilter
#指定長度
bf = BloomFilter(capacity=1000)
url='www.baidu.com'
bf.add(url)
print(url in bf)
print("www.liuqingzheng.top" in bf)
# 動態連結庫
dll檔案
so檔案
c---》exe
# python之間呼叫動態連結庫
6 GEO
#地理資訊定位
geoadd cities:locations 116.28 39.55 beijing #把北京地理資訊新增到cities:locations中
geoadd cities:locations 117.12 39.08 tianjin
geoadd cities:locations 114.29 38.02 shijiazhuang
geoadd cities:locations 118.01 39.38 tangshan
geoadd cities:locations 115.29 38.51 baoding
# geopos cities:locations beijing #獲取北京地理資訊
# geodist cities:locations beijing tianjin km #北京到天津的距離,89公里
# georadiusbymember cities:locations beijing 150 km
# geo本質時zset型別
# 可以使用zset的刪除,刪除指定member:zrem cities:locations beijing
7 兩種持久化方案
# 啥是持久化
redis的所有資料儲存在記憶體中,對資料的更新將非同步的儲存到硬碟上
# 兩種持久化方案
快照:某時某刻資料的一個完成備份,
-mysql的Dump
-redis的RDB
寫日誌:任何操作記錄日誌,要恢復資料,只要把日誌重新走一遍即可
-mysql的 Binlog
-Redis的 AOF
# 三種:混合持久化(rdb+aof)
# RDB方案 耗時耗效能,不可控,可能會丟失資料
-方式一:客戶端敲:save 同步操作,阻塞其他命令的執行
-方式二:客戶端敲:bgsave 非同步操作
-方式三:配置檔案,一旦觸發這個條件,執行bgsave
save 900 1
save 300 10
save 60 10000
如果60s中改變了1w條資料,自動生成rdb
如果300s中改變了10條資料,自動生成rdb
如果900s中改變了1條資料,自動生成rdb
# rdb最佳配置方案
#最佳配置
save 900 1
save 300 10
save 60 10000
dbfilename dump-6379.rdb #以埠號作為檔名,可能一臺機器上很多reids,不會亂
dir /bigdiskpath #儲存路徑放到一個大硬碟位置目錄
stop-writes-on-bgsave-error yes #出現錯誤停止
rdbcompression yes #壓縮
rdbchecksum yes #校驗
# ### AOF方案
#客戶端每寫入一條命令,都記錄一條日誌,放到日誌檔案中,如果出現宕機,可以將資料完全恢復
# AOF的三種策略 本質就是三個引數 優缺點看下面圖片
always:redis–》寫命令重新整理的緩衝區—》每條命令fsync到硬碟—》AOF檔案
everysec(預設值):redis——》寫命令重新整理的緩衝區—》每秒把緩衝區fsync到硬碟–》AOF檔案
no:redis——》寫命令重新整理的緩衝區—》作業系統決定,緩衝區fsync到硬碟–》AOF檔案
# AOF重寫
本質就是把過期的,無用的,重複的,可以優化的命令,來優化
這樣可以減少磁碟佔用量,加速恢復速度
## 如果從客戶端連結:只需要在客戶端敲:bgrewriteaof 命令,觸發aof重寫
## 最佳配置,都在配置檔案中寫
appendonly yes #將該選項設定為yes,開啟
appendfilename "appendonly.aof" #檔案儲存的名字
appendfsync everysec #採用第二種策略
no-appendfsync-on-rewrite yes #在aof重寫的時候,是否要做aof的append操作,因為aof重寫消耗效能,磁碟消耗,正常aof寫磁碟有一定的衝突,這段期間的資料,允許丟失
auto-aof-rewrite-min-size 100 #檔案尺寸
auto-aof-rewrite-percentage 10 #檔案增長率
#
8 主從搭建
# 一旦搭建好主從,從庫不能再寫入資料
# 原理
1. 副本庫通過slaveof 127.0.0.1 6379命令,連線主庫,併發送SYNC給主庫
2. 主庫收到SYNC,會立即觸發BGSAVE,後臺儲存RDB,傳送給副本庫
3. 副本庫接收後會應用RDB快照
4. 主庫會陸續將中間產生的新的操作,儲存併發送給副本庫
5. 到此,我們主複製集就正常工作了
6. 再此以後,主庫只要發生新的操作,都會以命令傳播的形式自動傳送給副本庫.
7. 所有複製相關資訊,從info資訊中都可以查到.即使重啟任何節點,他的主從關係依然都在.
8. 如果發生主從關係斷開時,從庫資料沒有任何損壞,在下次重連之後,從庫傳送PSYNC給主庫
9. 主庫只會將從庫缺失部分的資料同步給從庫應用,達到快速恢復主從的目的
# 主庫是否要開啟持久化
-如果不開有可能,主庫重啟操作,造成所有主從資料丟失!
# 方式一 :從庫敲命令
從庫敲:slaveof 127.0.0.1 6379
主庫或者從庫敲 info 檢視主從資訊
slaveof no one
#方式二:配置檔案
# 在從庫上配置
slaveof 127.0.0.1 6379
slave-read-only yes