日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

python的redis数据库连接与使用

發(fā)布時(shí)間:2023/11/28 生活经验 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的redis数据库连接与使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis

? redis是一個(gè)key-value存儲(chǔ)系統(tǒng)。和Memcached類似,它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都 支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排 序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤或者把修改操作寫(xiě)入追加的記錄文 件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。

一、Redis安裝和基本使用

1

2

3

4

wget http://download.redis.io/releases/redis-3.0.6.tar.gz

tar xzf redis-3.0.6.tar.gz

cd redis-3.0.6

make

?啟動(dòng)服務(wù)端

src/redis-server

啟動(dòng)客戶端

src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

二、Python操作Redis

?

sudo pip install redis
or
sudo easy_install redis
or
源碼安裝詳見(jiàn):https://github.com/WoLpH/redis-py

?

API使用

redis-py 的API的使用可以分類為:

  • 連接方式
  • 連接池
  • 操作
    • String 操作
    • Hash 操作
    • List 操作
    • Set 操作
    • Sort Set 操作
  • 管道
  • 發(fā)布訂閱

1、操作模式

redis-py提供兩個(gè)類Redis和StrictRedis用于實(shí)現(xiàn)Redis的命令,StrictRedis用于實(shí)現(xiàn)大部分官方的命令,并使用官方的語(yǔ)法和命令,Redis是StrictRedis的子類,用于向后兼容舊版本的redis-py。

?

#!/usr/bin/env python
# -*- coding:utf-8 -*-import redisr = redis.Redis(host='192.168.1.113', port=6379)
r.set('foo', 'Bar')
print r.get('foo')

?

2、連接池

redis-py使用connection pool來(lái)管理對(duì)一個(gè)redis server的所有連接,避免每次建立、釋放連接的開(kāi)銷。默認(rèn),每個(gè)Redis實(shí)例都會(huì)維護(hù)一個(gè)自己的連接池。可以直接建立一個(gè)連接池,然后作為參數(shù) Redis,這樣就可以實(shí)現(xiàn)多個(gè)Redis實(shí)例共享一個(gè)連接池。

?

#!/usr/bin/env python
# -*- coding:utf-8 -*-import redispool = redis.ConnectionPool(host='192.168.1.113', port=6379)r = redis.Redis(connection_pool=pool)
r.set('foo', 'Bar')
print r.get('foo')

?

3、操作

String操作,redis中的String在在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)value來(lái)存儲(chǔ)。如圖:

?

set(name, value, ex=None, px=None, nx=False, xx=False)

?

在Redis中設(shè)置值,默認(rèn),不存在則創(chuàng)建,存在則修改
參數(shù):ex,過(guò)期時(shí)間(秒)px,過(guò)期時(shí)間(毫秒)nx,如果設(shè)置為True,則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行xx,如果設(shè)置為True,則只有name存在時(shí),崗前set操作才執(zhí)行r.get("name")  # 獲取字段
b'haha'
r.set("name", "hehe", ex=5)  # 保留時(shí)長(zhǎng) 5秒
r.get("name")
b'hehe'
r.get("name")
r.set({'k1': 'v1', 'k2': 'v2'})  # 支持字典格式
r.get("k1")
b'v1'

?

mset(*args, **kwargs)

?

# 批量設(shè)置
r.mset(name="xixi", age=18)
r.get("name")
b'xixi'
r.get("age")
b'18'

?

mget(keys, *args)

# 批量獲取
r.mset(name="xixi", age=18)
r.mget("name", "age")
[b'xixi', b'18']
r.set("name", "koka")

getset(name, value)

# 設(shè)置新值并獲取原來(lái)的值
r.getset("name", "akok")
b'koka'
r.get("name")
b'akok'

getrange(key, start, end)

?

# 獲取子序列(根據(jù)字節(jié)獲取,非字符)
# 參數(shù):# name,Redis 的 name# start,起始位置(字節(jié))# end,結(jié)束位置(字節(jié))
# 如: "武沛齊" ,0-2表示 "武"r.set("parter", "柴少")
r.getrange("parter", 0, 2).decode()
'柴'

