淺談Python安裝并使用redis模塊的方法

本篇文章給大家介紹一下python安裝并使用redis模塊的方法。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

淺談Python安裝并使用redis模塊的方法

【相關(guān)推薦:Redis視頻教程

安裝和使用

安裝

安裝redis模塊

pip3?install?redis

普通連接

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

立即學(xué)習(xí)Python免費(fèi)學(xué)習(xí)筆記(深入)”;

import?redis conn?=?redis.Redis(host='127.0.0.1',?port=6379) #?可以使用url方式連接到數(shù)據(jù)庫(kù) #?conn?=?Redis.from_url('redis://@localhost:6379/1') conn.set('name',?'LinWOW') print(conn.get('name'))

連接池

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

連接池:redis_pool.py

from?redis?import?ConnectionPool POOL=ConnectionPool(host='127.0.0.1',port=6379,max_connections=100)

使用連接池:test_redis.py

import?redis from?redis_pool?import?POOl conn?=?redis.Redis(connection_pool=POOl) conn.set('name',?'LinWOW') print(conn.get('name'))

構(gòu)造url方式連接到數(shù)據(jù)庫(kù),有以下三種模式:

redis://[:password]@host:port/db????#?TCP連接 rediss://[:password]@host:port/db???#?Redis?TCP+SSL?連接 unix://[:password]@/path/to/socket.sock?db=db????#?Redis?Unix?Socket?連接

python操作Redis

String操作

方法 作用 示例 示例結(jié)果
set(name, value, ex=None, px=None, nx=False, xx=False) ex,過(guò)期時(shí)間(s);px,過(guò)期時(shí)間(ms);nx,如果設(shè)置為T(mén)rue,則只有name不存在時(shí),當(dāng)前set操作才執(zhí)行,值存在,就修改不了,執(zhí)行沒(méi)效果;xx,如果設(shè)置為T(mén)rue,則只有name存在時(shí),當(dāng)前set操作才執(zhí)行,值存在才能修改,值不存在,不會(huì)設(shè)置新值 效果和setex,setnx一致
set(name, value) 給name賦值為value redis.set(‘name’, ‘Bob’) True
get(name) 返回?cái)?shù)據(jù)庫(kù)中key為name的string的value redis.get(‘name’) b’Bob’
getset(name, value) 給數(shù)據(jù)庫(kù)中key為name的string賦予值value并返回上次的value redis.getset(‘name’, ‘Mike’) b’Bob’
mget(keys, *args) 返回多個(gè)key對(duì)應(yīng)的value redis.mget([‘name’, ‘nickname’]) [b’Mike’, b’Miker’]
setnx(name, value) 如果key不存在才設(shè)置value redis.setnx(‘newname’, ‘James’) 第一次運(yùn)行True,第二次False
setex(name, time, value) 設(shè)置可以對(duì)應(yīng)的值為string類(lèi)型的value,并指定此鍵值對(duì)應(yīng)的有效期 redis.setex(‘name’, 1, ‘James’) True
setrange(name, offset, value) 設(shè)置指定key的value值的子字符串 redis.set(‘name’, ‘Hello’) redis.setrange(‘name’, 6, ‘World’) 11,修改后的字符串長(zhǎng)度
mset(mapping) 批量賦值 redis.mset({‘name1’: ‘Durant’, ‘name2’: ‘James’}) True
msetnx(mapping) key均不存在時(shí)才批量賦值 redis.msetnx({‘name3’: ‘Smith’, ‘name4’: ‘Curry’}) True
incr(name, amount=1) key為name的value增值操作,默認(rèn)1,key不存在則被創(chuàng)建并設(shè)為amount redis.incr(‘a(chǎn)ge’, 1) 1,即修改后的值
decr(name, amount=1) key為name的value減值操作,默認(rèn)1,key不存在則被創(chuàng)建并設(shè)置為-amount redis.decr(‘a(chǎn)ge’, 1) -1,即修改后的值
append(key, value) key為name的string的值附加value redis.append(‘nickname’, ‘OK’) 13,即修改后的字符串長(zhǎng)度
substr(name, start, end=-1) 返回key為name的string的value的子串 redis.substr(‘name’, 1, 4) b’ello’
getrange(key, start, end) 獲取key的value值從start到end的子字符串 redis.getrange(‘name’, 1, 4) b’ello’

Key操作

