共計 10054 個字符,預計需要花費 26 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章給大家分享的是有關淺談 Python 安裝并使用 redis 模塊的方法的內容。丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,一起跟隨丸趣 TV 小編過來看看吧。
安裝和使用
安裝
安裝 redis 模塊
pip3 install redis
普通連接
redis-py 提供兩個類 Redis 和 StrictRedis 用于實現 Redis 的命令,StrictRedis 用于實現大部分官方的命令,并使用官方的語法和命令,Redis 是 StrictRedis 的子類,用于向后兼容舊版本的 redis-py
import redis
conn = redis.Redis(host= 127.0.0.1 , port=6379)
# 可以使用 url 方式連接到數據庫
# conn = Redis.from_url(redis://@localhost:6379/1)
conn.set(name , LinWOW)
print(conn.get( name))
連接池
redis-py 使用 connection pool 來管理對一個 redis server 的所有連接,避免每次建立、釋放連接的開銷。默認,每個 Redis 實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數 Redis,這樣就可以實現多個 Redis 實例共享一個連接池
連接池: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))
構造 url 方式連接到數據庫,有以下三種模式:
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 操作 RedisString 操作方法作用示例示例結果 set(name, value, ex=None, px=None, nx=False, xx=False)ex,過期時間 (s);px,過期時間(ms);nx,如果設置為 True,則只有 name 不存在時,當前 set 操作才執行, 值存在,就修改不了,執行沒效果;xx,如果設置為 True,則只有 name 存在時,當前 set 操作才執行,值存在才能修改,值不存在,不會設置新值效果和 setex,setnx 一致
set(name, value) 給 name 賦值為 valueredis.set(‘name’,‘Bob’)Trueget(name)返回數據庫中 key 為 name 的 string 的 valueredis.get(‘name’)b’Bob’getset(name, value)給數據庫中 key 為 name 的 string 賦予值 value 并返回上次的 valueredis.getset(‘name’,‘Mike’)b’Bob’mget(keys, *args)返回多個 key 對應的 valueredis.mget([‘name’,‘nickname’])[b’Mike’, b’Miker’]setnx(name, value)如果 key 不存在才設置 valueredis.setnx(‘newname’,‘James’)第一次運行 True,第二次 Falsesetex(name, time, value)設置可以對應的值為 string 類型的 value,并指定此鍵值對應的有效期 redis.setex(‘name’, 1,‘James’)Truesetrange(name, offset, value)設置指定 key 的 value 值的子字符串 redis.set(‘name’,‘Hello’) redis.setrange(‘name’, 6,‘World’)11,修改后的字符串長度 mset(mapping)批量賦值 redis.mset({‘name1’:‘Durant’,‘name2’:‘James’})Truemsetnx(mapping)key 均不存在時才批量賦值 redis.msetnx({‘name3’:‘Smith’,‘name4’:‘Curry’})Trueincr(name, amount=1)key 為 name 的 value 增值操作,默認 1,key 不存在則被創建并設為 amountredis.incr(‘age’, 1)1,即修改后的值 decr(name, amount=1)key 為 name 的 value 減值操作,默認 1,key 不存在則被創建并設置為 -amountredis.decr(‘age’, 1)-1,即修改后的值 append(key, value)key 為 name 的 string 的值附加 valueredis.append(‘nickname’,‘OK’)13,即修改后的字符串長度 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 操作方法作用示例示例結果 exists(name)判斷一個 key 是否存在 redis.exists(‘name’)Truedelete(name)刪除一個 keyredis.delete(‘name’)1type(name)判斷 key 類型 redis.type(‘name’)b’string’keys(pattern)獲取所有符合規則的 keyredis.keys(‘n*’)[b’name’]randomkey()獲取隨機的一個 keyrandomkey()b’name’rename(src, dst)將 key 重命名 redis.rename(‘name’,‘nickname’)Truedbsize()獲取當前數據庫中 key 的數目 dbsize()100expire(name, time)設定 key 的過期時間,單位秒 redis.expire(‘name’, 2)Truettl(name)獲取 key 的過期時間,單位秒,- 1 為永久不過期 redis.ttl(‘name’)-1move(name, db)將 key 移動到其他數據庫 move(‘name’, 2)Trueflushdb()刪除當前選擇數據庫中的所有 keyflushdb()Trueflushall()刪除所有數據庫中的所有 keyflushall()TrueList 操作方法作用示例示例結果 rpush(name, *values)在 key 為 name 的 list 尾添加值為 value 的元素,可以傳多個 redis.rpush(‘list’, 1, 2, 3)3,list 大小 lpush(name, *values)在 key 為 name 的 list 頭添加值為 value 的元素,可以傳多個 redis.lpush(‘list’, 0)4,list 大小 llen(name)返回 key 為 name 的 list 的長度 redis.llen(‘list’)4lrange(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 的內容 ltrim(‘list’, 1, 3)Truelindex(name, index)返回 key 為 name 的 list 中 index 位置的元素 redis.lindex(‘list’, 1)b’2’lset(name, index, value)給 key 為 name 的 list 中 index 位置的元素賦值,越界則報錯 redis.lset(‘list’, 1, 5)Truelrem(name, count, value)刪除 count 個 key 的 list 中值為 value 的元素 redis.lrem(‘list’, 2, 3)1,即刪除的個數 lpop(name)返回并刪除 key 為 name 的 list 中的首元素 redis.lpop(‘list’)b’5’rpop(name)返回并刪除 key 為 name 的 list 中的尾元素 redis.rpop(‘list’)b’2’blpop(keys, timeout=0)返回并刪除名稱為在 keys 中的 list 中的首元素,如果 list 為空,則會一直阻塞等待 redis.blpop(‘list’)[b’5’]brpop(keys, timeout=0)返回并刪除 key 為 name 的 list 中的尾元素,如果 list 為空,則會一直阻塞等待 redis.brpop(‘list’)[b’2’]rpoplpush(src, dst)返回并刪除名稱為 src 的 list 的尾元素,并將該元素添加到名稱為 dst 的 list 的頭部 redis.rpoplpush(‘list’,‘list2’)b’2’
應用場景:
blpop 實現簡單分布式爬蟲:
多個 url 放到列表里,往里不停放 URL,程序循環取值,但是只能一臺機器運行取值,可以把 url 放到 redis 中,多臺機器從 redis 中取值,爬取數據,實現簡單分布式
將多個列表排列,按照從左到右去 pop 對應列表的元素
參數:
keys,redis 的 name 的集合
timeout,超時時間,當元素所有列表的元素獲取完之后,阻塞等待列表內有數據的時間(秒), 0 表示永遠阻塞
更多:
r.brpop(keys, timeout),從右向左獲取數據
自定義增量迭代:
由于 redis 類庫中沒有提供對列表元素的增量迭代,如果想要循環 name 對應的列表的所有元素,那么就需要:
1、獲取 name 對應的所有列表
2、循環列表
但是,如果列表非常大,那么就有可能在第一步時就將程序的內容撐爆,所有有必要自定義一個增量迭代的功能:
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 操作方法作用示例示例結果 sadd(name, *values)向 key 為 name 的 set 中添加元素 redis.sadd(‘tags’,‘Book’,‘Tea’,‘Coffee’)3,即插入的數據個數 srem(name, *values)從 key 為 name 的 set 中刪除元素 redis.srem(‘tags’,‘Book’)1,即刪除的數據個數 spop(name)隨機返回并刪除 key 為 name 的 set 中一個元素 redis.spop(‘tags’)b’Tea’smove(src, dst, value)從 src 對應的 set 中移除元素并添加到 dst 對應的 set 中 redis.smove(‘tags’,‘tags2’,‘Coffee’)Truescard(name)返回 key 為 name 的 set 的元素個數 redis.scard(‘tags’)3sismember(name, value)測試 member 是否是 key 為 name 的 set 的元素 redis.sismember(‘tags’,‘Book’)Truesinter(keys, *args)返回所有給定 key 的 set 的交集 redis.sinter([‘tags’,‘tags2’]){b’Coffee’}sinterstore(dest, keys, *args)求交集并將交集保存到 dest 的集合 redis.sinterstore(‘inttag’, [‘tags’,‘tags2’])1sunion(keys, *args)返回所有給定 key 的 set 的并集 redis.sunion([‘tags’,‘tags2’]){b’Coffee’, b’Book’, b’Pen’}sunionstore(dest, keys, *args)求并集并將并集保存到 dest 的集合 redis.sunionstore(‘inttag’, [‘tags’,‘tags2’])3sdiff(keys, *args)返回所有給定 key 的 set 的差集 redis.sdiff([‘tags’,‘tags2’]){b’Book’, b’Pen’}sdiffstore(dest, keys, *args)求差集并將差集保存到 dest 的集合 redis.sdiffstore(‘inttag’, [‘tags’,‘tags2’])3smembers(name)返回 key 為 name 的 set 的所有元素 redis.smembers(‘tags’){b’Pen’, b’Book’, b’Coffee’}srandmember(name)隨機返回 key 為 name 的 set 的一個元素,但不刪除元素 redis.srandmember(‘tags’)
Sorted Set 操作方法作用示例示例結果 zadd(name, args, *kwargs)向 key 為 name 的 zset 中添加元素 member,score 用于排序。如果該元素存在,則更新其順序 redis.zadd(‘grade’, 100,‘Bob’, 98,‘Mike’)2,即添加的元素個數 zrem(name, *values)刪除 key 為 name 的 zset 中的元素 redis.zrem(‘grade’,‘Mike’)1,即刪除的元素個數 zincrby(name, value, amount=1)如果在 key 為 name 的 zset 中已經存在元素 value,則該元素的 score 增加 amount,否則向該集合中添加該元素,其 score 的值為 amountredis.zincrby(‘grade’,‘Bob’, -2)98.0,即修改后的值 zrank(name, value)返回 key 為 name 的 zset 中元素的排名(按 score 從小到大排序)即下標 redis.zrank(‘grade’,‘Amy’)1zrevrank(name, value)返回 key 為 name 的 zset 中元素的倒數排名(按 score 從大到小排序)即下標 redis.zrevrank(‘grade’,‘Amy’)2zrevrange(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 在給定區間的元素 redis.zrangebyscore(‘grade’, 80, 95)[b’Amy’, b’James’]zcount(name, min, max)返回 key 為 name 的 zset 中 score 在給定區間的數量 redis.zcount(‘grade’, 80, 95)2zcard(name)返回 key 為 name 的 zset 的元素個數 redis.zcard(‘grade’)3zremrangebyrank(name, min, max)刪除 key 為 name 的 zset 中排名在給定區間的元素 redis.zremrangebyrank(‘grade’, 0, 0)1,即刪除的元素個數 zremrangebyscore(name, min, max)刪除 key 為 name 的 zset 中 score 在給定區間的元素 redis.zremrangebyscore(‘grade’, 80, 90)1,即刪除的元素個數 Hash 操作方法作用示例示例結果 hset(name, key, value)向 key 為 name 的 hash 中添加映射 hset(‘price’,‘cake’, 5)1,即添加的映射個數 hsetnx(name, key, value)向 key 為 name 的 hash 中添加映射,如果映射鍵名不存在 hsetnx(‘price’,‘book’, 6)1,即添加的映射個數 hget(name, key)返回 key 為 name 的 hash 中 field 對應的 valueredis.hget(‘price’,‘cake’)5hmget(name, keys, *args)返回 key 為 name 的 hash 中各個鍵對應的 valueredis.hmget(‘price’, [‘apple’,‘orange’])[b’3’, b’7’]hmset(name, mapping)向 key 為 name 的 hash 中批量添加映射 redis.hmset(‘price’, {‘banana’: 2,‘pear’: 6})Truehincrby(name, key, amount=1)將 key 為 name 的 hash 中映射的 value 增加 amountredis.hincrby(‘price’,‘apple’, 3)6,修改后的值 hexists(name, key)key 為 namehash 中是否存在鍵名為 key 的映射 redis.hexists(‘price’,‘banana’)Truehdel(name, *keys)key 為 namehash 中刪除鍵名為 key 的映射 redis.hdel(‘price’,‘banana’)Truehlen(name)從 key 為 name 的 hash 中獲取映射個數 redis.hlen(‘price’)6hkeys(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 中獲取所有映射鍵值對 redis.hgetall(‘price’){b’cake’: b’5’, b’book’: b’6’, b’orange’: b’7’, b’pear’: b’6’}
注意點:
hscan(name, cursor=0, match=None, count=None):增量式迭代獲取,對于數據大的數據非常有用,hscan 可以實現分片的獲取數據,并非一次性將數據全部獲取完,從而放置內存被撐爆
參數: name,redis 的 name
cursor,游標(基于游標分批取獲取數據) match,匹配指定 key,默認 None 表示所有的 key
count,每次分片最少獲取個數,默認 None 表示采用 Redis 的默認分片個數
第一次:cursor1, data1 = r.hscan(xx , cursor=0, match=None, count=None)
第二次:cursor2, data1 = r.hscan(xx , cursor=cursor1, match=None, count=None)
...
直到返回值 cursor 的值為 0 時,表示數據已經通過分片獲取完畢
hscan_iter(name, match=None, count=None):利用 yield 封裝 hscan 創建生成器,實現分批去 redis 中獲取數據
參數: match,匹配指定 key,默認 None 表示所有的 key
count,每次分片最少獲取個數,默認 None 表示采用 Redis 的默認分片個數
如: for item in r.hscan_iter(xx):
print item
管道
redis-py 默認在執行每次請求都會創建(連接池申請連接)和斷開(歸還連接池)一次連接操作,如果想要在一次請求中指定多個命令,則可以使用 pipline 實現一次請求指定多個命令,并且默認情況下一次 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)
視圖函數中使用:
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(設置成功)
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 ,
}
}
}
視圖函數:
from django_redis import get_redis_connection
conn = get_redis_connection(default)
print(conn.hgetall( xxx))
python 主要應用領域有哪些
1、云計算,典型應用 OpenStack。2、WEB 前端開發,眾多大型網站均為 Python 開發。3. 人工智能應用,基于大數據分析和深度學習而發展出來的人工智能本質上已經無法離開 python。4、系統運維工程項目,自動化運維的標配就是 python+Django/flask。5、金融理財分析,量化交易,金融分析。6、大數據分析。
感謝各位的閱讀!關于“淺談 Python 安裝并使用 redis 模塊的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
向 AI 問一下細節