电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

用python 批量操作redis數(shù)據(jù)庫

瀏覽:3日期:2022-06-25 16:44:14
方法一:使用 pipeline

使用pipelining 發(fā)送命令時,redis server必須部分請求放到隊列中(使用內(nèi)存)執(zhí)行完畢后一次性發(fā)送結(jié)果,在 pipeline 使用期間,將“獨占”鏈接,無法進行非“管道”類型的其他操作,直至 pipeline 關(guān)閉;如果 pipeline 的指令集很多很龐大,為了不影響其他操作(redis 最大時間lua-time-limit默認是5s),可以使用其他新建新鏈接操作。批量操作如下:

import redisr = redis.Redis(host=’127.0.0.1’, port=6379, password=’1234567890’)with r.pipeline() as ctx: a = time.time() ctx.hset(’current’, 'time2', a) ctx.hset(’current’, 'time3', a) res = ctx.execute() print('result: ', res)

使用 pipe line 以樂觀鎖的形式執(zhí)行事務(wù)操作

# -*- coding:utf-8 -*-import redisfrom redis import WatchErrorfrom concurrent.futures import ProcessPoolExecutorr = redis.Redis(host=’127.0.0.1’, port=6379)# 減庫存函數(shù), 循環(huán)直到減庫存完成# 庫存充足, 減庫存成功, 返回True# 庫存不足, 減庫存失敗, 返回Falsedef decr_stock(): # python中redis事務(wù)是通過pipeline的封裝實現(xiàn)的 with r.pipeline() as pipe: while True: try:# watch庫存鍵, multi后如果該key被其他客戶端改變, 事務(wù)操作會拋出WatchError異常pipe.watch(’stock:count’)count = int(pipe.get(’stock:count’))if count > 0: # 有庫存 # 事務(wù)開始 pipe.multi() # multi 判斷 watch 監(jiān)控的 key 是否被其他客戶端改變 pipe.decr(’stock:count’) # 把命令推送過去 # execute返回命令執(zhí)行結(jié)果列表, 這里只有一個decr返回當(dāng)前值 result = pipe.execute()[0] print('result: ', result) return Trueelse: return False except WatchError as e:# 打印WatchError異常, 觀察被watch鎖住的情況print(e.args) finally:pipe.unwatch()def worker(): while True: # 沒有庫存就退出 if not decr_stock(): break# 實驗開始# 設(shè)置庫存為100r.set('stock:count', 100)# 多進程模擬多個客戶端提交with ProcessPoolExecutor(max_workers=2) as pool: for _ in range(10): pool.submit(worker)方法二:使用 register_script

分布執(zhí)行,發(fā)送腳本到redis服務(wù)器,獲取一個本次連接的一個調(diào)用句柄,根據(jù)此句柄可以無數(shù)次執(zhí)行不同參數(shù)調(diào)用

import redisimport time r = redis.Redis(host=’127.0.0.1’, port=31320, password=’12345678’) lua = ''' local key = KEYS[1] local field = ARGV[1] local timestamp_new = ARGV[2] -- get timestamp of the key in redis local timestamp_old = redis.call(’hget’, key, field) -- if timestamp_old == nil, it means the key is not exist if timestamp_old == nil or timestamp_old == false or timestamp_new > timestamp_old then redis.call(’hset’, key, field .. 1, timestamp_new) -- timestamp_new > timestamp_old return redis.pcall(’hset’, key, field, timestamp_new) end ''' cmd = r.register_script(lua) cur_time = time.time() cmd(keys=[’current’], args=['time', cur_time])

register_script 調(diào)用 lua 來實現(xiàn),需要注意 redis.call(method, key, field) 的返回值(nil,false,1),此處沒有鍵值返回的是false。如果中間有錯誤,所有的語句不時不生效。

方法三:使用 script_load 和 evalsha

簡而言之,通過 script_load 發(fā)送給redis服務(wù)器,使加載 lua 腳本,并常駐內(nèi)存,返回標(biāo)志,通過 evalsha 按標(biāo)志進行執(zhí)行,此連接脫離本次redis 客戶端。

import redisimport time r = redis.Redis(host=’127.0.0.1’, port=31320, password=’12345678’) lua = ''' local key = KEYS[1] local field = ARGV[1] local timestamp_new = ARGV[2] -- get timestamp of the key in redis local timestamp_old = redis.call(’hget’, key, field) -- if timestamp_old == nil, it means the key is not exist if timestamp_old == nil or timestamp_old == false or timestamp_new > timestamp_old then redis.call(’hset’, key, field .. 1, timestamp_new) -- timestamp_new > timestamp_old return redis.pcall(’hset’, key, field, timestamp_new) end ''' sha = r.script_load(lua) print(r.evalsha(sha, 1, ’current’, ’time’, time.time()))

Redis 管理Lua腳本:(Python下為 script_... )

script load

此命令用于將Lua腳本加載到Redis內(nèi)存中

script exists

scripts exists sha1 [sha1 …] 此命令用于判斷sha1是否已經(jīng)加載到Redis內(nèi)存中

script flush

此命令用于清除Redis內(nèi)存已經(jīng)加載的所有Lua腳本,在執(zhí)行script flush后,所有 sha 不復(fù)存在。

script kill

此命令用于殺掉正在執(zhí)行的Lua腳本。

方法四:eval

使用方法與方法三類似,但是eval是一次性請求,每次請求,必須攜帶 lua 腳本

以上就是用python 批量操作redis數(shù)據(jù)庫的詳細內(nèi)容,更多關(guān)于python 批量操作redis數(shù)據(jù)庫的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 牛奶检测仪-乳成分分析仪-北京海谊| 包头市鑫枫装饰有限公司| 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画 | 新中天检测有限公司青岛分公司-山东|菏泽|济南|潍坊|泰安防雷检测验收 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 对夹式止回阀厂家,温州对夹式止回阀制造商--永嘉县润丰阀门有限公司 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 青海电动密集架_智能密集架_密集架价格-盛隆柜业青海档案密集架厂家 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 杭州高温泵_热水泵_高温油泵|昆山奥兰克泵业制造有限公司 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 | 挤出机_橡胶挤出机_塑料挤出机_胶片冷却机-河北伟源橡塑设备有限公司 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 压滤机-洗沙泥浆处理-压泥机-山东创新华一环境工程有限公司 | 山东成考网-山东成人高考网| 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 |