?

setrange(name, offset, value)

?

# 修改字符串內(nèi)容,從指定字符串索引開(kāi)始向后替換(新值太長(zhǎng)時(shí),則向后添加)
# 參數(shù):# offset,字符串的索引,字節(jié)(一個(gè)漢字三個(gè)字節(jié))# value,要設(shè)置的值r.set("name", 'ok')
# 修改字符串內(nèi)容,從指定字符串索引開(kāi)始向后替換
r.setrange("name", 0, "ko")
r.get("name")
b'ko'

?

setbit(name, offset, value)

?

# 對(duì)name對(duì)應(yīng)值的二進(jìn)制表示的位進(jìn)行操作# 參數(shù):# name,redis的name# offset,位的索引(將值變換成二進(jìn)制后再進(jìn)行索引)# value,值只能是 1 或 0ord('k')  # 107
ord('o')  # 111
# 107 => 0 1 1 0 1 0 1 1
# 111 => 0 1 1 0 1 1 1 1
r.setbit("name", 7, 0)
# 0 1 1 0 1 0 1 1 => 0 1 1 0 1 0 1 0  106 => j
r.get("name")
b'jo'
r.setbit("name", 15, 0)
# 0 1 1 0 1 1 1 1 => 0 1 1 0 1 1 1 0  110 => n
r.get("name")
b'jn'

?

getbit(name, offset)

?

# 獲取name對(duì)應(yīng)的值的二進(jìn)制表示中的某位的值 (0或1)
bin(ord('j')).replace('b', '')
'01101010'
bin(ord('n')).replace('b', '')
'01101110'
r.set("name", "jn")
r.getbit("name", "2")
1

?

bitcount(key, start=None, end=None)

?

# 獲取name對(duì)應(yīng)的值的二進(jìn)制表示中 1 的個(gè)數(shù)
# 參數(shù):# key,Redis的name# start,位起始位置# end,位結(jié)束位置
r.bitcount("name", 0, 1)
9
str(bin(ord('j')) + bin(ord('n'))).replace('b', '').count("1")
9

?

incr(self, name, amount=1)

?

# 自增 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自增。# 參數(shù):# name,Redis的name# amount,自增數(shù)(必須是整數(shù))# 注:同incrbyr.set('n', 1)
r.incr("n", '3')
4

?

incrbyfloat(self, name, amount=1.0)

?

# 自增 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自增。# 參數(shù):# name,Redis的name# amount,自增數(shù)(浮點(diǎn)型)r.incrbyfloat('n', 1)
3.0

?

decr(self, name, amount=1)

?

# 自減 name對(duì)應(yīng)的值,當(dāng)name不存在時(shí),則創(chuàng)建name=amount,否則,則自減。# 參數(shù):# name,Redis的name# amount,自減數(shù)(整數(shù))r.set('n', '2')
r.decr('n', 1)
1

?

append(key, value)

?

# 在redis name對(duì)應(yīng)的值后面追加內(nèi)容# 參數(shù):key, redis的namevalue, 要追加的字符串
r.append('n', 'a')
2
r.get("n")
b'1a'

?

Hash操作,redis中Hash在內(nèi)存中的存儲(chǔ)格式如下圖:

?

hset(name, key, value)

?

# name對(duì)應(yīng)的hash中設(shè)置一個(gè)鍵值對(duì)(不存在,則創(chuàng)建;否則,修改)# 參數(shù):# name,redis的name# key,name對(duì)應(yīng)的hash中的key# value,name對(duì)應(yīng)的hash中的value# 注:# hsetnx(name, key, value),當(dāng)name對(duì)應(yīng)的hash中不存在當(dāng)前key時(shí)則創(chuàng)建(相當(dāng)于添加)r.hset("h1", "name", "koka")
1
r.hget("h1", "name")
b'koka'

?

