python 操作redis

Redis是一個基于內(nèi)存的鍵值對存儲系統(tǒng),常用作數(shù)據(jù)庫烂叔、緩存和消息代理谨胞。它支持字符串、字典蒜鸡、列表胯努、集合、有序集合逢防、位圖叶沛、地理位置、HyperLogLog等多種數(shù)據(jù)結(jié)構(gòu)胞四,所以常常被稱作為數(shù)據(jù)結(jié)構(gòu)服務(wù)器恬汁。Redis支持事務(wù)、切片辜伟、主從復(fù)制氓侧,支持RDB(將內(nèi)存中的數(shù)據(jù)保存在文件中)和AOF(類似于MySQL的binlog)兩種持久化方式,還支持訂閱分發(fā)导狡、Lua腳本约巷、集群(Redis3.0加入的功能)等特性。接下來記錄一下在Python中操作Redis:

安裝Redis

sudo apt-get install redis-server

安裝redis模塊

sudo pip install redis

配置redis.conf

redis.conf目錄:/etc/redis/redis.conf

將
bind 127.0.0.1
改為:
bind 0.0.0.0

使用如下命令使配置生效:

redis-server /etc/redis/redis.conf

操作模式

redis-py提供提供兩個類Redis和StrictRedis用于實現(xiàn)Redis的命令旱捧,StrictRedis用于實現(xiàn)大部分官方的命令,并使用官方的語法和命令独郎,Redis是StrictRedis的子類,用于向后兼容舊版本的redis-py

import redis
# "192.168.10.10"為遠(yuǎn)程Redis地址枚赡,port為Redis默認(rèn)端口號
client = redis.Redis(host="192.168.10.10",port=6379)
# 存儲鍵值對
client.set("name","python")
# 取出key為"name"的鍵對應(yīng)的值
client.get("name")

連接池

redis-py使用connection pool來管理對一個redis server的所有連接氓癌,避免每次建立、釋放連接的開銷贫橙。默認(rèn)每個Redis實例都會維護(hù)一個自己的連接池贪婉。可以直接建立一個連接池卢肃,然后作為參數(shù)Redis疲迂,這樣就可以實現(xiàn)多個Redis實例共享一個連接池

import redis
pool = redis.ConnectionPool(host="192.168.10.10",port=6379)
r = redis.Redis(connection_pool=pool)
result = r.get("info")

常見操作

