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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python操作redis用法详解

發布時間:2024/4/11 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python操作redis用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.簡單介紹

安裝redis
pip install redis

Redis是一個基于內存的高效的鍵值型非關系型數據庫,存取效率極高,而且支持多種存儲數據結構,使用也非常簡單。本節中,我們就來介紹一下Python的Redis操作。

redis提供兩個類RedisStrictRedis來實現Redis的命令操作。StrictRedis實現了絕大部分官方的命令,參數也一一對應,比如set()方法就對應Redis命令的set方法。

而Redis是StrictRedis的子類,它的主要功能是用于向后兼容舊版本庫里的幾個方法。為了做兼容,它將方法做了改寫,比如lrem()方法就將value和num參數的位置互換,這和Redis命令行的命令參數不一致。

redis連接實例是線程安全的,可以直接將redis連接實例設置為一個全局變量,直接使用。如果需要另一個Redis實例(or Redis數據庫)時,就需要重新創建redis連接實例來獲取一個新的連接。同理,python的redis沒有實現select命令。

2.連接Redis

假設現在我們已經在本地安裝了Redis并運行在6379端口。那么,可以用如下示例連接Redis并測試:

2.1 Redis方式連接

import redis # 導入redis模塊,通過python操作redis 也可以直接在redis主機的服務端操作緩存數據庫redis = redis.Redis(host='localhost', port=6379, decode_responses=True) # host是redis主機,需要redis服務端和客戶端都啟動 redis默認端口是6379 redis.set('name', 'junxi') # key是"foo" value是"bar" 將鍵值對存入redis緩存 print(redis['name']) print(redis.get('name')) # 取出鍵name對應的值 print(type(redis.get('name')))

2.2 StrictRedis方式連接

from redis import StrictRedisredis = StrictRedis(host='localhost', port=6379, db=0, password='foobared') redis.set('name', 'Bob') print(redis.get('name'))

這里我們傳入了Redis的地址、運行端口、使用的數據庫和密碼信息。在默認不傳的情況下,這4個參數分別為localhost、6379、0和None。首先聲明了一個StrictRedis對象,接下來調用set()方法,設置一個鍵值對,然后將其獲取并打印。

運行結果如下:

b'Bob'

這說明我們連接成功,并可以執行set()和get()操作了。

2.3 ConnectionPool連接(推薦使用)

redis使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。
可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池

from redis import StrictRedis, ConnectionPoolpool = ConnectionPool(host='localhost', port=6379, db=0, password='foobared') redis = StrictRedis(connection_pool=pool)

這樣的連接效果是一樣的。觀察源碼可以發現,StrictRedis內其實就是用host和port等參數又構造了一個ConnectionPool,所以直接將ConnectionPool當作參數傳給StrictRedis也一樣。

另外,ConnectionPool還支持通過URL來構建。URL的格式支持有如下3種:

redis://[:password]@host:port/db rediss://[:password]@host:port/db unix://[:password]@/path/to/socket.sock?db=db

這3種URL分別表示創建Redis TCP連接、Redis TCP+SSL連接、Redis UNIX socket連接。我們只需要構造上面任意一種URL即可,其中password部分如果有則可以寫,沒有則可以省略。下面再用URL連接演示一下:

url = 'redis://:foobared@localhost:6379/0' pool = ConnectionPool.from_url(url) redis = StrictRedis(connection_pool=pool)

這里我們使用第一種連接字符串進行連接。首先,聲明一個Redis連接字符串,然后調用from_url()方法創建ConnectionPool,接著將其傳給StrictRedis即可完成連接,所以使用URL的連接方式還是比較方便的。

3.字符串 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 -*- from redis import StrictRedis, ConnectionPool pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.StrictRedis(connection_pool=pool) r.flushall() # 清空Redisr.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'

4.列表 list

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 -*- from redis import StrictRedis, ConnectionPool pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.StrictRedis(connection_pool=pool) r.flushall() # 清空Redisr.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為4def 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'

5.哈希 hash

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 -*- from redis import StrictRedis, ConnectionPool pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.StrictRedis(connection_pool=pool) r.flushall() # 清空Redisr.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'}

6.集合 set

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 -*-from redis import StrictRedis, ConnectionPool pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.StrictRedis(connection_pool=pool) r.flushall() # 清空Redisr.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'

7.有序集合 sorted set

  • zadd 命令 向有序集合添加一個或多個成員,或者更新已存在成員的分數
  • zcard 命令 獲取有序集合的成員數
  • zcount 命令 計算在有序集合中指定區間分數的成員數
  • zincrby 命令 有序集合中對指定成員的分數加上增量 increment
  • zinterstore 命令 計算給定的一個或多個有序集的交集并將結果集存儲在新的有序集合 key 中
  • zlexcount 命令 在有序集合中計算指定字典區間內成員數量
  • zrange 命令 通過索引區間返回有序集合成指定區間內的成員
  • zrangebylex 命令 通過字典區間返回有序集合的成員
  • zrangebyscore 命令 通過分數返回有序集合指定區間內的成員
  • zrank 命令 返回有序集合中指定成員的索引
  • zrem 命令 移除有序集合中的一個或多個成員
  • zremrangebylex 命令 移除有序集合中給定的字典區間的所有成員
  • zremrangebyrank 命令 移除有序集合中給定的排名區間的所有成員
  • zremrangebyscore 命令 移除有序集合中給定的分數區間的所有成員
  • zrevrange 命令 返回有序集中指定區間內的成員,通過索引,分數從高到底
  • zrevrangebyscore 命令 返回有序集中指定分數區間內的成員,分數從高到低排序
  • zrevrank 命令 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
  • zscore 命令 返回有序集中,成員的分數值
  • zunionstore 命令 計算給定的一個或多個有序集的并集,并存儲在新的 key 中
  • zscan 命令 迭代有序集合中的元素(包括元素成員和元素分值)

