
指令太多記不住可以參考Redis中文網,強烈建議收藏
一、字元串 strings
Python操作Redis的redis子產品對字元串(string)的主要操作函數包括:SET、GET、GETSET、SETEX、SETNX、MSET、MSETNX、INCR(INCRBY,DECR,DECRBY在python中庸同一個函數incr實作)、APPEND、SETRANGE、STRLEN。函數說明如下:
- SET : 為指定的鍵(key)設定值(value), set(self, name, value, **kwargs)。
- GET :擷取指定鍵(key)綁定的值(value),get(self, name)。
- GETSET :為指定的鍵(key)設定新的值(value),并傳回舊的值(old Value),getset(self, name, value)
- SETEX :為指定的鍵(key)設定過期以秒(second)計的過期時間,setex(self, name, value, time)
- SETNX :鍵(key)不存在時,為鍵(key)指定值(value),setnx(self, name, value)
- MSET :一次性設定多個鍵-值(key-value)對,函數設定的鍵-值對(即mapping所指内容)資料要以Python字典資料類型傳入,mset(self, mapping)
- MSETNX :鍵-值(key-value)對不存在時,設定鍵-值(key-value)對,msetnx(self, mapping),mapping值參考6
- INCR :自增函數,預設步長為1,通過對步長(amount)大小以及字元的控制實作了INCRBY(amount>=1)、DECR(amount=-1)、DECRBY(amount<=-1)等函數功能,incr(self, name, amount=1)
- APPEND :為指定的字元串追加值,若不存在則直接建立,append(self, key, value)
- SETRANGE :用 value 參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始,setrange(self, name, offset, value)
- 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'
二、清單 lists
Python操作Redis主要利用了redis子產品來實作,list表操作函數主要模拟了Redis操作指令LPUSH,LRANGE,LINDEX,BLPOP,BRPOP。函數說明如下:
- lpush 函數實作了從向指定redis清單頭部壓入資料功能,
lpush key value
- lrange 擷取清單指定範圍的函數,
lrange key start end
- lindex 根據清單下标量擷取清單元素值,
lindex key index
- blpop 從清單頭部取出第一個元素,傳回該元素值并從清單删除(l代表left,左邊)
- brpop 從清單尾部取出第一個元素,傳回該元素值并從清單删除(l代表right,右邊)
- 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'
三、集合 sets
Redis 資料庫集合對象(set object)是由string類型的無重複元素的無需集合,底層編碼可以是intset或者hashtable。intset編碼的集合對象用整數集合最為底層實作,所有對象元素儲存在整數集合中。Python的redis子產品實作了 SADD、SCARD 、SDIFF 、SDIFFSTORE、SINTER 、SINTERSTORE、SISMEMBER 、SMEMBERS 、SMOVE、SPOP、SRANDMEMBER、SREM、SUNION、SUNIONSTORE操作指令的基本用法。函數說明如下:
- SADD :向集合對象添加成員,sadd(self, name, value)
- SCARD :擷取集合元素個數,scard(self, name)
- SDIFF :傳回給定多個集合對象的差集(set key1-set key2..-set keyn),從左到右計算集合差集,sdiff(self, keys, *args)
- SDIFFSTORE :傳回給定給定多個集合對象的差集并存儲在目标(dest)集合中,sdiffstore(self, dest, keys, *args)
- SINTER :傳回給定所有集合(keys, args)的交集, sinter(self, keys, args)
- SINTERSTORE :傳回給定所有集合(keys, args)的交集并存儲在 集合(dest) 中, sinterstore(self, dest, keys, args)
- SISMEMBER :判斷 value元素是否是集合 name 的成員,傳回布爾邏輯值True或者False,sismember(self, name, value)
- SMEMBERS :傳回集合中所元素值的Python集合類型資料,smembers(self, name)
- SMOVE :将元素value從集合src移動到 集合 dest。若元素value在集合src中不存在,則集合dest中不會添加元素value, smove(self, src, dest, value)
- SPOP :移除并傳回集合中的一個随機元素, spop(self, name)
- SRANDMEMBER :傳回集合中一個随機數,但是不做移除操作, srandmember(self, name)。從Redis 2.6 版本開始, 在指令行下Srandmember 指令接受可選傳回元素數量的參數 redis>SRANDMEMBER name count
- SREM :移除集合中一個元素,srem(self, name, value),redis子產品任然沿用Redis 2.4 版本以前的隻接受單個元素的用法。
- SUNION :傳回所有給定集合的并集中所有元素,sunion(self, keys, *args)
- SUNIONSTORE :所有給定集合的并集存儲在集合dest 中, sunionstore(self, dest, keys, *args)
- 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)]
五、哈希 hashes
Redis 資料庫hash資料類型是一個string類型的key和value的映射表,适用于存儲對象。redis 中每個hash可以存儲鍵值對多達40億。Python的redis子產品實作了Redis哈希(Hash)指令行操作的幾乎全部指令,包括HDEL、HEXISTS、HGET、HGETALL、HINCRBY、HKEYS、HLEN 、HMGET 、HMSET 、HSET 、HSETNX 、HVALS 、HINCRBYFLOAT等指令。函數說明如下:
- HDEL :删除對應哈希(Hash)表的指定鍵(key)的字段,hdel(self, name, key)
- HEXISTS :檢測哈希(Hash)表對應鍵(key)字段是否存在,傳回布爾邏輯,hexists(self, name, key)
- HGET :擷取哈希(Hash)指定鍵(key)對應的值,hget(self, name, key)
- HGETALL :擷取哈希(Hash)表的鍵-值對(key-value pairs),傳回python字典類型資料,hgetall(self, name)
- HINCRBY :為哈希表(Hash)指定鍵(key)對應的值(key)加上指定的整數數值(int,可為負值)hincrby(self>, name, key, amount=1),Redis 中本操作的值被限制在 64 位(bit)有符号數字。
- HKEYS :傳回哈希表(Hash)對應鍵(key)的數組(Python稱之為清單List),hkeys(self, name)
- HLEN : 擷取哈希表(Hash)中鍵-值對(key-value pairs)個數,hlen(self, name)
- HMGET :擷取哈希表(Hash)中一個或多個給點字段的值,不存在傳回nil(Redis指令行)/None(Python),hmget(self, name, keys),其中keys可以為清單(list)
- HMSET :設定對個鍵-值對(key-value pairs)到哈希表(Hash)中,python輸入值(mapping)為字典(dictionary)類型,hmset(self, name, mapping)
- HSET :為哈希表(Hash)指派,若鍵(key)存在值(value)則覆寫,不存在則建立,hset(self, name, key, value)
- HSETNX :為哈希表(Hash)不存值(value)的鍵(key)指派,存在操作無效,對應值(value)無變化,hsetnx(self, name, key, value)
- HVALS :傳回哈希表(Hash)對應值(value)的清單,hvals(self, name)
- 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'}
微信公衆号:寸土币争 ID: bbcoins