最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?實(shí)現(xiàn)?redis?數(shù)據(jù)庫(kù)的操作

 更新時(shí)間:2022年04月19日 17:30:21   作者:autofelix  
這篇文章主要介紹了python?包?redis?數(shù)據(jù)庫(kù)的操作教程,redis?是一個(gè)?Key-Value?數(shù)據(jù)庫(kù),下文基于python的相關(guān)資料展開(kāi)對(duì)redis?數(shù)據(jù)庫(kù)操作的詳細(xì)介紹,需要的小伙伴可以參考一下

一、安裝

  • redis 是一個(gè) Key-Value 數(shù)據(jù)庫(kù)
  • 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è)置過(guò)期時(shí)間, ex單位: 秒
r.set('food', 'mutton', ex=3)
# 獲取值
r.get('food')
# 設(shè)置值并設(shè)置過(guò)期時(shí)間, px單位: 毫秒
r.set('food', 'beef', px=3)
# nx=True時(shí),則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行
r.set('fruit', 'watermelon', nx=True)
# xx=True時(shí),則只有name存在時(shí),當(dāng)前set操作才執(zhí)行
r.set('fruit', 'watermelon', xx=True)
# setnx設(shè)置值,只有name不存在時(shí),執(zhí)行設(shè)置操作
r.setnx('fruit1', 'banana')
# setex第一個(gè)參數(shù)是key,第二個(gè)是過(guò)期時(shí)間(秒),第三個(gè)是值
r.setex("fruit2", 5, "orange")
# psetex第一個(gè)參數(shù)是key,第二個(gè)是過(guò)期時(shí)間(毫秒),第三個(gè)是值
r.psetex("fruit3", 5000, "apple")
# 批量設(shè)置值 mset(*args, **kwargs)
r.mset(k1="v1", k2="v2")
# 批量獲取
r.mget('k1', 'k2')
r.mget(['k1', 'k2'])
# 設(shè)置新值并獲取原來(lái)的值
r.getset("food", "barbecue")
# 獲取子序列(根據(jù)字節(jié)獲取,非字符)
r.getrange("cn_name", 0, 2)
r.getrange("en_name", 0, -1)
# 修改字符串內(nèi)容,從指定字符串索引開(kāi)始向后替換(新值太長(zhǎng)時(shí),則向后添加)
r.setrange("en_name", 1, "ccc")
# 對(duì) name 對(duì)應(yīng)值的二進(jìn)制表示的位進(jìn)行操作
r.setbit(name, offset, value)
# 獲取name對(duì)應(yīng)的值的二進(jìn)制表示中的某位的值,0或1
r.getbit("foo1", 0)
# 獲取name對(duì)應(yīng)的值的二進(jìn)制表示中 1 的個(gè)數(shù)
r.bitcount("foo",0,1)
# 獲取多個(gè)值,并將值做位運(yùn)算,將最后的結(jié)果保存至新的name對(duì)應(yīng)的值
r.bitop("AND","new","foo","foo1")
# 返回name對(duì)應(yīng)值的字節(jié)長(zhǎng)度(一個(gè)漢字3個(gè)字節(jié))
r.strlen("foo")
# 自增 name 對(duì)應(yīng)的值,當(dāng) name 不存在時(shí),則創(chuàng)建 name=amount,否則,則自增。
r.incr("foo", amount=1)
# 自增 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自增。
r.incrbyfloat("foo1", amount=2.0)
# 自減 name 對(duì)應(yīng)的值,當(dāng) name 不存在時(shí),則創(chuàng)建 name=amount,否則,則自減。
r.decr("foo4", amount=3)
# 在redis name對(duì)應(yīng)的值后面追加內(nèi)容
r.append("name", "haha")

四、hash基本命令

import redis

r = redis.Redis(host='localhost', port=6379, decode_responses=True)

# name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建;否則,修改)
r.hset("hash1", "k1", "v1")
# 在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì)
r.hmset("hash2", {"k2": "v2", "k3": "v3"})
# 在name對(duì)應(yīng)的hash中獲取根據(jù)key獲取value
r.hmget("hash2", "k2", "k3")
r.hmget("hash2", ["k2", "k3"])
# 取出所有的鍵值對(duì)
r.hgetall("hash1")
# 得到所有鍵值對(duì)的格式 hash長(zhǎng)度
r.hlen("hash1")
# 得到所有的keys(類似字典的取所有keys)
r.hkeys("hash1")
# 得到所有的value(類似字典的取所有value)
r.hvals("hash1")
# 判斷成員是否存在(類似字典的in)
r.hexists("hash1", "k4")
# 刪除鍵值對(duì)
r.hdel("hash1", "k1")
# 自增自減整數(shù)
r.hincrby("hash1", "k3", amount=-1)
# 自增自減浮點(diǎn)數(shù)
r.hincrbyfloat("hash1", "k5", amount=-1.0)
# 取值查看--分片讀取
r.hscan("hash1")
# 利用yield封裝hscan創(chuàng)建生成器,實(shí)現(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)