方法 作用 示例 示例結(jié)果
exists(name) 判斷一個(gè)key是否存在 redis.exists(‘name’) True
delete(name) 刪除一個(gè)key redis.delete(‘name’) 1
type(name) 判斷key類(lèi)型 redis.type(‘name’) b’string’
keys(pattern) 獲取所有符合規(guī)則的key redis.keys(‘n*’) [b’name’]
randomkey() 獲取隨機(jī)的一個(gè)key randomkey() b’name’
rename(src, dst) 將key重命名 redis.rename(‘name’, ‘nickname’) True
dbsize() 獲取當(dāng)前數(shù)據(jù)庫(kù)中key的數(shù)目 dbsize() 100
expire(name, time) 設(shè)定key的過(guò)期時(shí)間,單位秒 redis.expire(‘name’, 2) True
ttl(name) 獲取key的過(guò)期時(shí)間,單位秒,-1為永久不過(guò)期 redis.ttl(‘name’) -1
move(name, db) 將key移動(dòng)到其他數(shù)據(jù)庫(kù) move(‘name’, 2) True
flushdb() 刪除當(dāng)前選擇數(shù)據(jù)庫(kù)中的所有key flushdb() True
flushall() 刪除所有數(shù)據(jù)庫(kù)中的所有key flushall() True

List操作

方法 作用 示例 示例結(jié)果
rpush(name, *values) 在key為name的list尾添加值為value的元素,可以傳多個(gè) redis.rpush(‘list’, 1, 2, 3) 3,list大小
lpush(name, *values) 在key為name的list頭添加值為value的元素,可以傳多個(gè) redis.lpush(‘list’, 0) 4,list大小
llen(name) 返回key為name的list的長(zhǎng)度 redis.llen(‘list’) 4
lrange(name, start, end) 返回key為name的list中start至end之間的元素 redis.lrange(‘list’, 1, 3) [b’3’, b’2’, b’1’]
ltrim(name, start, end) 截取key為name的list,保留索引為start到end的內(nèi)容 ltrim(‘list’, 1, 3) True
lindex(name, index) 返回key為name的list中index位置的元素 redis.lindex(‘list’, 1) b’2’
lset(name, index, value) 給key為name的list中index位置的元素賦值,越界則報(bào)錯(cuò) redis.lset(‘list’, 1, 5) True
lrem(name, count, value) 刪除count個(gè)key的list中值為value的元素 redis.lrem(‘list’, 2, 3) 1,即刪除的個(gè)數(shù)
lpop(name) 返回并刪除key為name的list中的首元素 redis.lpop(‘list’) b’5’
rpop(name) 返回并刪除key為name的list中的尾元素 redis.rpop(‘list’) b’2’
blpop(keys, timeout=0) 返回并刪除名稱(chēng)為在keys中的list中的首元素,如果list為空,則會(huì)一直阻塞等待 redis.blpop(‘list’) [b’5’]
brpop(keys, timeout=0) 返回并刪除key為name的list中的尾元素,如果list為空,則會(huì)一直阻塞等待 redis.brpop(‘list’) [b’2’]
rpoplpush(src, dst) 返回并刪除名稱(chēng)為src的list的尾元素,并將該元素添加到名稱(chēng)為dst的list的頭部 redis.rpoplpush(‘list’, ‘list2’) b’2’

應(yīng)用場(chǎng)景:

blpop實(shí)現(xiàn)簡(jiǎn)單分布式爬蟲(chóng):

多個(gè)url放到列表里,往里不停放URL,程序循環(huán)取值,但是只能一臺(tái)機(jī)器運(yùn)行取值,可以把url放到redis中,多臺(tái)機(jī)器從redis中取值,爬取數(shù)據(jù),實(shí)現(xiàn)簡(jiǎn)單分布式

將多個(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ù)

自定義增量迭代:

由于redis類(lèi)庫(kù)中沒(méi)有提供對(duì)列表元素的增量迭代,如果想要循環(huán)name對(duì)應(yīng)的列表的所有元素,那么就需要:

? ? 1、獲取name對(duì)應(yīng)的所有列表

? ? 2、循環(huán)列表

但是,如果列表非常大,那么就有可能在第一步時(shí)就將程序的內(nèi)容撐爆,所有有必要自定義一個(gè)增量迭代的功能:

