1. 程式人生 > 實用技巧 >Python操作Redis大全 轉載:https://mp.weixin.qq.com/s/_ak_69yNkoUCs75fAvdGOw

Python操作Redis大全 轉載:https://mp.weixin.qq.com/s/_ak_69yNkoUCs75fAvdGOw

一、字串 stringsPython操作Redis的redis模組對字串(string)的主要操作函式包括:SET、GET、GETSET、SETEX、SETNX、MSET、MSETNX、INCR(INCRBY,DECR,DECRBY在python中庸同一個函式incr實現)、APPEND、SETRANGE、STRLEN。函式說明如下:

  1. SET:為指定的鍵(key)設定值(value), set(self, name, value, **kwargs)。
  2. GET:獲取指定鍵(key)繫結的值(value),get(self, name)。
  3. GETSET:為指定的鍵(key)設定新的值(value),並返回舊的值(old Value),getset(self, name, value)
  4. SETEX:為指定的鍵(key)設定過期以秒(second)計的過期時間,setex(self, name, value, time)
  5. SETNX:鍵(key)不存在時,為鍵(key)指定值(value),setnx(self, name, value)
  6. MSET:一次性設定多個鍵-值(key-value)對,函式設定的鍵-值對(即mapping所指內容)資料要以Python字典資料型別傳入,mset(self, mapping)
  7. MSETNX:鍵-值(key-value)對不存在時,設定鍵-值(key-value)對,msetnx(self, mapping),mapping值參考6
  8. INCR
    :自增函式,預設步長為1,通過對步長(amount)大小以及字元的控制實現了INCRBY(amount>=1)、DECR(amount=-1)、DECRBY(amount<=-1)等函式功能,incr(self, name, amount=1)
  9. APPEND:為指定的字串追加值,若不存在則直接建立,append(self, key, value)
  10. SETRANGE:用 value 引數覆寫給定 key 所儲存的字串值,從偏移量 offset 開始,setrange(self, name, offset, value)
  11. STRLEN:返回字串的長度,當name不存在時返回0,strlen(self, name)

示例程式碼如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# __author__ = 'Jack'

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.flushall() # 清空Redis

r.setex('name', value='liaogx', time=2) # 設定新值,過期時間為3s
r.mset(k1 = 'v1', k2 = 'v2', k3 = 'v3') # 批量設定新值
print(r.mget('k1', 'k2', 'k3', 'k4')) # 批量獲取新值
print(r.getset('name', 'liaogaoxiang')) # 設定新值並獲取原來的值
print(r.getrange('name', 0, 1)) # 獲取子序列 0 <= x <= 1
r.setrange('name', 0, 'LIAO') # 修改字串內容,從指定字串索引開始向後替換(新值太長時,則向後新增),返回值的長度
i = 0
while i < 4:
print(r.get('name'))
time.sleep(1)
i += 1
source = 'foo'
r.set('n1', source)
r.setbit('n1', 7, 1)
'''
注:如果在Redis中有一個對應:n1 = "foo",
那麼字串foo的二進位制表示為:01100110 01101111 01101111
所以,如果執行 setbit('n1', 7, 1),則就會將第7位設定為1,
那麼最終二進位制則變成 01100111 01101111 01101111,即:"goo"
'''
print(r.get('n1'))
print(r.getbit('n1', 7)) # 獲取n1對應的值的二進位制表示中的某位的值 (0或1)
r.set('n2', '廖高祥')
print(r.strlen('n2')) # 返回對應的位元組長度(一個漢字3個位元組)
r.set('num', 1)
r.incr('num', amount=10)
r.decr('num', amount=1)
print(r.get('num')) # 自增num對應的值,當name不存在時,則建立name=amount,否則,則自增。
r.append('num', 111)
print(r.get('num')) # 在redis num對應的值後面追加內容

輸出結果如下:

[b'v1', b'v2', b'v3', None]
b'liaogx'
b'li'
b'LIAOgaoxiang'
b'LIAOgaoxiang'
b'LIAOgaoxiang'
b'LIAOgaoxiang'
b'goo'
1
9
b'10'
b'10111'