字符串相關(guān)操作

  • set(name,value,ex=None,px=None,nx=False,xx=False):設(shè)置鍵值

    • name:鍵
    • value:值
    • ex:過期時間(秒)
    • px:過期時間(毫秒)
    • nx:True時,name不存在才會執(zhí)行set操作
    • xx:True時莫湘,name存在才會執(zhí)行set操作
  • get(name):獲取鍵值

    • name:鍵
  • setnx(name,value):設(shè)置鍵值(name不存在則設(shè)置尤蒿,否則不做操作)

    • name:鍵
    • value:值
  • setex(name,value,time):設(shè)置鍵值(name存在會覆蓋)

    • name:鍵
    • value:值
    • time:過期時間(秒)
  • psetex(name,time_ms,value):設(shè)置鍵值(name存在會覆蓋)

    • name:鍵
    • time_ms:過期時間(毫秒)
    • value:值
  • mset(args,kwargs)*:批量設(shè)置鍵值

  • mget(keys,args)*:批量獲取鍵值

    • keys:鍵列表
    • args:鍵元組
  • getset(name,value):獲取舊值并設(shè)置新值

    • name:鍵
    • value:新值
  • setrange(name,offset,value):修改鍵值

    • name:鍵
    • offset:起始位置(從此位置開始修改),若name不存在,且offset>0幅垮,則在前面補(bǔ)上offset個0x00腰池,再加上value,為name的新值
    • value:值
  • getrange(name,start,end):獲取值并截取

    • name:鍵
    • start:起始位置(字節(jié)),包含起始位置
    • end:結(jié)束位置(字節(jié)),包含結(jié)束位置
  • setbit(name,offset,value):對name對應(yīng)的值的二進(jìn)制位進(jìn)行操作

  • getbit(name,offset):對name對應(yīng)的值的二進(jìn)制位進(jìn)行操作

  • strlen(name):獲取name對應(yīng)值的長度

    • name:鍵
  • incr(name,amount):name不存在,則name=amount,name存在示弓,則name對應(yīng)的值+amount

    • name:鍵
    • amount:自增值
  • decr(name,amount):name不存在演怎,則name=amount,name存在避乏,則name對應(yīng)的值-amount

    • name:鍵
    • amount:自減值
  • append(key,value):在key對應(yīng)的值后面追加value

    • name:鍵
    • value:追加的值
  • hset(name,key,value):存儲字典

    • name:鍵
    • key:字典的key
    • value:字典的值
  • hget(name,key):獲取name對應(yīng)的字典中對應(yīng)key的值

    • name:鍵
    • key:字典的key
  • hmset(name,mapping):存儲字典

    • name:鍵
    • mapping:字典爷耀,如:{“info”:”shenzhen”,”age”:18}
  • hmget(name,keys,args)*:獲取字典的值

    • name:鍵
    • keys:字典鍵,如:hmget(“name”,[“info”,”age”])
    • args:字典鍵,如:hmget(“name”,”info”,”age”)
  • hgetall(name):獲取字典(dict格式)

    • name:鍵
  • hlen(name):獲取字典的長度

    • name:鍵
  • hkeys(name):獲取字典的所有key

    • name:鍵
  • hvals(name):獲取字典的所有value

    • name:鍵
  • hexists(name,key):name對應(yīng)的字典中是否存在鍵key

    • name:鍵
    • key:字典的key
  • hdel(name,args)*:刪除name對應(yīng)的字典中的鍵值對

    • name:鍵
    • args:字典的key元組
  • hincrby(name,key,amount):name對應(yīng)的字典中拍皮,若key存在歹叮,則key對應(yīng)的值+amount,否則key=amount

    • name:鍵
    • key:字典中key
    • amount:自增值(整數(shù))
  • hincrbyfloat(name,key,amount):name對應(yīng)的字典中铆帽,若key存在咆耿,則key對應(yīng)的值+amount,否則key=amount

    • name:鍵
    • key:字典中key
    • amount:自增值(浮點數(shù))
  • hscan(name,cursor=0,match=None,count=None):迭代式獲取,對于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實現(xiàn)分片式獲取爹橱,避免一次性獲取完畢萨螺,將內(nèi)存稱爆

    • name:鍵
    • cursor:游標(biāo)
    • match:匹配的key,默認(rèn)None愧驱,表示所有的key
    • count:每次分片最少獲取個數(shù)慰技,默認(rèn)None表示采用Redis默認(rèn)分片個數(shù)
# 第一次
cursor1,data = r.hscan("province",cursor=0)
# 第二次
cursor2,data = r.hscan("province",cursor=cursor1)
...
依次迭代,當(dāng)返回的游標(biāo)值為0時表示全部獲取完畢组砚,值得注意的是只有當(dāng)"province"對應(yīng)的字典中含有大量數(shù)據(jù)時吻商,redis才會有采取分片操作(大概在513條數(shù)據(jù)左右)
  • hscan_iter(name,match,count):利用yield封裝hscan創(chuàng)建生成器,實現(xiàn)分批去redis中獲取數(shù)據(jù)

    • name:鍵
    • match:匹配的key糟红,默認(rèn)None艾帐,表示所有的key
    • count:每次分片最少獲取個數(shù),默認(rèn)None表示采用Redis默認(rèn)分片個數(shù)