import?redis conn=redis.Redis(host='127.0.0.1',port=6379) #?conn.lpush('test',*[1,2,3,4,45,5,6,7,7,8,43,5,6,768,89,9,65,4,23,54,6757,8,68]) #?conn.flushall() def?scan_list(name,count=2): ????index=0 ????while?True: ????????data_list=conn.lrange(name,index,count+index-1) ????????if?not?data_list: ????????????return ????????index+=count ????????for?item?in?data_list: ????????????yield?item print(conn.lrange('test',0,100)) for?item?in?scan_list('test',5): ????print('---') ????print(item)

Set操作

方法 作用 示例 示例結(jié)果
sadd(name, *values) 向key為name的set中添加元素 redis.sadd(‘tags’, ‘Book’, ‘Tea’, ‘Coffee’) 3,即插入的數(shù)據(jù)個(gè)數(shù)
srem(name, *values) 從key為name的set中刪除元素 redis.srem(‘tags’, ‘Book’) 1,即刪除的數(shù)據(jù)個(gè)數(shù)
spop(name) 隨機(jī)返回并刪除key為name的set中一個(gè)元素 redis.spop(‘tags’) b’Tea’
smove(src, dst, value) 從src對(duì)應(yīng)的set中移除元素并添加到dst對(duì)應(yīng)的set中 redis.smove(‘tags’, ‘tags2’, ‘Coffee’) True
scard(name) 返回key為name的set的元素個(gè)數(shù) redis.scard(‘tags’) 3
sismember(name, value) 測(cè)試member是否是key為name的set的元素 redis.sismember(‘tags’, ‘Book’) True
sinter(keys, *args) 返回所有給定key的set的交集 redis.sinter([‘tags’, ‘tags2’]) {b’Coffee’}
sinterstore(dest, keys, *args) 求交集并將交集保存到dest的集合 redis.sinterstore(‘inttag’, [‘tags’, ‘tags2’]) 1
sunion(keys, *args) 返回所有給定key的set的并集 redis.sunion([‘tags’, ‘tags2’]) {b’Coffee’, b’Book’, b’Pen’}
sunionstore(dest, keys, *args) 求并集并將并集保存到dest的集合 redis.sunionstore(‘inttag’, [‘tags’, ‘tags2’]) 3
sdiff(keys, *args) 返回所有給定key的set的差集 redis.sdiff([‘tags’, ‘tags2’]) {b’Book’, b’Pen’}
sdiffstore(dest, keys, *args) 求差集并將差集保存到dest的集合 redis.sdiffstore(‘inttag’, [‘tags’, ‘tags2’]) 3
smembers(name) 返回key為name的set的所有元素 redis.smembers(‘tags’) {b’Pen’, b’Book’, b’Coffee’}
srandmember(name) 隨機(jī)返回key為name的set的一個(gè)元素,但不刪除元素 redis.srandmember(‘tags’)

Sorted Set操作

方法 作用 示例 示例結(jié)果
zadd(name, args, *kwargs) 向key為name的zset中添加元素member,score用于排序。如果該元素存在,則更新其順序 redis.zadd(‘grade’, 100, ‘Bob’, 98, ‘Mike’) 2,即添加的元素個(gè)數(shù)
zrem(name, *values) 刪除key為name的zset中的元素 redis.zrem(‘grade’, ‘Mike’) 1,即刪除的元素個(gè)數(shù)
zincrby(name, value, amount=1) 如果在key為name的zset中已經(jīng)存在元素value,則該元素的score增加amount,否則向該集合中添加該元素,其score的值為amount redis.zincrby(‘grade’, ‘Bob’, -2) 98.0,即修改后的值
zrank(name, value) 返回key為name的zset中元素的排名(按score從小到大排序)即下標(biāo) redis.zrank(‘grade’, ‘Amy’) 1
zrevrank(name, value) 返回key為name的zset中元素的倒數(shù)排名(按score從大到小排序)即下標(biāo) redis.zrevrank(‘grade’, ‘Amy’) 2
zrevrange(name, start, end, withscores=False) 返回key為name的zset(按score從大到小排序)中的index從start到end的所有元素 redis.zrevrange(‘grade’, 0, 3) [b’Bob’, b’Mike’, b’Amy’, b’James’]
zrangebyscore(name, min, max, start=None, num=None, withscores=False) 返回key為name的zset中score在給定區(qū)間的元素 redis.zrangebyscore(‘grade’, 80, 95) [b’Amy’, b’James’]
zcount(name, min, max) 返回key為name的zset中score在給定區(qū)間的數(shù)量 redis.zcount(‘grade’, 80, 95) 2
zcard(name) 返回key為name的zset的元素個(gè)數(shù) redis.zcard(‘grade’) 3
zremrangebyrank(name, min, max) 刪除key為name的zset中排名在給定區(qū)間的元素 redis.zremrangebyrank(‘grade’, 0, 0) 1,即刪除的元素個(gè)數(shù)
zremrangebyscore(name, min, max) 刪除key為name的zset中score在給定區(qū)間的元素 redis.zremrangebyscore(‘grade’, 80, 90) 1,即刪除的元素個(gè)數(shù)