hmset(name, mapping)

?

# 在name對(duì)應(yīng)的hash中批量設(shè)置鍵值對(duì)# 參數(shù):# name,redis的name# mapping,字典,如:{'k1':'v1', 'k2': 'v2'}# 如:# r.hmset('xx', {'k1':'v1', 'k2': 'v2'})r.hmset('n1', {'k1': 'v1', 'k2': 'v2'})
r.hmget("n1", "k1", "k2")
[b'v1', b'v2']

hgetall(name)

# 獲取name對(duì)應(yīng)hash的所有鍵值
r.hgetall("n1")
{b'k2': b'v2', b'k1': b'v1'}

hlen(name)

# 獲取name對(duì)應(yīng)的hash中鍵值對(duì)的個(gè)數(shù)
r.hlen("n1")
2

hkeys(name)

# 獲取name對(duì)應(yīng)的hash中所有的key的值
r.hkeys("n1")
[b'k2', b'k1']

hvals(name)

# 獲取name對(duì)應(yīng)的hash中所有的value的值
r.hvals("n1")
[b'v2', b'v1']

hexists(name, key)

# 檢查name對(duì)應(yīng)的hash是否存在當(dāng)前傳入的key
r.hexists("n1", "k1")

hdel(name,*keys)

# 將name對(duì)應(yīng)的hash中指定key的鍵值對(duì)刪除
r.hdel("n1", "k1")
1

hincrby(name, key, amount=1)

# 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount
# 參數(shù):# name,redis中的name# key, hash對(duì)應(yīng)的key# amount,自增數(shù)(整數(shù))r.hincrby("n1", "k1", 1)
1

?

hincrbyfloat(name, key, amount=1.0)

?

# 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amount# 參數(shù):# name,redis中的name# key, hash對(duì)應(yīng)的key# amount,自增數(shù)(浮點(diǎn)數(shù))# 自增name對(duì)應(yīng)的hash中的指定key的值,不存在則創(chuàng)建key=amountr.hincrbyfloat("n1", "k1", 1)
2.0

?

hscan(name, cursor=0, match=None, count=None)

?

# 增量式迭代獲取,對(duì)于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實(shí)現(xiàn)分片的獲取數(shù)據(jù),并非一次性將數(shù)據(jù)全部獲取完,從而放置內(nèi)存被撐爆# 參數(shù):# name,redis的name# cursor,游標(biāo)(基于游標(biāo)分批取獲取數(shù)據(jù))# match,匹配指定key,默認(rèn)None 表示所有的key# count,每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)# 如:# 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)# ...# 直到返回值cursor的值為0時(shí),表示數(shù)據(jù)已經(jīng)通過(guò)分片獲取完畢r.hscan("n1")
(0, {b'k2': b'v2', b'k1': b'3'})

?

hscan_iter(name, match=None, count=None)

?

# 利用yield封裝hscan創(chuàng)建生成器,實(shí)現(xiàn)分批去redis中獲取數(shù)據(jù)# 參數(shù):# match,匹配指定key,默認(rèn)None 表示所有的key# count,每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)for i in r.hscan_iter("n1", match=None, count=None):print(i)
(b'k2', b'v2')
(b'k1', b'3')

?

List操作,redis中的List在在內(nèi)存中按照一個(gè)name對(duì)應(yīng)一個(gè)List來(lái)存儲(chǔ)。如圖:

?

lpush(name,values)

# 在name對(duì)應(yīng)的list中添加元素,每個(gè)新的元素都添加到列表的最左邊# 如:# r.lpush('oo', 11,22,33)# 保存順序?yàn)? 33,22,11# 擴(kuò)展:# rpush(name, values) 表示從右向左操作r.lpush("l1", [11, 22, 33, 44])
1
r.lpush("l1", [11, 22, 33, 44])
2
r.lrange("l1", '0', '3')
[b'[11, 22, 33, 44]', b'[11, 22, 33, 44]']r.lpush("l3", "AA", "BB", "CC", "DD")
1
r.lrange("l3",0,2)
[b'CC', b'BB', b'AA']