二、列表 listsPython操作Redis主要利用了redis模組來實現,list表操作函式主要模擬了Redis操作命令LPUSH,LRANGE,LINDEX,BLPOP,BRPOP。函式說明如下:

  1. lpush函式實現了從向指定redis列表頭部壓入資料功能,lpush key value
  2. lrange獲取列表指定範圍的函式,lrange key start end
  3. lindex根據列表下標量獲取列表元素值,lindex key index
  4. blpop從列表頭部取出第一個元素,返回該元素值並從列表刪除(l代表left,左邊)
  5. brpop從列表尾部取出第一個元素,返回該元素值並從列表刪除(r代表right,右邊)
  6. LPUSHX、RPUSHX以及其他一些Redis列表(List)函式目前版本無法實現,如有可實現方法部落格程式碼事例將會得到更新。

示例程式碼如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# __author__ = 'Jack'

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.flushall() # 清空Redis

r.lpush('oo', 11) # 儲存順序為: 33,22,11
r.lpushx('oo', 00) # 在name對應的list中新增元素,只有name已經存在時,值新增到列表的最左邊
print(r.llen('oo')) # name對應的list元素的個數

r.linsert('oo', 'before', 11, 99) # 在11之前插入值99
r.lset('oo', 1, 88) # 對name對應的list中的某一個索引位置重新賦值
print(r.lrange('oo', 0, -1)) # 在name對應的列表分片獲取資料

r.lrem('oo', 88, num=1) # 在name對應的list中刪除指定的值.num=0,刪除列表中所有的指定值;num=2,從前到後,刪除2個;num=-2,從後向前,刪除2個
print(r.lrange('oo', 0, -1))

print(r.lpop('oo')) # 在name對應的列表的左側獲取第一個元素並在列表中移除,返回值則是第一個元素
print(r.lindex('oo', 0)) # 在name對應的列表中根據索引獲取列表元素
r.lpush('l1', 11) # index為0
r.rpush('l1', 22)
r.rpush('l1', 33)
r.rpush('l1', 44)
r.rpush('l1', 55) # index為4
r.ltrim('l1', 1, 3) # 在name對應的列表中移除沒有在[start-end]索引之間的值
print(r.lrange('l1', 0, -1))

r.rpoplpush('l1', 'l1') # 從一個列表取出最右邊的元素,同時將其新增至另一個列表的最左邊;src要取資料的列表的name, dst要新增資料的列表的name
print(r.lrange('l1', 0, -1))

r.brpoplpush('l1', 'l1', timeout=3) # # timeout,當src對應的列表中沒有資料時,阻塞等待其有資料的超時時間(秒),0 表示永遠阻塞
print(r.lrange('l1', 0, -1))

print(r.blpop('l1', 3)) # 從列表頭部取出第一個元素,返回該元素值並從列表刪除(l代表left,左邊)
print(r.lrange('l1', 0, -1))
'''
# 由於redis類庫中沒有提供對列表元素的增量迭代,如果想要迴圈name對應的列表的所有元素,那麼就需要:
# 1、獲取name對應的所有列表
# 2、迴圈列表
# 但是,如果列表非常大,那麼就有可能在第一步時就將程式的內容撐爆,所有有必要自定義一個增量迭代的功能:
'''
print('自定義增量迭代:')
r.flushall()
r.lpush('l1', 11) # index為0
r.rpush('l1', 22)
r.rpush('l1', 33)
r.rpush('l1', 44)
r.rpush('l1', 55) # index為4

def list_iter(name):
list_count = r.llen(name)
for index in range(list_count):
yield r.lindex(name, index)

for item in list_iter('l1'):
print(item)

輸出結果如下:

2
[b'0', b'88', b'11']
[b'0', b'11']
b'0'
b'11'
[b'22', b'33', b'44']
[b'44', b'22', b'33']
[b'33', b'44', b'22']
(b'l1', b'33')
[b'44', b'22']
自定義增量迭代:
b'11'
b'22'
b'33'
b'44'
b'55'