Hash操作

方法 作用 示例 示例結(jié)果
hset(name, key, value) 向key為name的hash中添加映射 hset(‘price’, ‘cake’, 5) 1,即添加的映射個(gè)數(shù)
hsetnx(name, key, value) 向key為name的hash中添加映射,如果映射鍵名不存在 hsetnx(‘price’, ‘book’, 6) 1,即添加的映射個(gè)數(shù)
hget(name, key) 返回key為name的hash中field對(duì)應(yīng)的value redis.hget(‘price’, ‘cake’) 5
hmget(name, keys, *args) 返回key為name的hash中各個(gè)鍵對(duì)應(yīng)的value redis.hmget(‘price’, [‘a(chǎn)pple’, ‘orange’]) [b’3’, b’7’]
hmset(name, mapping) 向key為name的hash中批量添加映射 redis.hmset(‘price’, {‘banana’: 2, ‘pear’: 6}) True
hincrby(name, key, amount=1) 將key為name的hash中映射的value增加amount redis.hincrby(‘price’, ‘a(chǎn)pple’, 3) 6,修改后的值
hexists(name, key) key為namehash中是否存在鍵名為key的映射 redis.hexists(‘price’, ‘banana’) True
hdel(name, *keys) key為namehash中刪除鍵名為key的映射 redis.hdel(‘price’, ‘banana’) True
hlen(name) 從key為name的hash中獲取映射個(gè)數(shù) redis.hlen(‘price’) 6
hkeys(name) 從key為name的hash中獲取所有映射鍵名 redis.hkeys(‘price’) [b’cake’, b’book’, b’banana’, b’pear’]
hvals(name) 從key為name的hash中獲取所有映射鍵值 redis.hvals(‘price’) [b’5’, b’6’, b’2’, b’6’]
hgetall(name) 從key為name的hash中獲取所有映射鍵值對(duì) redis.hgetall(‘price’) {b’cake’: b’5’, b’book’: b’6’, b’orange’: b’7’, b’pear’: b’6’}

注意點(diǎn):

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ò)分片獲取完畢

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?item?in?r.hscan_iter('xx'): ????????print?item

管道

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 是原子性操作。

import?redis pool?=?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) pipe.multi() pipe.set('name',?'linwow') pipe.set('age',?'18') pipe.execute()

django中使用redis

方式一:

utils文件夾下,建立redis_pool.py

import?redis POOL?=?redis.ConnectionPool(host='127.0.0.1',?port=6379,password='1234',max_connections=1000)

視圖函數(shù)中使用:

import?redis from?django.shortcuts?import?render,HttpResponse from?redis_pool?import?POOL  def?index(request): ????conn?=?redis.Redis(connection_pool=POOL) ????conn.hset('liwow','age',18) ????return?HttpResponse('設(shè)置成功') ???? def?order(request): ????conn?=?redis.Redis(connection_pool=POOL) ????conn.hget('kkk','age') ????return?HttpResponse('獲取成功')

方式二:

安裝django-redis模塊

pip3?install?django-redis

setting里配置:

#?redis配置 CACHES?=?{ ????"default":?{ ????????"BACKEND":?"django_redis.cache.RedisCache", ????????"LOCATION":?"redis://127.0.0.1:6379", ????????"OPTIONS":?{ ????????????"CLIENT_CLASS":?"django_redis.client.DefaultClient", ????????????"CONNECTION_POOL_KWARGS":?{"max_connections":?100} ????????????#?"PASSWORD":?"123", ????????} ????} }

視圖函數(shù):

from?django_redis?import?get_redis_connection conn?=?get_redis_connection('default') print(conn.hgetall('xxx'))

更多編程相關(guān)知識(shí),請(qǐng)?jiān)L問(wèn):Redis視頻教程!!

以上就是淺談Python安裝并使用

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享