?

lpushx(name,value)

?

# 在name對(duì)應(yīng)的list中添加元素,只有name已經(jīng)存在時(shí),值添加到列表的最左邊# 更多:# rpushx(name, value) 表示從右向左操作r.lpushx("l2", "33")
0
r.lrange("l2",0,1)
[]

?

llen(name)

# name對(duì)應(yīng)的list元素的個(gè)數(shù)
r.llen("l1")
2

linsert(name, where, refvalue, value))

?

# 在name對(duì)應(yīng)的列表的某一個(gè)值前或后插入一個(gè)新值# 參數(shù):# name,redis的name# where,BEFORE或AFTER# refvalue,標(biāo)桿值,即:在它前后插入數(shù)據(jù)# value,要插入的數(shù)據(jù)r.lpush("l3", "AA", "BB", "CC", "DD")
r.lrange("l3", 0, 2)
[b'CC', b'BB', b'AA']r.linsert("l3", "AFTER", "CC", "cc")
r.lrange("l3", 0, 3)
[b'CC', b'cc', b'BB', b'AA']

?

r.lset(name, index, value)

?

# 對(duì)name對(duì)應(yīng)的list中的某一個(gè)索引位置重新賦值# 參數(shù):# name,redis的name# index,list的索引位置# value,要設(shè)置的值r.lset("l3", '2', 'Cc')
r.lrange("l3", '0', '5')
[b'DD', b'CC', b'Cc', b'BB', b'AA']

?

r.lrem(name, value, num)

?

# 在name對(duì)應(yīng)的list中刪除指定的值# 參數(shù):# name,redis的name# value,要?jiǎng)h除的值# num,  num=0,刪除列表中所有的指定值;# num=2,從前到后,刪除2個(gè);# num=-2,從后向前,刪除2個(gè)r.lrem("l3", 'Cc')
1
r.lrange("l3", '0', '4')
[b'DD', b'CC', b'BB', b'AA']

?

lpop(name)

?

# 在name對(duì)應(yīng)的列表的左側(cè)獲取第一個(gè)元素并在列表中移除,返回值則是第一個(gè)元素
# 更多:# rpop(name) 表示從右向左操作
r.lpop("l3")
b'DD'
r.lrange("l3", '0', '2')
[b'CC', b'BB', b'AA']

?

ltrim(name, start, end)

?

# 在name對(duì)應(yīng)的列表中移除沒(méi)有在start-end索引之間的值
# 參數(shù):# name,redis的name# start,索引的起始位置# end,索引結(jié)束位置r.ltrim("l3", "0", "1")
True
r.lrange("l3", '0', '3')
[b'CC', b'BB']

?

rpoplpush(src, dst)

?

# 從一個(gè)列表取出最右邊的元素,同時(shí)將其添加至另一個(gè)列表的最左邊
# 參數(shù):# src,要取數(shù)據(jù)的列表的name# dst,要添加數(shù)據(jù)的列表的name
r.lpush("l4", '11', '22', '33')
r.lpush("l5", '44', '55', '66')
r.rpoplpush("l4", "l5")
b'11'
r.lrange("l4", '0', '3')
[b'33', b'22']
r.lrange("l5", '0', '3')
[b'11', b'66', b'55', b'44']

?

blpop(keys, timeout)

?

# 將多個(gè)列表排列,按照從左到右去pop對(duì)應(yīng)列表的元素# 參數(shù):# keys,redis的name的集合# timeout,超時(shí)時(shí)間,當(dāng)元素所有列表的元素獲取完之后,阻塞等待列表內(nèi)有數(shù)據(jù)的時(shí)間(秒), 0 表示永遠(yuǎn)阻塞# 更多:# r.brpop(keys, timeout),從右向左獲取數(shù)據(jù)r.blpop("l5", timeout=1)
(b'l5', b'11')
r.lrange("l5",0,3)
[b'66', b'55', b'44']

