1. 程式人生 > 其它 >redis高階用法、持久化、主從

redis高階用法、持久化、主從

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