三、集合 setsRedis 資料庫集合物件(set object)是由string型別的無重複元素的無需集合,底層編碼可以是intset或者hashtable。intset編碼的集合物件用整數集合最為底層實現,所有物件元素儲存在整數集合中。Python的redis模組實現了 SADD、SCARD 、SDIFF 、SDIFFSTORE、SINTER 、SINTERSTORE、SISMEMBER 、SMEMBERS 、SMOVE、SPOP、SRANDMEMBER、SREM、SUNION、SUNIONSTORE操作命令的基本用法。函式說明如下:

  1. SADD:向集合物件新增成員,sadd(self, name, value)
  2. SCARD:獲取集合元素個數,scard(self, name)
  3. SDIFF:返回給定多個集合物件的差集(set key1-set key2..-set keyn),從左到右計算集合差集,sdiff(self, keys, *args)
  4. SDIFFSTORE:返回給定給定多個集合物件的差集並存儲在目標(dest)集合中,sdiffstore(self, dest, keys, *args)
  5. SINTER:返回給定所有集合(keys,args)的交集, sinter(self, keys,args)
  6. SINTERSTORE:返回給定所有集合(keys,args)的交集並存儲在 集合(dest) 中, sinterstore(self, dest, keys,args)
  7. SISMEMBER:判斷 value元素是否是集合 name 的成員,返回布林邏輯值True或者False,sismember(self, name, value)
  8. SMEMBERS:返回集合中所元素值的Python集合型別資料,smembers(self, name)
  9. SMOVE:將元素value從集合src移動到 集合 dest。若元素value在集合src中不存在,則集合dest中不會新增元素value, smove(self, src, dest, value)
  10. SPOP:移除並返回集合中的一個隨機元素, spop(self, name)
  11. SRANDMEMBER:返回集合中一個隨機數,但是不做移除操作, srandmember(self, name)。從Redis 2.6 版本開始, 在命令列下Srandmember 命令接受可選返回元素數量的引數 redis>SRANDMEMBER name count
  12. SREM:移除集合中一個元素,srem(self, name, value),redis模組任然沿用Redis 2.4 版本以前的只接受單個元素的用法。
  13. SUNION:返回所有給定集合的並集中所有元素,sunion(self, keys, *args)
  14. SUNIONSTORE:所有給定集合的並集儲存在集合dest 中, sunionstore(self, dest, keys, *args)
  15. SSCAN:迭代集合中的元素,sscan(self, name, cursor=0, match=None, count=None)

示例程式碼如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# __author__ = 'Jack'

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.flushall() # 清空Redis

r.sadd('s1', 'v1', 'v1', 'v2', 'v3') # name對應的集合中新增元素
r.sadd('s2', 'v2', 'v4') # name對應的集合中新增元素
print(r.scard('s1')) # 獲取name對應的集合中元素個數
print(r.sdiff('s1', 's2')) #在第一個name對應的集合中且不在其他name對應的集合的元素集合

r.sdiffstore('s3', 's1', 's2') # 獲取第一個name對應的集合中且不在其他name對應的集合,再將其新加入到dest對應的集合中
print(r.smembers('s3')) # 獲取s3對應的集合的所有成員

print(r.sinter('s1', 's2')) # 獲取s1, s2對應集合的交集
r.sinterstore('s4', 's1', 's2') # 獲取s1, s2對應集合的交集,並將其存放到集合是s4中
print(r.smembers('s4'))

print(r.sunion('s1', 's2')) # 獲取s1, s2對應集合的並集

r.sunionstore('s5', 's1', 's2') # 獲取s1, s2對應集合的交集,並將其存放到集合是s5中
print(r.smembers('s5'))

print(r.sismember('s4', 'v4')) # 檢查value是否是name對應的集合的成員

r.smove('s2', 's1', 'v4') # 將集合s2中成員v4移至集合s1中
print(r.smembers('s1'))
r.srem('s1', 'v1') # 在name對應的集合中刪除某些值

print(r.spop('s1')) # 從集合的右側(尾部)移除一個成員,並將其返回 注意:集合是無序的,故結果隨機!

print(r.srandmember('s1')) # 從name對應的集合中隨機獲取 numbers 個元素(Redis 2.6+)

輸出結果如下:

3
{b'v3', b'v1'}
{b'v3', b'v1'}
{b'v2'}
{b'v2'}
{b'v3', b'v2', b'v4', b'v1'}
{b'v3', b'v2', b'v4', b'v1'}
False
{b'v3', b'v2', b'v4', b'v1'}
b'v2'
b'v3'