?

lindex(name, index)

#在name對(duì)應(yīng)的列表中根據(jù)索引獲取列表元素
>>> r.lrange("l3",0,3)
[b'CC', b'cc', b'BB', b'AA']
>>> r.lindex("l3","0")
b'CC'

自定義增量迭代

?

# 由于redis類庫(kù)中沒(méi)有提供對(duì)列表元素的增量迭代,如果想要循環(huán)name對(duì)應(yīng)的列表的所有元素,那么就需要:# 1、獲取name對(duì)應(yīng)的所有列表# 2、循環(huán)列表
# 但是,如果列表非常大,那么就有可能在第一步時(shí)就將程序的內(nèi)容撐爆,所有有必要自定義一個(gè)增量迭代的功能: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)# 使用
for item in list_iter('l3'):print(item)

?

Set操作,Set集合就是不允許重復(fù)的列表

sadd(name,values)

# name對(duì)應(yīng)的集合中添加元素

scard(name)

# 獲取name對(duì)應(yīng)的集合中元素個(gè)數(shù)

sdiff(keys, *args)

# 在第一個(gè)name對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的集合的元素集合

sdiffstore(dest, keys, *args)

# 獲取第一個(gè)name對(duì)應(yīng)的集合中且不在其他name對(duì)應(yīng)的集合,再將其新加入到dest對(duì)應(yīng)的集合中

sinter(keys, *args)

# 獲取多一個(gè)name對(duì)應(yīng)集合的并集

sinterstore(dest, keys, *args)

# 獲取多一個(gè)name對(duì)應(yīng)集合的并集,再講其加入到dest對(duì)應(yīng)的集合中

sismember(name, value)

# 檢查value是否是name對(duì)應(yīng)的集合的成員

smembers(name)

# 獲取name對(duì)應(yīng)的集合的所有成員

smove(src, dst, value)

# 將某個(gè)成員從一個(gè)集合中移動(dòng)到另外一個(gè)集合

spop(name)

# 從集合的右側(cè)(尾部)移除一個(gè)成員,并將其返回

srandmember(name, numbers)

# 從name對(duì)應(yīng)的集合中隨機(jī)獲取 numbers 個(gè)元素

srem(name, values)

# 在name對(duì)應(yīng)的集合中刪除某些值

sunion(keys, *args)

# 獲取多一個(gè)name對(duì)應(yīng)的集合的并集

sunionstore(dest,keys, *args)

# 獲取多一個(gè)name對(duì)應(yīng)的集合的并集,并將結(jié)果保存到dest對(duì)應(yīng)的集合中

sscan(name, cursor=0, match=None, count=None)
sscan_iter(name, match=None, count=None)

# 同字符串的操作,用于增量迭代分批獲取元素,避免內(nèi)存消耗太大

有序集合,在集合的基礎(chǔ)上,為每元素排序;元素的排序需要根據(jù)另外一個(gè)值來(lái)進(jìn)行比較,所以,對(duì)于有序集合,每一個(gè)元素有兩個(gè)值,即:值和分?jǐn)?shù),分?jǐn)?shù)專門用來(lái)做排序。

zadd(name, *args, **kwargs)

# 在name對(duì)應(yīng)的有序集合中添加元素
# 如:# zadd('zz', 'n1', 1, 'n2', 2)# 或# zadd('zz', n1=11, n2=22)

zcard(name)

# 獲取name對(duì)應(yīng)的有序集合元素的數(shù)量

zcount(name, min, max)

# 獲取name對(duì)應(yīng)的有序集合中分?jǐn)?shù) 在 [min,max] 之間的個(gè)數(shù)

zincrby(name, value, amount)

# 自增name對(duì)應(yīng)的有序集合的 name 對(duì)應(yīng)的分?jǐn)?shù)

r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)

?