列表相關(guān)操作

  • lpush(name,value)*:存儲列表(往前(左)插入)

    • name:鍵
    • value:值盆偿,格式:11柒爸,22,33事扭。值越后捎稚,在列表中存儲的位置越前
  • rpush(name,value)*:存儲列表(往后(右)插入)

    • name:鍵
    • value:值,格式:11句旱,22阳藻,33晰奖。值越后谈撒,在列表中存儲的位置越后
  • lpushx(name,value):在name對應(yīng)的list中添加元素,name不存在不操作

    • name:鍵
    • value:值匾南。值添加到列表的最前面
  • llen(name):獲取name對應(yīng)的list的長度

    • name:鍵
  • linsert(name,where,refvalue,value):在name對應(yīng)的list中refvalue的前后插入value

    • name:鍵
    • where:before或after
    • refvalue:list中的某個值啃匿,與where配合確定位置后插入value
    • value:插入的值
  • lset(name,index,value):修改name對應(yīng)的list中指定位置的值

    • name:鍵
    • index:索引位置
    • value:值
  • lrem(name, count, value):刪除name對應(yīng)的list中的指定值

    • name:鍵
    • count:0:刪除所有配到的指定值;count為正數(shù)時:從匹配到該值的位置時,刪除count個;count為負(fù)數(shù)時:從后往前匹配,從匹配到該值的位置時溯乒,刪除count個
    • value:刪除的指定值
  • lpop(name):刪除name對應(yīng)的list中的第一個值

    • name:鍵
  • lindex(name,index):獲取name對應(yīng)的list中指定位置的值

    • index:索引位置
  • lrange(name,start,end):獲取name對應(yīng)的list中切片后的值

    • name:鍵
    • start:起始位置(包括)
    • end:結(jié)束位置(包括)
  • ltrim(name,start,end):移除name對應(yīng)的list中夹厌,不在start-end之間的值

    • name:鍵
    • start:起始位置(包括)
    • end:結(jié)束位置(包括)
  • rpoplpush(src,dst):移除src對應(yīng)的list中最右邊(即最后)的元素,并將其加到dst中對應(yīng)list的最左邊(即最前)

    • src:鍵
    • dst:鍵
  • brpoplpush(src,dst,timeout=0):移除src對應(yīng)的list中最右邊(即最后的元素),并將其加到dst中對應(yīng)list的最左邊(即最前)

    • src:鍵
    • dst:鍵
    • timeout:當(dāng)src沒有值裆悄,阻塞矛纹!阻塞時間

集合相關(guān)操作

  • sadd(name,value):添加集合

    • name:鍵
    • value:值
  • scard(name):獲取集合元素的個數(shù)

    • name:鍵
  • sdiff(keys,args)*:獲取多個集合的差集

    • kyes:鍵
    • args:鍵
  • sdiffstore(dest,keys,args)*:獲取keys對應(yīng)集合,與args中多個集合的差集光稼,并將其設(shè)置為dest對應(yīng)的集合

    • dest:鍵
    • keys:鍵
    • args:鍵,若args為空或南,dest對應(yīng)的集合則為keys對應(yīng)的集合
  • sinter(keys,args)*:獲取多個集合的交集

    • keys:鍵
    • args:鍵
  • sinterstore(dest,keys,args):獲取keys對應(yīng)集合,與args中多個集合的交集艾君,并將其設(shè)置為dest對應(yīng)的集合

    • dest:鍵
    • keys:鍵
    • args:鍵,若args為空采够,dest對應(yīng)的集合則為keys對應(yīng)的集合
  • sismember(name,value):判斷value是否name對應(yīng)集合中的成員

    • name:鍵
    • value:值
  • smembers(name):獲取name對應(yīng)的集合

    • name:鍵
  • smove(src,dst,value):將src中對應(yīng)集合中的value移動到dst對應(yīng)的集合的最左邊(即最前面)

    • src:鍵
    • dst:鍵
    • value:值
  • spop(name):移除name對應(yīng)集合中最右邊(即最后面)的元素

    • name:鍵
  • srandmember(name,number=None):獲取name對應(yīng)集合中隨機(jī)元素

    • name:鍵
    • number:獲取number個元素,默認(rèn)取一個元素
  • srem(name,values)*:刪除name對應(yīng)集合中的某些元素

    • name:鍵
    • values:值
  • sunion(keys,args)*:獲取多個集合的并集

    • keys:鍵
    • args:鍵

