背景:工作需要澈驼,處理的數(shù)據(jù)需要通過(guò)redis進(jìn)行緩存處理筛武,之后方便統(tǒng)計(jì)分析徘六。
目標(biāo):python連接redis進(jìn)行讀取&寫(xiě)入待锈。
連接 redis 與 redis集群 是不同的 !!柴信!
一随常、連接redis
單一的連接redis上的某一個(gè)節(jié)點(diǎn)
import redis
pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
r = redis.StrictRedis(connection_pool=pool)
keys = r.keys() #獲取所有的鍵
r.set('test001','123456') #寫(xiě)新的值
r.get('test001') #查詢(xún)值
二绪氛、連接redis集群
Redis集群是一個(gè)節(jié)點(diǎn)集合枣察,在調(diào)用一個(gè)節(jié)點(diǎn)時(shí)其它節(jié)點(diǎn)都會(huì)響應(yīng)询件。
如果直接使用redis包操作可能會(huì)報(bào)錯(cuò)
redis.exceptions.ResponseError: MOVED 6918 127.0.0.1:6381
報(bào)錯(cuò)原因:因?yàn)閞edis由單節(jié)點(diǎn)變?yōu)榧和鹄牛鴓ython的redis連接包暫時(shí)還不支持redis集群連接方式嘿辟,需要更換連接包
解決方法: 可以使用rediscluster連接redis集群红伦,注意其中依賴(lài)redis包的版本昙读,否則會(huì)報(bào)錯(cuò)唠叛。
redis-py-cluster說(shuō)明文檔
pip install redis-py-cluster
完成后再次進(jìn)行連接
# -*- coding:utf-8 -*-
from rediscluster import StrictRedisCluster
nodes = [{"host": "localhost", "port": "6379"}]
r = StrictRedisCluster(startup_nodes=nodes, decode_responses=True)
r.set('test', 111)
三调鲸、常見(jiàn)說(shuō)明
1定拟、版本報(bào)錯(cuò)
隨著導(dǎo)入的不同的redis版本會(huì)報(bào)錯(cuò)
unknow command "CONFIG"
配置一個(gè)跳過(guò)檢查的參數(shù) skip_full_coverage_check=True 就可以了
r = StrictRedisCluster(startup_nodes=nodes, decode_responses=True,skip_full_coverage_check=True)
2雷滚、危險(xiǎn)操作
一下操作可能會(huì)直接影響數(shù)據(jù)庫(kù)呆万,使用中必須注意3龅I椅袒炉!
刪除數(shù)據(jù)
r.flushall() #刪除所有數(shù)據(jù)
r.flushdb() #刪除所有數(shù)據(jù)庫(kù)下的數(shù)據(jù)
遍歷查詢(xún)keys
r.keys()
平時(shí)keys()命令獲取所有鍵芋哭,但是如果數(shù)據(jù)量多大的話,遍歷一次可能會(huì)引起生產(chǎn)事故
Redis的KEYS命令引起宕機(jī)事件
3句各、scan命令初厚,進(jìn)行模糊查詢(xún)
既然keys()有如此危險(xiǎn)的隱患绪杏,可能keys()被禁止使用僧著。
那么我們讀取未知的鍵應(yīng)該怎么辦呢盹愚?
這個(gè)時(shí)候可以使用scan遍歷數(shù)據(jù)庫(kù)
python redis常用操作說(shuō)明
scan(cursor=0, match=None, count=None) 增量式迭代獲取毅舆,redis里匹配的的name【推薦使用下面的方法】
cursor憋活,游標(biāo)(基于游標(biāo)分批取獲取數(shù)據(jù))
match悦即,匹配指定key辜梳,默認(rèn)None 表示所有的
keycount作瞄,每次分片最少獲取個(gè)數(shù)粉洼,默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)
簡(jiǎn)單來(lái)說(shuō) cursor默認(rèn)為 0属韧。如果遍歷完全則返回 0,否則返回其他游標(biāo)会傲。
match 就是模糊查詢(xún) eg: 'test*'
keycount 一次遍歷返回的個(gè)數(shù)
from rediscluster import StrictRedisCluster
nodes = [{"host": "localhost", "port": "6379"}]
r = StrictRedisCluster(startup_nodes=nodes, decode_responses=True,skip_full_coverage_check=True)
###遍歷讀取所有鍵
all_scan = r.scan(curson =0,match = 'AI*',count = 100000)
###將符合條件的值加入到列表中
all_keys = []
for i in all_scan:
iteration_num = all_scan[i][0]
all_keys = all_keys + all_scan[i][1]
###如果 iteration_num 淌山!= 0 的話泼疑,說(shuō)明一次遍歷還有數(shù)據(jù)沒(méi)有被遍歷完退渗。
while iteration_num 会油!= 0:
all_scan = r.scan(curson =iteration_num,match = 'AI*',count = 100000)
for i in all_scan:
iteration_num = all_scan[i][0]
all_keys = all_keys + all_scan[i][1]
這樣操作可以完成相當(dāng)于 redis中的模糊查詢(xún)都许。