# 按照索引范圍獲取name對(duì)應(yīng)的有序集合的元素# 參數(shù):# name,redis的name# start,有序集合索引起始位置(非分?jǐn)?shù))# end,有序集合索引結(jié)束位置(非分?jǐn)?shù))# desc,排序規(guī)則,默認(rèn)按照分?jǐn)?shù)從小到大排序# withscores,是否獲取元素的分?jǐn)?shù),默認(rèn)只獲取元素的值# score_cast_func,對(duì)分?jǐn)?shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換的函數(shù)# 更多:# 從大到小排序# zrevrange(name, start, end, withscores=False, score_cast_func=float)# 按照分?jǐn)?shù)范圍獲取name對(duì)應(yīng)的有序集合的元素# zrangebyscore(name, min, max, start=None, num=None, withscores=False, score_cast_func=float)# 從大到小排序# zrevrangebyscore(name, max, min, start=None, num=None, withscores=False, score_cast_func=float)

?

zrank(name, value)

# 獲取某個(gè)值在 name對(duì)應(yīng)的有序集合中的排行(從 0 開(kāi)始)# 更多:# zrevrank(name, value),從大到小排序

zrangebylex(name, min, max, start=None, num=None)

?

# 當(dāng)有序集合的所有成員都具有相同的分值時(shí),有序集合的元素會(huì)根據(jù)成員的 值 (lexicographical ordering)來(lái)進(jìn)行排序,而這個(gè)命令則可以返回給定的有序集合鍵 key 中, 元素的值介于 min 和 max 之間的成員
# 對(duì)集合中的每個(gè)成員進(jìn)行逐個(gè)字節(jié)的對(duì)比(byte-by-byte compare), 并按照從低到高的順序, 返回排序后的集合成員。 如果兩個(gè)字符串有一部分內(nèi)容是相同的話, 那么命令會(huì)認(rèn)為較長(zhǎng)的字符串比較短的字符串要大# 參數(shù):# name,redis的name# min,左區(qū)間(值)。 + 表示正無(wú)限; - 表示負(fù)無(wú)限; ( 表示開(kāi)區(qū)間; [ 則表示閉區(qū)間# min,右區(qū)間(值)# start,對(duì)結(jié)果進(jìn)行分片處理,索引位置# num,對(duì)結(jié)果進(jìn)行分片處理,索引后面的num個(gè)元素# 如:# ZADD myzset 0 aa 0 ba 0 ca 0 da 0 ea 0 fa 0 ga# r.zrangebylex('myzset', "-", "[ca") 結(jié)果為:['aa', 'ba', 'ca']# 更多:# 從大到小排序# zrevrangebylex(name, max, min, start=None, num=None)

?

zrem(name, values)

# 刪除name對(duì)應(yīng)的有序集合中值是values的成員# 如:zrem('zz', ['s1', 's2'])

zremrangebyrank(name, min, max)

# 根據(jù)排行范圍刪除

zremrangebyscore(name, min, max)

# 根據(jù)分?jǐn)?shù)范圍刪除

zremrangebylex(name, min, max)

# 根據(jù)值返回刪除

zscore(name, value)

# 獲取name對(duì)應(yīng)有序集合中 value 對(duì)應(yīng)的分?jǐn)?shù)

zinterstore(dest, keys, aggregate=None)

# 獲取兩個(gè)有序集合的交集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作
# aggregate的值為:  SUM  MIN  MAX

zunionstore(dest, keys, aggregate=None)

# 獲取兩個(gè)有序集合的并集,如果遇到相同值不同分?jǐn)?shù),則按照aggregate進(jìn)行操作
# aggregate的值為:  SUM  MIN  MAX

zscan(name, cursor=0, match=None, count=None, score_cast_func=float)
zscan_iter(name, match=None, count=None,score_cast_func=float)

# 同字符串相似,相較于字符串新增score_cast_func,用來(lái)對(duì)分?jǐn)?shù)進(jìn)行操作

其他常用操作

delete(*names)

?

# 根據(jù)刪除redis中的任意數(shù)據(jù)類型
r.set("test","123")
r.get('test')
b'123'
r.delete("test")
1
r.get("test")
None

