1 redis其它操作
2 redis管道
3 django中使用redis
3.1 通用方案
3.2 第三方模塊
4 django緩存
5 celery介紹
5.1 celery的快速使用文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-722730.html
1 redis其它操作
'''
delete(*names)
exists(name)
keys(pattern='*')
expire(name ,time)
rename(src, dst)
move(name, db))
randomkey()
type(name)
'''
# redis的key值,最大可以是多少? 最大不超過(guò)512M 一般 1KB
# redis的value值,最大可以是多少? 最大不超過(guò)512M
'''
delete(*names)
exists(name)
keys(pattern='*')
expire(name ,time)
rename(src, dst)
move(name, db))
randomkey()
type(name)
'''
import redis
conn=redis.Redis()
# delete(*names)
# conn.delete('userinfo2')
# exists(name)
# print(conn.exists('name'))
# keys(pattern='*')
# print(conn.keys('user*'))
# print(conn.keys('*'))
# print(conn.keys())
# expire(name ,time)
# conn.expire('name',5)
# rename(src, dst)
# conn.rename('userinfo3','us')
# move(name, db))
# conn.move('us',3)
# randomkey()
# print(conn.randomkey())
# type(name)
# print(conn.type('hash2'))
print(conn.type('us'))
conn.close()
2 redis管道
# 事務(wù)四大特性
-原子性:要么都成功,要么都失敗
-一致性:數(shù)據(jù)前后要一致
-隔離性:多個(gè)事務(wù)之間相互不影響
-持久性:事務(wù)一旦完成,數(shù)據(jù)永久改變
# 關(guān)系型數(shù)據(jù)庫(kù),支持事務(wù)
# redis 有沒有事務(wù)?沒有專門的事務(wù),但是通過(guò)別的方式,可以實(shí)現(xiàn)事務(wù)的幾個(gè)特性,所以咱們認(rèn)為它具備事務(wù)
-redis要支持事務(wù),要完成事務(wù)的幾大特性,需要使用管道來(lái)支持
-單實(shí)例redis是支持管道的
-集群模式下,不支持管道,就不支持事務(wù)
import redis
conn = redis.Redis()
# 沒有管道的情況
# conn.decrby('my_money', 10)
# # 如果出現(xiàn)這種情況會(huì)報(bào)錯(cuò):
# # 我的錢扣了,但是有別的邏輯插入,我的錢響應(yīng)的會(huì)扣,但是對(duì)方的賬戶卻沒有加上我轉(zhuǎn)出去的錢
# l = [0, 1, 2]
# print(l[9])
# conn.incrby('zs_money', 10)
# 或者寫成
# conn.set('my_money', 90)
# conn.set('zs_money', 110)
## 通過(guò)管道實(shí)現(xiàn)事務(wù)
pipline = conn.pipeline()
# 創(chuàng)建了一個(gè)管道,把命令都一個(gè)個(gè)放到管道中,先不執(zhí)行,當(dāng)執(zhí)行execute,才會(huì)執(zhí)行管道中所有的命令
pipline.decrby('my_money', 10)
l = [0, 1, 2]
print(l[9])
pipline.incrby('zs_money', 10)
# 只有執(zhí)行了這句代碼,管道中才會(huì)真正的執(zhí)行
pipline.execute()
conn.close()
-------------------------------------------------------------------
### 通過(guò)管道實(shí)現(xiàn)事務(wù)
conn = redis.Redis()
pipline = conn.pipeline(transaction=True)
## 創(chuàng)建了一個(gè)管道,把命令都一個(gè)個(gè)放到管道中,先不執(zhí)行,當(dāng)執(zhí)行execute,才執(zhí)行管道中所有的命令
pipline.decrby('my_money', 10)
# 我的錢扣了,寫了點(diǎn)別的邏輯--》有可能拋異常
l = [0, 2, 3]
print(l[0])
pipline.incrby('zs_money', 10)
pipline.execute()
conn.close()
3 django中使用redis
3.1 通用方案
# 寫一個(gè)池
import redis
POOL = redis.ConnectionPool(max_connections=20)
# 在要使用的地方,導(dǎo)入使用即可
def redis_demo(requset):
conn = redis.Redis(connection_pool=POOL, decode_responses=True)
res = conn.incrby('count')
print(res)
return HttpResponse(f'您是我們第:{res}個(gè)用戶')
3.2 第三方模塊
# django-redis ---》配置文件中配置即可
pip install django-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",
}
},
}
# 在使用的位置,導(dǎo)入使用
from django_redis import get_redis_connection
def redis_demo(requset):
conn = get_redis_connection()
res = conn.incrby('count')
print(res)
return HttpResponse(f'您是我們第:{res}個(gè)用戶')
4 django緩存
# redis數(shù)據(jù)存在內(nèi)存中,取放速度快---》非常適合做緩存
本來(lái)數(shù)據(jù)在mysql中,每次都查詢,速度慢---》把查詢出來(lái)的數(shù)據(jù),暫時(shí)存儲(chǔ)到redis(緩存),下次請(qǐng)求再來(lái),直接從redis中拿,速度就會(huì)很快
# django中如何使用緩存
-配置文件配置(緩存位置:內(nèi)存,文件中,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ù)據(jù)放到緩存中(放到redis中)
from django.core.cache import cache
cache.set(key,value可以是任意類型,過(guò)期時(shí)間)
-redis只支持5大數(shù)據(jù)類型,可以放python的任意類型
-本質(zhì):pickle序列化---》bytes格式---》以redis字符串的形式放在了redis中
cache.get(key)
# 后期咱么在項(xiàng)目中,使用redis作為django的緩存,多一些,盡量不使用原生redis操作
# 前后端分離中,使用 cache.set cache.get
# 前后端混合中
可以整站緩存
可以要緩存一個(gè)頁(yè)面
可以緩存頁(yè)面中的某個(gè)位置
# 可以緩存的位置:
內(nèi)存中
本地文件中
數(shù)據(jù)庫(kù)中
reids中 (咱們用的多)
# 測(cè)試緩存---django的緩存----可以發(fā)個(gè)任意,但是redis就不能
class Person:
pass
def cache_demo_set(request):
# cache.set('count', 100, 5) # 往緩存中放了count為100,5秒后過(guò)期
# cache.set('count', [1, 2, 'hello', '你好'], 5)
# cache.set('count', {'name': 'ldj', 'age': 19}, 5)
p = Person()
p.name = 'ldj'
cache.set('count', p)
return HttpResponse('緩存成功')
def cache_demo_get(request):
# print(cache.get('count'))
print(cache.get('count').name)
return HttpResponse('獲取成功')
5 celery介紹
Celery 官網(wǎng):
http://www.celeryproject.org/
Celery 官方文檔英文版:
http://docs.celeryproject.org/en/latest/index.html
Celery 官方文檔中文版:
http://docs.jinkan.org/docs/celery/
# celery是什么?
分布式異步任務(wù)框架:第三方框架,celery翻譯過(guò)來(lái)是芹菜,吉祥物就是芹菜
項(xiàng)目中使用異步任務(wù)的場(chǎng)景,可以使用它
之前做異步,如何做? 異步發(fā)送短信---》開啟多線程---》不便于管理
# celery有什么作用?
-執(zhí)行異步任務(wù)
-執(zhí)行延遲任務(wù)
-執(zhí)行定時(shí)任務(wù)
# celery原理
1)可以不依賴任何服務(wù)器,通過(guò)自身命令,啟動(dòng)服務(wù)
2)celery服務(wù)為為其他項(xiàng)目服務(wù)提供異步解決任務(wù)需求的
注:會(huì)有兩個(gè)服務(wù)同時(shí)運(yùn)行,一個(gè)是項(xiàng)目服務(wù),一個(gè)是celery服務(wù),項(xiàng)目服務(wù)將需要異步處理的任務(wù)交給celery服務(wù),celery就會(huì)在需要時(shí)異步完成項(xiàng)目的需求
人是一個(gè)獨(dú)立運(yùn)行的服務(wù) | 醫(yī)院也是一個(gè)獨(dú)立運(yùn)行的服務(wù)
正常情況下,人可以完成所有健康情況的動(dòng)作,不需要醫(yī)院的參與;但當(dāng)人生病時(shí),就會(huì)被醫(yī)院接收,解決人生病問(wèn)題
人生病的處理方案交給醫(yī)院來(lái)解決,所有人不生病時(shí),醫(yī)院獨(dú)立運(yùn)行,人生病時(shí),醫(yī)院就來(lái)解決人生病的需求
django如果不用異步,正常運(yùn)行即可,如果想做異步,就借助于 celery來(lái)完成
# celery架構(gòu)
-broker:消息中間件,任務(wù)中間件(消息隊(duì)列:redis,rabbitmq)
django要做異步,提交任務(wù)到 任務(wù)中間件中(redis),存儲(chǔ)起來(lái)
Celery本身不提供消息服務(wù),但是可以方便的和第三方提供的消息中間件集成。包括,RabbitMQ, Redis等等
-worker:任務(wù)執(zhí)行者,任務(wù)執(zhí)行單元
不停的從任務(wù)中間件中取任務(wù),執(zhí)行
Worker是Celery提供的任務(wù)執(zhí)行的單元,worker并發(fā)的運(yùn)行在分布式的系統(tǒng)節(jié)點(diǎn)中
-banckend:結(jié)果存儲(chǔ),任務(wù)結(jié)果存儲(chǔ)
把任務(wù)執(zhí)行結(jié)果(函數(shù)返回值),存放到結(jié)果存儲(chǔ)中(redis)
用來(lái)存儲(chǔ)Worker執(zhí)行的任務(wù)的結(jié)果,Celery支持以不同方式存儲(chǔ)任務(wù)的結(jié)果,包括AMQP, redis等
### 任務(wù)中間件:redis
### 結(jié)果存儲(chǔ):redis
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-722730.html
5.1 celery的快速使用
# 0 開源的,小組織,不支持win,不要就win的問(wèn)題展開討論了
win上:需要借助于第三方
##### 1 安裝:
pip install celery # 最新 5.3.4
###### 2 寫代碼 main.py
import time
from celery import Celery
# 1 實(shí)例化得到對(duì)象
broker = 'redis://127.0.0.1:6379/1' # 消息中間件 redis
backend = 'redis://127.0.0.1:6379/2' # 結(jié)果存,用redis
app = Celery('app', broker=broker, backend=backend)
# 編寫任務(wù),必須用app.task 裝飾,才變成了celery的任務(wù)
@app.task
def send_sms():
time.sleep(1)
print('短信發(fā)送成功')
return '手機(jī)號(hào)短信發(fā)送成功'
#### 3 提交任務(wù),使用別的進(jìn)程
from main import send_sms
res=send_sms.delay()
print(res)
### 4 啟動(dòng)worker---》可以在3之前
# windows:
pip3 install eventlet
celery -A main worker -l info -P eventlet
# mac linux
# celery -A main worker -l info
### 5 worker就會(huì)執(zhí)行任務(wù),把執(zhí)行的結(jié)果,放到結(jié)果存儲(chǔ)中
### 6 查看結(jié)果
from celery.result import AsyncResult
from main import app
id = '92987636-ae9e-4be9-828b-8c2d10fe066a'
if __name__ == '__main__':
a = AsyncResult(id=id, app=app)
if a.successful():
result = a.get()
print(result)
elif a.failed():
print('任務(wù)失敗')
elif a.status == 'PENDING':
print('任務(wù)等待中被執(zhí)行')
elif a.status == 'RETRY':
print('任務(wù)異常后正在重試')
elif a.status == 'STARTED':
print('任務(wù)已經(jīng)開始被執(zhí)行')
到了這里,關(guān)于redis(其它操作、管道)、django中使用redis(通用方案、 第三方模塊)、django緩存、celery介紹(celery的快速使用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!