四、有序集合 sorted sets

命令描述
Redis Zadd 命令 向有序集合新增一個或多個成員,或者更新已存在成員的分數
Redis Zcard 命令 獲取有序集合的成員數
Redis Zcount 命令 計算在有序集合中指定區間分數的成員數
Redis Zincrby 命令 有序集合中對指定成員的分數加上增量 increment
Redis Zinterstore 命令 計算給定的一個或多個有序集的交集並將結果集儲存在新的有序集合 key 中
Redis Zlexcount 命令 在有序集合中計算指定字典區間內成員數量
Redis Zrange 命令 通過索引區間返回有序集合成指定區間內的成員
Redis Zrangebylex 命令 通過字典區間返回有序集合的成員
Redis Zrangebyscore 命令 通過分數返回有序集合指定區間內的成員
Redis Zrank 命令 返回有序集合中指定成員的索引
Redis Zrem 命令 移除有序集合中的一個或多個成員
Redis Zremrangebylex 命令 移除有序集合中給定的字典區間的所有成員
Redis Zremrangebyrank 命令 移除有序集合中給定的排名區間的所有成員
Redis Zremrangebyscore 命令 移除有序集合中給定的分數區間的所有成員
Redis Zrevrange 命令 返回有序集中指定區間內的成員,通過索引,分數從高到底
Redis Zrevrangebyscore 命令 返回有序集中指定分數區間內的成員,分數從高到低排序
Redis Zrevrank 命令 返回有序集合中指定成員的排名,有序整合員按分數值遞減(從大到小)排序
Redis Zscore 命令 返回有序集中,成員的分數值
Redis Zunionstore 命令 計算給定的一個或多個有序集的並集,並存儲在新的 key 中
Redis Zscan 命令 迭代有序集合中的元素(包括元素成員和元素分值)

示例程式碼如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# __author__ = 'Jack'

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.flushall() # 清空Redis

r.zadd('z1', '11', 1, '22', 2, '33', 3, '44', 4, '55', 5, '66', 6, '66', 7) # 在name對應的有序集合中新增元素
print(r.zcard('z1')) # 獲取name對應的有序集合元素的數量
print(r.zcount('z1', 1, 2)) # 獲取name對應的有序集合中分數 在 [min,max] 之間的個數
r.zincrby('z1', '11', amount=5) # 自增name對應的有序集合的 name 對應的分數
print(r.zrange('z1', 0, -1, desc=False, withscores=True)) # 值11被排序到最後;此處表示按元素的值升序排列

print(r.zrank('z1', 33)) # 獲取某個值在 name對應的有序集合中的排行(從 0 開始)

r.zrem('z1', '66') # 刪除name對應的有序集合中值是values的成員
print(r.zrange('z1', 0, -1, desc=False, withscores=True))

r.zremrangebyrank('z1', 0, 1) # 根據排行範圍刪除
print(r.zrange('z1', 0, -1, desc=False, withscores=True))

r.zremrangebyscore('z1', 4.5, 5.5) # 根據分數範圍刪除
print(r.zrange('z1', 0, -1, desc=False, withscores=True))

print(r.zscore('z1', 11)) # 獲取name對應有序集合中 value 對應的分數

r.zadd("zset_name", "a1", 6, "a2", 2, "a3", 5)
r.zadd('zset_name1', a1=7, b1=10, b2=5)
'''
獲取兩個有序集合的交集並放入dest集合,如果遇到相同值不同分數,則按照aggregate進行操作
aggregate的值為: SUM MIN MAX
'''
r.zinterstore('zset_name2', ('zset_name', 'zset_name1'), aggregate='Sum')

print(r.zrange('zset_name2', 0, -1, desc=False, withscores=True))

輸出結果如下:

6
2
[(b'22', 2.0), (b'33', 3.0), (b'44', 4.0), (b'55', 5.0), (b'11', 6.0), (b'66', 6.0)]
1
[(b'22', 2.0), (b'33', 3.0), (b'44', 4.0), (b'55', 5.0), (b'11', 6.0)]
[(b'44', 4.0), (b'55', 5.0), (b'11', 6.0)]
[(b'44', 4.0), (b'11', 6.0)]
6.0
[(b'a1', 13.0)]