# 增加 (從左邊新增加)--沒(méi)有就新建
r.lpush("list1", 11, 22, 33)
# 增加(從右邊增加)--沒(méi)有就新建
r.rpush("list2", 11, 22, 33)
# 在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最左邊
r.lpushx("list10", 10)
# 往已經(jīng)有的name的列表的右邊添加元素,沒(méi)有的話無(wú)法創(chuàng)建
r.rpushx("list2", 99)
# 在name對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值
r.linsert("list2", "before", "11", "00")
# 修改(指定索引號(hào)進(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ù)索引號(hào)取值
r.lindex("list2", 0)
# 移動(dòng) 元素從一個(gè)列表移動(dòng)到另外一個(gè)列表
r.rpoplpush("list1", "list2")
# 移動(dòng) 元素從一個(gè)列表移動(dòng)到另外一個(gè)列表 可以設(shè)置超時(shí)
r.brpoplpush("list1", "list2", timeout=2)
# 一次移除多個(gè)列表
r.blpop(["list10", "list11"], timeout=2)
# 自定義增量迭代
def list_iter(name):
"""
自定義redis列表增量迭代
:param name: redis中的name,即:迭代name對(duì)應(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)
# 獲取元素個(gè)數(shù) 類似于len
r.scard("set1")
# 獲取集合中所有的成員
r.smembers("set1")
# 獲取集合中所有的成員--元組形式
r.sscan("set1")
# 獲取集合中所有的成員--迭代器的方式
for i in r.sscan_iter("set1"):
print(i)
# 差集
r.sdiff("set1", "set2")
# 差集--差集存在一個(gè)新的集合中
r.sdiffstore("set3", "set1", "set2")
# 交集
r.sinter("set1", "set2")
# 交集--交集存在一個(gè)新的集合中
r.sinterstore("set3", "set1", "set2")
# 并集
r.sunion("set1", "set2")
# 并集--并集存在一個(gè)新的集合
r.sunionstore("set3", "set1", "set2")
# 判斷是否是集合的成員 類似in
r.sismember("set1", 33)
# 移動(dòng) 將某個(gè)成員從一個(gè)集合中移動(dòng)到另外一個(gè)集合
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)
# 獲取有序集合元素個(gè)數(shù) 類似于len
r.zcard("zset1")
# 獲取有序集合的所有元素
r.zrevrange("zset1", 0, -1)
# 獲取所有元素--迭代器
for i in r.zscan_iter("zset3"): # 遍歷迭代器
print(i)
# 獲取name對(duì)應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個(gè)數(shù)
r.zcount("zset3", 11, 22)
# 自增
r.zincrby("zset3", "n2", amount=2)
# 獲取值的索引號(hào)
r.zrank("zset3", "n1")
# 刪除--指定值刪除
r.zrem("zset3", "n3")
# 刪除--根據(jù)排行范圍刪除,按照索引號(hào)來(lái)刪除
r.zremrangebyrank("zset3", 0, 1)
# 刪除--根據(jù)分?jǐn)?shù)范圍刪除
r.zremrangebyscore("zset3", 11, 22)
# 獲取值對(duì)應(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è)置超時(shí)時(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í)行每次請(qǐng)求都會(huì)創(chuàng)建(連接池申請(qǐng)連接)和斷開(kāi)(歸還連接池)一次連接操作
  • 如果想要在一次請(qǐng)求中指定多個(gè)命令,則可以使用pipline實(shí)現(xiàn)一次請(qǐng)求指定多個(gè)命令
  • 并且默認(rèn)情況下一次pipline 是原子性操作
  • 管道(pipeline)是redis在提供單個(gè)請(qǐng)求中緩沖多條服務(wù)器命令的基類的子類
  • 它通過(guò)減少服務(wù)器-客戶端之間反復(fù)的TCP數(shù)據(jù)庫(kù)包
  • 從而大大提高了執(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)建一個(gè)管道
pipe = r.pipeline()

pipe.set('name', 'jack')
pipe.set('role', 'sb')
pipe.sadd('faz', 'baz')
pipe.incr('num')
pipe.execute()

# 或者寫(xiě)成 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ù)庫(kù)的操作教程的文章就介紹到這了,更多相關(guān) redis 數(shù)據(jù)庫(kù)操作 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

城市| 天柱县| 余姚市| 长兴县| 宜黄县| 涟水县| 南召县| 平泉县| 江口县| 潍坊市| 新营市| 临武县| 汤原县| 重庆市| 古田县| 邹城市| 遵义市| 略阳县| 温州市| 淮南市| 新津县| 青海省| 永靖县| 永清县| 鄂州市| 榕江县| 乌鲁木齐县| 镇康县| 疏附县| 黔东| 广宗县| 开原市| 怀宁县| 奉化市| 吐鲁番市| 金坛市| 温宿县| 岗巴县| 潼关县| 吉隆县| 灌云县|