示例代碼如下:

#!/usr/bin/python # -*- coding:utf-8 -*-from redis import StrictRedis, ConnectionPool pool = redis.ConnectionPool(host='127.0.0.1', port=6379) r = redis.StrictRedis(connection_pool=pool) r.flushall() # 清空Redisr.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)]

8.RedisDump

RedisDump提供了強大的Redis數據的導入和導出功能,現在就來看下它的具體用法。

首先,確保已經安裝好了RedisDump。RedisDump提供了兩個可執行命令:redis-dump用于導出數據,redis-load用于導入數據。

redis-dump 導出數據

首先,可以輸入如下命令查看所有可選項:

redis-dump -h

運行結果如下:

Usage: redis-dump [global options] COMMAND [command options] -u, --uri=S Redis URI (e.g. redis://hostname[:port])-d, --database=S Redis database (e.g. -d 15)-s, --sleep=S Sleep for S seconds after dumping (for debugging)-c, --count=S Chunk size (default: 10000)-f, --filter=S Filter selected keys (passed directly to redis' KEYS command)-O, --without_optimizations Disable run time optimizations-V, --version Display version-D, --debug--nosafe

其中-u代表Redis連接字符串,-d代表數據庫代號,-s代表導出之后的休眠時間,-c代表分塊大小,默認是10000,-f代表導出時的過濾器,-O代表禁用運行時優化,-V用于顯示版本,-D表示開啟調試。

我們拿本地的Redis做測試,運行在6379端口上,密碼為foobared,導出命令如下:

redis-dump -u :foobared@localhost:6379

如果沒有密碼的話,可以不加密碼前綴,命令如下:

redis-dump -u localhost:6379

運行之后,可以將本地0至15號數據庫的所有數據輸出出來,例如:

{"db":0,"key":"name","ttl":-1,"type":"string","value":"James","size":5} {"db":0,"key":"name2","ttl":-1,"type":"string","value":"Durant","size":6} {"db":0,"key":"name3","ttl":-1,"type":"string","value":"Durant","size":6} {"db":0,"key":"name4","ttl":-1,"type":"string","value":"HelloWorld","size":10} {"db":0,"key":"name5","ttl":-1,"type":"string","value":"James","size":5} {"db":0,"key":"name6","ttl":-1,"type":"string","value":"James","size":5} {"db":0,"key":"age","ttl":-1,"type":"string","value":"1","size":1} {"db":0,"key":"age2","ttl":-1,"type":"string","value":"-5","size":2}

每條數據都包含6個字段,其中db即數據庫代號,key即鍵名,ttl即該鍵值對的有效時間,type即鍵值類型,value即內容,size即占用空間。

如果想要將其輸出為JSON行文件,可以使用如下命令:

redis-dump -u :foobared@localhost:6379 > ./redis_data.jl

這樣就可以成功將Redis的所有數據庫的所有數據導出成JSON行文件了。

另外,可以使用-d參數指定某個數據庫的導出,例如只導出1號數據庫的內容:

redis-dump -u :foobared@localhost:6379 -d 1 > ./redis.data.jl

如果只想導出特定的內容,比如想導出以adsl開頭的數據,可以加入-f參數用來過濾,命令如下:

redis-dump -u :foobared@localhost:6379 -f adsl:* > ./redis.data.jl

其中-f參數即Redis的keys命令的參數,可以寫一些過濾規則。

redis-load 導入數據

同樣,我們可以首先輸入如下命令查看所有可選項:

redis-load -h

運行結果如下:

redis-load --helpTry: redis-load [global options] COMMAND [command options] -u, --uri=S Redis URI (e.g. redis://hostname[:port])-d, --database=S Redis database (e.g. -d 15)-s, --sleep=S Sleep for S seconds after dumping (for debugging)-n, --no_check_utf8-V, --version Display version-D, --debug--nosafe

其中-u代表Redis連接字符串,-d代表數據庫代號,默認是全部,-s代表導出之后的休眠時間,-n代表不檢測UTF-8編碼,-V表示顯示版本,-D表示開啟調試。

我們可以將JSON行文件導入到Redis數據庫中:

< redis_data.json redis-load -u :foobared@localhost:6379

這樣就可以成功將JSON行文件導入到數據庫中了。
另外,下面的命令同樣可以達到同樣的效果:

cat redis_data.json | redis-load -u :foobared@localhost:6379

參考博客來源(感謝分享):
https://segmentfault.com/a/1190000016696863
https://www.jianshu.com/p/2639549bedc8
https://www.cnblogs.com/melonjiang/p/5342505.html
https://www.cnblogs.com/john-xiong/p/12089103.html

總結

以上是生活随笔為你收集整理的python操作redis用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。