Python操做Redis的redis模塊對字符串(string)的主要操做函數包括:SET、GET、GETSET、SETEX、SETNX、MSET、MSETNX、INCR(INCRBY,DECR,DECRBY在python中庸同一個函數incr實現)、APPEND、SETRANGE、STRLEN。函數說明以下:html
示例代碼以下:python
#!/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對應的值後面追加內容
輸出結果以下:redis
[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'
Python操做Redis主要利用了redis模塊來實現,list表操做函數主要模擬了Redis操做命令LPUSH,LRANGE,LINDEX,BLPOP,BRPOP。函數說明以下:數據庫
lpush key value
lrange key start end
lindex key index
示例代碼以下:數組
#!/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對應的列表的全部元素,那麼就須要: # 一、獲取name對應的全部列表 # 二、循環列表 # 可是,若是列表很是大,那麼就有可能在第一步時就將程序的內容撐爆,全部有必要自定義一個增量迭代的功能: ''' 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'
Redis 數據庫集合對象(set object)是由string類型的無重複元素的無需集合,底層編碼能夠是intset或者hashtable。intset編碼的集合對象用整數集合最爲底層實現,全部對象元素保存在整數集合中。Python的redis模塊實現了 SADD、SCARD 、SDIFF 、SDIFFSTORE、SINTER 、SINTERSTORE、SISMEMBER 、SMEMBERS 、SMOVE、SPOP、SRANDMEMBER、SREM、SUNION、SUNIONSTORE操做命令的基本用法。函數說明以下:app
示例代碼以下:函數
#!/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'
命令 | 描述 |
---|---|
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 命令 | 迭代有序集合中的元素(包括元素成員和元素分值) |
示例代碼以下:spa
#!/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)]
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等命令。函數說明以下:
示例代碼以下:
#!/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中文網,強烈建議收藏
搜索關注微信公衆號:寸土幣爭 ID: bbcoins