?

exists(name)

?

# 根據(jù)刪除redis中的任意數(shù)據(jù)類型
r.set("test","123")
r.get('test')
b'123'
r.delete("test")
1
r.exists("test")
False

?

keys(pattern='*')

?

# 根據(jù)模型獲取redis的name# 更多:# KEYS * 匹配數(shù)據(jù)庫(kù)中所有 key 。# KEYS h?llo 匹配 hello , hallo 和 hxllo 等。# KEYS h*llo 匹配 hllo 和 heeeeello 等。# KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo r.keys(pattern="*")
[b'l5', b'parter', b'name', b'l3', b'l4', b'foo']

?

expire(name ,time)

# 為某個(gè)redis的某個(gè)name設(shè)置超時(shí)時(shí)間
r.set("t","ok")
r.expire("t",3)
r.get("t")  # 隔3秒后取值
None

rename(src, dst)

# 對(duì)redis的name重命名為
r.set('rn','123')
r.rename('rn','rename')
r.get('rename')
b'123'

move(name, db))

# 將redis的某個(gè)值移動(dòng)到指定的db下

randomkey()

# 隨機(jī)獲取一個(gè)redis的name(不刪除)

type(name)

# 獲取name對(duì)應(yīng)值的類型
r.get("name")
b'jn'
r.type("name")
b'string'

scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None)

# 同字符串操作,用于增量迭代獲取key

4、管道

redis-py默認(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 是原子性操作。

?

#!/usr/bin/env python
# -*- coding:utf-8 -*-import redispool = redis.ConnectionPool(host='10.211.55.4', port=6379)r = redis.Redis(connection_pool=pool)# pipe = r.pipeline(transaction=False)
pipe = r.pipeline(transaction=True)r.set('username', 'koka')
r.set('passwd', '123')pipe.execute()

?

5、發(fā)布訂閱

發(fā)布者:服務(wù)器

訂閱者:Dashboad和數(shù)據(jù)處理

Demo如下:

?RedisHelper

訂閱者:

?

# !/usr/bin/env python
# -*- coding:utf-8 -*-from monitor.RedisHelper import RedisHelperobj = RedisHelper()
redis_sub = obj.subscribe()while True:msg= redis_sub.parse_response()print(msg)

?

發(fā)布者:

?

#!/usr/bin/env python
# -*- coding:utf-8 -*-from monitor.RedisHelper import RedisHelperobj = RedisHelper()
obj.public('hello')

?

?sentinel

redis中的sentinel主要用于在redis主從復(fù)制中,如果master故障,則自動(dòng)將slave替換成master

?

#!/usr/bin/env python
# -*- coding:utf-8 -*-from redis.sentinel import Sentinel# 連接哨兵服務(wù)器(主機(jī)名也可以用域名)
sentinel = Sentinel([('10.211.55.20', 26379),('10.211.55.20', 26380),],socket_timeout=0.5)# # 獲取主服務(wù)器地址
# master = sentinel.discover_master('mymaster')
# print(master)
#
# # # 獲取從服務(wù)器地址
# slave = sentinel.discover_slaves('mymaster')
# print(slave)
#
#
# # # 獲取主服務(wù)器進(jìn)行寫(xiě)入
# master = sentinel.master_for('mymaster')
# master.set('foo', 'bar')# # # # 獲取從服務(wù)器進(jìn)行讀取(默認(rèn)是round-roubin)
# slave = sentinel.slave_for('mymaster', password='redis_auth_pass')
# r_ret = slave.get('foo')
# print(r_ret)

?

更多參見(jiàn):

https://github.com/andymccurdy/redis-py/

http://doc.redisfans.com/

http://www.cnblogs.com/wupeiqi/articles/5132791.html

轉(zhuǎn)載原文:https://www.cnblogs.com/koka24/p/5841826.html

總結(jié)

以上是生活随笔為你收集整理的python的redis数据库连接与使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。