五、雜湊 hashesRedis 資料庫hash資料型別是一個string型別的key和value的對映表,適用於儲存物件。redis 中每個hash可以儲存鍵值對多達40億。Python的redis模組實現了Redis雜湊(Hash)命令列操作的幾乎全部命令,包括HDEL、HEXISTS、HGET、HGETALL、HINCRBY、HKEYS、HLEN 、HMGET 、HMSET 、HSET 、HSETNX 、HVALS 、HINCRBYFLOAT等命令。函式說明如下:

  1. HDEL:刪除對應雜湊(Hash)表的指定鍵(key)的欄位,hdel(self, name, key)
  2. HEXISTS:檢測雜湊(Hash)表對應鍵(key)欄位是否存在,返回布林邏輯,hexists(self, name, key)
  3. HGET:獲取雜湊(Hash)指定鍵(key)對應的值,hget(self, name, key)
  4. HGETALL:獲取雜湊(Hash)表的鍵-值對(key-value pairs),返回python字典型別資料,hgetall(self, name)
  5. HINCRBY:為雜湊表(Hash)指定鍵(key)對應的值(key)加上指定的整數數值(int,可為負值)hincrby(self>, name, key, amount=1),Redis 中本操作的值被限制在 64 位(bit)有符號數字。
  6. HKEYS:返回雜湊表(Hash)對應鍵(key)的陣列(Python稱之為列表List),hkeys(self, name)
  7. HLEN:獲取雜湊表(Hash)中鍵-值對(key-value pairs)個數,hlen(self, name)
  8. HMGET:獲取雜湊表(Hash)中一個或多個給點欄位的值,不存在返回nil(Redis命令列)/None(Python),hmget(self, name, keys),其中keys可以為列表(list)
  9. HMSET:設定對個鍵-值對(key-value pairs)到雜湊表(Hash)中,python輸入值(mapping)為字典(dictionary)型別,hmset(self, name, mapping)
  10. HSET:為雜湊表(Hash)賦值,若鍵(key)存在值(value)則覆蓋,不存在則建立,hset(self, name, key, value)
  11. HSETNX:為雜湊表(Hash)不存值(value)的鍵(key)賦值,存在操作無效,對應值(value)無變化,hsetnx(self, name, key, value)
  12. HVALS:返回雜湊表(Hash)對應值(value)的列表,hvals(self, name)
  13. HINCRBYFLOAT:為雜湊表 key 中的指定欄位的浮點數值加上增量 increment ,hincrbyfloat(self, name, key, amount=1.0)

示例程式碼如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# __author__ = 'Jack'

pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.flushall() # 清空Redis

r.hset('n1', 'k1', 'v1') # hset(name, key, value),name對應的hash中設定一個鍵值對(不存在,則建立;否則,修改)
print(r.hget('n1', 'k1'))
r.hmset('n2', {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}) # hmset(name, mapping),在name對應的hash中批量設定鍵值對
print(r.hmget('n2', 'k2'))
print(r.hgetall('n2')) # 獲取name對應hash的所有鍵值
print(r.hlen('n2')) # 獲取name對應的hash中鍵值對的個數
print(r.hkeys('n2')) # 獲取name對應的hash中所有的key的值
print(r.hvals('n2')) # 獲取name對應的hash中所有的value的值
print(r.hexists('n2', 'k4')) # 檢查name對應的hash是否存在當前傳入的key
r.hdel('n2', 'k3') # 將name對應的hash中指定key的鍵值對刪除
r.hset('n3', 'k1', 1)
r.hincrby('n3', 'k1', amount=1) # hincrby(name, key, amount=1),自增name對應的hash中的指定key的value的值,不存在則建立key=amount
print(r.hgetall('n3'))

輸出結果如下:

b'v1'
[b'v2']
{b'k1': b'v1', b'k2': b'v2', b'k3': b'v3'}
3
[b'k1', b'k2', b'k3']
[b'v1', b'v2', b'v3']
False
{b'k1': b'2'}

命令太多記不住可以參考Redis中文網,強烈建議收藏