python?實現(xiàn)?redis?數(shù)據(jù)庫的操作
一、安裝
- redis 是一個 Key-Value 數(shù)據(jù)庫
- Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希類型)等類型
pip install redis
二、連接
import redis # 方式一 r = redis.StrictRedis(host='localhost', port=6379, db=0) # 方式二 r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 方式三,連接池 pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(host='localhost', port=6379, decode_responses=True)
三、string基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 設(shè)置值并設(shè)置過期時間, ex單位: 秒 r.set('food', 'mutton', ex=3) # 獲取值 r.get('food') # 設(shè)置值并設(shè)置過期時間, px單位: 毫秒 r.set('food', 'beef', px=3) # nx=True時,則只有name不存在時,當(dāng)前set操作才執(zhí)行 r.set('fruit', 'watermelon', nx=True) # xx=True時,則只有name存在時,當(dāng)前set操作才執(zhí)行 r.set('fruit', 'watermelon', xx=True) # setnx設(shè)置值,只有name不存在時,執(zhí)行設(shè)置操作 r.setnx('fruit1', 'banana') # setex第一個參數(shù)是key,第二個是過期時間(秒),第三個是值 r.setex("fruit2", 5, "orange") # psetex第一個參數(shù)是key,第二個是過期時間(毫秒),第三個是值 r.psetex("fruit3", 5000, "apple") # 批量設(shè)置值 mset(*args, **kwargs) r.mset(k1="v1", k2="v2") # 批量獲取 r.mget('k1', 'k2') r.mget(['k1', 'k2']) # 設(shè)置新值并獲取原來的值 r.getset("food", "barbecue") # 獲取子序列(根據(jù)字節(jié)獲取,非字符) r.getrange("cn_name", 0, 2) r.getrange("en_name", 0, -1) # 修改字符串內(nèi)容,從指定字符串索引開始向后替換(新值太長時,則向后添加) r.setrange("en_name", 1, "ccc") # 對 name 對應(yīng)值的二進(jìn)制表示的位進(jìn)行操作 r.setbit(name, offset, value) # 獲取name對應(yīng)的值的二進(jìn)制表示中的某位的值,0或1 r.getbit("foo1", 0) # 獲取name對應(yīng)的值的二進(jìn)制表示中 1 的個數(shù) r.bitcount("foo",0,1) # 獲取多個值,并將值做位運算,將最后的結(jié)果保存至新的name對應(yīng)的值 r.bitop("AND","new","foo","foo1") # 返回name對應(yīng)值的字節(jié)長度(一個漢字3個字節(jié)) r.strlen("foo") # 自增 name 對應(yīng)的值,當(dāng) name 不存在時,則創(chuàng)建 name=amount,否則,則自增。 r.incr("foo", amount=1) # 自增 name對應(yīng)的值,當(dāng)name不存在時,則創(chuàng)建name=amount,否則,則自增。 r.incrbyfloat("foo1", amount=2.0) # 自減 name 對應(yīng)的值,當(dāng) name 不存在時,則創(chuàng)建 name=amount,否則,則自減。 r.decr("foo4", amount=3) # 在redis name對應(yīng)的值后面追加內(nèi)容 r.append("name", "haha")
四、hash基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # name對應(yīng)的hash中設(shè)置一個鍵值對(不存在,則創(chuàng)建;否則,修改) r.hset("hash1", "k1", "v1") # 在name對應(yīng)的hash中批量設(shè)置鍵值對 r.hmset("hash2", {"k2": "v2", "k3": "v3"}) # 在name對應(yīng)的hash中獲取根據(jù)key獲取value r.hmget("hash2", "k2", "k3") r.hmget("hash2", ["k2", "k3"]) # 取出所有的鍵值對 r.hgetall("hash1") # 得到所有鍵值對的格式 hash長度 r.hlen("hash1") # 得到所有的keys(類似字典的取所有keys) r.hkeys("hash1") # 得到所有的value(類似字典的取所有value) r.hvals("hash1") # 判斷成員是否存在(類似字典的in) r.hexists("hash1", "k4") # 刪除鍵值對 r.hdel("hash1", "k1") # 自增自減整數(shù) r.hincrby("hash1", "k3", amount=-1) # 自增自減浮點數(shù) r.hincrbyfloat("hash1", "k5", amount=-1.0) # 取值查看--分片讀取 r.hscan("hash1") # 利用yield封裝hscan創(chuàng)建生成器,實現(xiàn)分批去redis中獲取數(shù)據(jù) for item in r.hscan_iter('hash1'): print(item) print(r.hscan_iter("hash1"))
五、list基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 增加 (從左邊新增加)--沒有就新建 r.lpush("list1", 11, 22, 33) # 增加(從右邊增加)--沒有就新建 r.rpush("list2", 11, 22, 33) # 在name對應(yīng)的list中添加元素,只有name已經(jīng)存在時,值添加到列表的最左邊 r.lpushx("list10", 10) # 往已經(jīng)有的name的列表的右邊添加元素,沒有的話無法創(chuàng)建 r.rpushx("list2", 99) # 在name對應(yīng)的列表的某一個值前或后插入一個新值 r.linsert("list2", "before", "11", "00") # 修改(指定索引號進(jìn)行修改) r.lset("list2", 0, -11) # 刪除(指定值進(jìn)行刪除) r.lrem("list2", "11", 1) # 刪除并返回 r.lpop("list2") # 刪除列表最左邊的元素,并且返回刪除的元素 r.rpop("list2") # 刪除列表最右邊的元素,并且返回刪除的元素 # 刪除索引之外的值 r.ltrim("list2", 0, 2) # 根據(jù)索引號取值 r.lindex("list2", 0) # 移動 元素從一個列表移動到另外一個列表 r.rpoplpush("list1", "list2") # 移動 元素從一個列表移動到另外一個列表 可以設(shè)置超時 r.brpoplpush("list1", "list2", timeout=2) # 一次移除多個列表 r.blpop(["list10", "list11"], timeout=2) # 自定義增量迭代 def list_iter(name): """ 自定義redis列表增量迭代 :param name: redis中的name,即:迭代name對應(yīng)的列表 :return: yield 返回 列表元素 """ list_count = r.llen(name) for index in range(list_count): yield r.lindex(name, index)
六、set基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 新增 r.sadd("set1", 33, 44, 55, 66) # 獲取元素個數(shù) 類似于len r.scard("set1") # 獲取集合中所有的成員 r.smembers("set1") # 獲取集合中所有的成員--元組形式 r.sscan("set1") # 獲取集合中所有的成員--迭代器的方式 for i in r.sscan_iter("set1"): print(i) # 差集 r.sdiff("set1", "set2") # 差集--差集存在一個新的集合中 r.sdiffstore("set3", "set1", "set2") # 交集 r.sinter("set1", "set2") # 交集--交集存在一個新的集合中 r.sinterstore("set3", "set1", "set2") # 并集 r.sunion("set1", "set2") # 并集--并集存在一個新的集合 r.sunionstore("set3", "set1", "set2") # 判斷是否是集合的成員 類似in r.sismember("set1", 33) # 移動 將某個成員從一個集合中移動到另外一個集合 r.smove("set1", "set2", 44) # 刪除--隨機(jī)刪除并且返回被刪除值 r.spop("set2") # 刪除--指定值刪除 r.srem("set2", 11)
七、zset基本命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 新增 r.zadd("zset2", 'm1', 22, 'm2', 44) # 獲取有序集合元素個數(shù) 類似于len r.zcard("zset1") # 獲取有序集合的所有元素 r.zrevrange("zset1", 0, -1) # 獲取所有元素--迭代器 for i in r.zscan_iter("zset3"): # 遍歷迭代器 print(i) # 獲取name對應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個數(shù) r.zcount("zset3", 11, 22) # 自增 r.zincrby("zset3", "n2", amount=2) # 獲取值的索引號 r.zrank("zset3", "n1") # 刪除--指定值刪除 r.zrem("zset3", "n3") # 刪除--根據(jù)排行范圍刪除,按照索引號來刪除 r.zremrangebyrank("zset3", 0, 1) # 刪除--根據(jù)分?jǐn)?shù)范圍刪除 r.zremrangebyscore("zset3", 11, 22) # 獲取值對應(yīng)的分?jǐn)?shù) r.zscore("zset3", "n27")
八、其他通用命令
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 刪除 根據(jù)刪除redis中的任意數(shù)據(jù)類型 r.delete("gender") # 檢查名字是否存在 r.exists("zset1") # 模糊匹配 根據(jù)模型獲取redis的name r.keys("foo*") # 設(shè)置超時時間 r.expire("list5", time=3) # 重命名 r.rename("list5", "list5-1") # 隨機(jī)獲取name r.randomkey() # 獲取類型 r.type("set1") # 查詢所有的Key r.keys() # 當(dāng)前redis包含多少條數(shù)據(jù) r.dbsize() # 清空r中的所有數(shù)據(jù) r.flushdb()
九、管道命令
- redis默認(rèn)在執(zhí)行每次請求都會創(chuàng)建(連接池申請連接)和斷開(歸還連接池)一次連接操作
- 如果想要在一次請求中指定多個命令,則可以使用pipline實現(xiàn)一次請求指定多個命令
- 并且默認(rèn)情況下一次pipline 是原子性操作
- 管道(pipeline)是redis在提供單個請求中緩沖多條服務(wù)器命令的基類的子類
- 它通過減少服務(wù)器-客戶端之間反復(fù)的TCP數(shù)據(jù)庫包
- 從而大大提高了執(zhí)行批量命令的功能
import redis r = redis.Redis(host='localhost', port=6379, decode_responses=True) # 默認(rèn)的情況下,管道里執(zhí)行的命令可以保證執(zhí)行的原子性 # 默認(rèn) pipe = r.pipeline(transaction=True) # 禁止 pipe = r.pipeline(transaction=False) # 創(chuàng)建一個管道 pipe = r.pipeline() pipe.set('name', 'jack') pipe.set('role', 'sb') pipe.sadd('faz', 'baz') pipe.incr('num') pipe.execute() # 或者寫成 pipe.set('hello', 'redis').sadd('faz', 'baz').incr('num').execute() print(r.get("name")) print(r.get("role")) print(r.get("num"))
到此這篇關(guān)于python 包 redis 數(shù)據(jù)庫的操作教程的文章就介紹到這了,更多相關(guān) redis 數(shù)據(jù)庫操作 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實現(xiàn)大戰(zhàn)外星人小游戲?qū)嵗a
這篇文章主要介紹了python實現(xiàn)大戰(zhàn)外星人小游戲,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12Numpy中關(guān)于arctan和arctan2的區(qū)別
這篇文章主要介紹了Numpy中關(guān)于arctan和arctan2的區(qū)別,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09在Python中合并字典模塊ChainMap的隱藏坑【推薦】
在Python中,當(dāng)我們有兩個字典需要合并的時候,可以使用字典的 update 方法,接下來通過本文給大家介紹在Python中合并字典模塊ChainMap的隱藏坑,感興趣的朋友一起看看吧2019-06-06matplotlib 多個圖像共用一個colorbar的實現(xiàn)示例
這篇文章主要介紹了matplotlib 多個圖像共用一個colorbar的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09關(guān)于numpy中矩陣的翻轉(zhuǎn)(flip)
這篇文章主要介紹了關(guān)于numpy中矩陣的翻轉(zhuǎn)(flip),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06python pygame實現(xiàn)滾動橫版射擊游戲城市之戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了python pygame實現(xiàn)滾動橫版射擊游戲城市之戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11