有序集合相關(guān)操作

  • zadd(name,args,kwargs)*:在name對應(yīng)的有序集合中添加元素冰垄,分?jǐn)?shù)越小蹬癌,越靠前

    • name:鍵
    • args:鍵值對,例如:’n1’,1,’n2’,2
    • kwargs:鍵值對,例如:’n1’=1,’n2’=2
  • zcard(name):獲取name對應(yīng)的有序集合的元素個數(shù)

    • name:鍵
  • zcount(name,min,max):獲取name對應(yīng)的有序集合中虹茶,min<=分?jǐn)?shù)<=max中的元素個數(shù)

    • name:鍵
    • min:小值(分?jǐn)?shù))
    • max:大值(分?jǐn)?shù))
  • zincrby(name,value,amount):自增name對應(yīng)的有序集合中,value對應(yīng)的分?jǐn)?shù)+amount逝薪,若value不存在,則插入value=amount

    • name:鍵
    • value:值
    • amount:分?jǐn)?shù)自增值
  • zrange(name,start,end,desc=False,withscores=False,score_with_func=float):獲取name對應(yīng)的有序集合中,start<=下標(biāo)<=end的所有數(shù)據(jù)蝴罪。

    • name:鍵
    • start:起始位置
    • end:結(jié)束位置
    • desc:是否是倒序翼闽,默認(rèn)False
    • withscores:是否獲取分?jǐn)?shù),默認(rèn)False
    • score_with_func:分?jǐn)?shù)類型
  • zrank(name,value):獲取value在name對應(yīng)的有序集合中的下標(biāo)

    • name:鍵
    • value:值
  • zrem(name,values)*:刪除在name對應(yīng)的有序集合中value對應(yīng)的分?jǐn)?shù)

    • name:鍵
    • values:值,如:values=”n1”,”n2”
  • zremrangebyrank(name,min,max):刪除在name對應(yīng)的有序集合中,min<=下標(biāo)<=max的數(shù)據(jù)

    • name:鍵
    • min:小(下標(biāo))
    • max:大(下標(biāo))
  • zremrangebyscore(name,min,max):刪除在name對應(yīng)的有序集合中,min<=分?jǐn)?shù)<=max的數(shù)據(jù)

    • name:鍵
    • min:小(分?jǐn)?shù))
    • max:大(分?jǐn)?shù))
  • zscore(name,value):獲取name對應(yīng)的有序集合中value對應(yīng)的分?jǐn)?shù)

    • name:鍵
    • value:值
  • zinterstore(name,keys,aggregate=None):獲取name對應(yīng)的有序集合的交集洲炊,并使name指向這個交集

    • name:鍵
    • keys:多個有序集合的鍵的元組,例:keys=(“zlist1”,”zlist2”)
    • aggregate:聚合操作感局,值可以是:”MAX”,”MIN”,”SUM”,當(dāng)遇到值相同,分?jǐn)?shù)不同時暂衡,可以對分?jǐn)?shù)做操作:取大值询微、取小值或取和值
  • zunionstore(name,keys,aggregate=None):獲取name對應(yīng)的有序集合的并集,并使name指向這個并集

    • name:鍵
    • keys:多個有序集合的鍵的元組,例:keys=(“zlist1”,”zlist2”)
    • aggregate:聚合操作狂巢,值可以是:”MAX”,”MIN”,”SUM”,當(dāng)遇到值相同撑毛,分?jǐn)?shù)不同時,可以對分?jǐn)?shù)做操作:取大值唧领、取小值或取和值

其他常用操作

  • delete(names)*:刪除Redis中的任意數(shù)據(jù)類型

    • names:鍵
  • exists(name):判斷鍵是否存在

    • name:鍵
  • keys(pattern=””)*:獲取符合規(guī)則的所有鍵

    • pattern:通配符,默認(rèn)獲取所有藻雌。常見:”h”:h結(jié)尾的鍵;”h”:h開頭的鍵斩个;”hx”:h開頭,x結(jié)尾的鍵胯杭;”h[ae]x”:獲取名為hax或hex的鍵
  • expaire(name,time):設(shè)置超時時間

    • name:鍵
  • rename(src,dst):修改鍵名

    • src:舊鍵名
    • dst:新鍵名
  • move(name,db):將鍵移動至其他db

    • name:鍵
    • db:db序號
  • randomkey():隨機(jī)獲取key

  • type(name):獲取鍵對應(yīng)的數(shù)據(jù)類型

    • name:鍵

管道

redis-py默認(rèn)在執(zhí)行每次請求都會創(chuàng)建(連接池申請鏈接)和斷開(歸還連接池)一次鏈接操作。如果想要在一次請求中指定多個命令受啥,則可以使用pipeline實現(xiàn)一次請求指定多個命令

import redis

pool = redis.ConnectionPool(host="192.168.10.10",port=6379)
r = redis.Redis(connection_pool=pool)

pipe = r.pipeline(transaction=True)

pipe.set(name,value)
pipe.set(name2,value2)

pipe.execute()

設(shè)置密碼

修改Redis的配置文件/etc/redis/redis.conf

requirepass 123456

需重啟Redis生效

注意:redis的查詢速度是非匙龈觯快的鸽心,外部用戶一秒內(nèi)可以嘗試多大150K個密碼;所以密碼要盡量長(對于DBA 沒有必要必須記住密碼)居暖;

Redis的優(yōu)點

  • Web應(yīng)用中常需要將一些重要數(shù)據(jù)持久化到磁盤顽频,避免宕機(jī)等原因?qū)е聰?shù)據(jù)丟失。Redis會周期性把更新的數(shù)據(jù)寫入磁盤或者追加到命令日志中太闺,并且在此基礎(chǔ)上實現(xiàn)了主從同步糯景。而Memcached在進(jìn)程關(guān)閉之后數(shù)據(jù)就會丟失。
  • 一些業(yè)務(wù)為了簡化工作省骂,需要使用列表莺奸、集合這樣只有Redis才支持的數(shù)據(jù)結(jié)構(gòu)。相對于Memcached,Redis有更多的應(yīng)用場景
  • Redis提供了豐富的命令冀宴。比如灭贷,可以通過通配符查看線上已經(jīng)存在的鍵、判斷一個鍵是否存在(Memcached這點很不方便略贮,沒有設(shè)置緩存和設(shè)置的緩存為Nong不好區(qū)分)甚疟,方便的獲取服務(wù)器信息和統(tǒng)計數(shù)值等。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逃延,一起剝皮案震驚了整個濱河市览妖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揽祥,老刑警劉巖讽膏,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拄丰,居然都是意外死亡府树,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門料按,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奄侠,“玉大人,你說我怎么就攤上這事载矿÷⒊保” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵闷盔,是天一觀的道長弯洗。 經(jīng)常有香客問我,道長逢勾,這世上最難降的妖魔是什么牡整? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮敏沉,結(jié)果婚禮上果正,老公的妹妹穿的比我還像新娘。我一直安慰自己盟迟,他們只是感情好秋泳,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著攒菠,像睡著了一般迫皱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辖众,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天卓起,我揣著相機(jī)與錄音,去河邊找鬼凹炸。 笑死戏阅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啤它。 我是一名探鬼主播奕筐,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼变骡!你這毒婦竟也來了离赫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤塌碌,失蹤者是張志新(化名)和其女友劉穎渊胸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台妆,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡翎猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了接剩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片办成。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搂漠,靈堂內(nèi)的尸體忽然破棺而出迂卢,到底是詐尸還是另有隱情,我是刑警寧澤桐汤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布而克,位于F島的核電站,受9級特大地震影響怔毛,放射性物質(zhì)發(fā)生泄漏员萍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一拣度、第九天 我趴在偏房一處隱蔽的房頂上張望碎绎。 院中可真熱鬧螃壤,春花似錦、人聲如沸筋帖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽日麸。三九已至寄啼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間代箭,已是汗流浹背墩划。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留嗡综,地道東北人乙帮。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像极景,于是被迫代替她去往敵國和親蚣旱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 連接數(shù)據(jù)庫 StrictRedis ConnectionPool 構(gòu)造url方式連接到數(shù)據(jù)庫戴陡,有以下三種模式: S...
    cnkai閱讀 3,047評論 0 2
  • python操作Redis 一. Redis是什么 Redis 是一個開源(BSD許可)的塞绿,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系...
    shu_ke閱讀 3,826評論 0 9
  • Ubuntu下安裝redis 安裝redis 在 Ubuntu 系統(tǒng)安裝 Redi 可以使用以下命令: 啟動 Re...
    riverstation閱讀 920評論 0 0
  • 1、redis連接 redis提供兩個類Redis和StrictRedis用于實現(xiàn)Redis的命令恤批,StrictR...
    君惜丶閱讀 231,569評論 15 117
  • 歲月匆匆异吻,人來人往,一眨眼喜庞,走過了這么多年>骼恕!酸甜苦辣的相伴延都,有過感動雷猪,有過容忍,只有這兩顆心晰房,一直在碰撞著彼此的...
    紫水晶的她閱讀 151評論 0 0