1. 程式人生 > >Django 緩存 使用 Redis Memcached 為網站提速

Django 緩存 使用 Redis Memcached 為網站提速

實例化 .cn question 配置文件 p地址 client 測試 copy article

Redis
Redis是一種鍵值對類型的內存數據庫,讀寫內存比讀寫硬盤快,我們在Django裏面使用Redis非常方便,下面給出詳細步驟

基於Ubuntu

1. 安裝Redis和django-redis
sudo apt-get install redis-server
1
用 redis 做 Django的緩存系統的開源項目地址,有興趣的看看:https://github.com/niwibe/django-redis
在這裏我們把它裝上,讓Django和Redis手拉手交個朋友


pip install django-redis
1
2
2. 檢查運行狀態
ps -aux|grep redis
1
netstat -nlt|grep 6379

1
3. 修改seetings.py
#配置我是這麽寫的沒問題
CACHES = {
‘default‘: {
‘BACKEND‘: ‘django_redis.cache.RedisCache‘,
‘LOCATION‘: ‘127.0.0.1:6379‘,
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
},
},
}
1
2
3
4
5
6
7
8
9
10
#如果你的有問題,試試官方的寫法 http://django-redis-chs.readthedocs.io/zh_CN/latest/#
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
1
2
3
4
5
6
7
8
9
10
4. 測試redis緩存
#進Django的shell裏面
python manage.py shell
1
2
#從shell裏面輸入下面命令測試,不報錯就正常,要是報錯了要麽沒開啟redis要麽沒裝好,檢查之前的步驟
from django.core.cache import cache
#寫入key為key1,值為666的緩存,有效期30分鐘
cache.set(‘key1‘, ‘666‘, 30*60)
cache.has_key(‘key1‘) #判斷key為k是否存在
cache.get(‘key1‘) #獲取key為k的緩存
1
2
3
4
5
6
5. 更新和讀取緩存
之前在Views.py視圖函數裏面,收到form提交的更新只是寫入數據庫,現在增加個更新緩存

#寫入緩存
key = ‘QuestionCache‘
from django.core.cache import cache

def ask_question(request):

question_category_name = request.POST[‘radio‘]
question_title = request.POST[‘question_title‘]
question_keywords = request.POST[‘question_keywords‘]
question_text = request.POST[‘question_content‘]
#沒必要再設置這個字段了,models裏面可以用auto_now自動獲取當前時間的question_date = datetime.datetime.now()
question_author = request.user
joe = QuestionCategory.objects.get(category_name=question_category_name)
qqqq = Question(question_category=joe,question_title=question_title,question_keywords=question_keywords,question_text=question_text,question_author=question_author)
#寫入數據庫
qqqq.save()

#更新緩存
cache.set(key, list(Question.objects.all().order_by(‘-question_date‘)))

return redirect(‘pythonnav:blogindex_html‘)


# 讀取緩存
def blogindex_html(request):
#獲取問題所有分類
a = QuestionCategory.objects.all()
es = []
for e in a:
es.append(e.category_name)

# 展示所有的問題
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
limit = 10 # 每頁顯示的記錄條數

#以前是直接從數據庫查,每次都查數據多了要死人的,5555
#現在先判斷下,如果redis內存裏面有就從內存讀,不從數據庫裏查了,耶,感覺萌萌噠
if cache.has_key(key):
question = cache.get(key)
else:
question = Question.objects.all().order_by(‘-question_date‘)
paginator = Paginator(question,limit)#實例化一個分頁對象

page = request.GET.get(‘page‘) #獲取到頁碼

try:
q = paginator.page(page) #獲取某夜對應的記錄
except PageNotAnInteger: #如果頁碼不是個整數
q = paginator.page(1)#取第一頁的記錄
except EmptyPage:#如果頁碼太大
q = paginator.page(paginator.num_pages)#取最後一頁的記錄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Memcached
使用前準備工作
1.ubuntu下先安裝:

sudo apt-get install memcached
pip install python-memcached
1
2
2.啟動memcached

memcached -d -m 64 -u www -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
1
-d選項是啟動一個守護進程,

-m是分配給Memcache使用的內存數量,單位是MB,我這裏設的是64MB,

-u是運行Memcache的用戶,我這裏是www,

-l是監聽的服務器IP地址,如果有多個地址的話,用空格分隔

-p是設置Memcache監聽的端口,我這裏設置了11211,最好是1024以上的端口,

-c選項是最大運行的並發連接數,默認是1024

-P是設置保存Memcache的PID文件,我這裏是保存在 /tmp/memcached.pid,方便查看PID

3.查看memcached:

啟動成功後,查看進程狀態:

ps -ef | grep memcached
1
查看11211端口狀態:

netstat -ntl
1
memcached的配置文件路徑:

/etc/sysconfig/memcached
1
4.測試memcache是否可以使用:
python manage.py shell 進入Django shell中

from django.core.cache import cache
cache.set(‘key1‘, ‘test‘)
value = cache.get(‘key1‘)
print value
#得到結果test
1
2
3
4
5
1.Django中seetings裏面的設置
使用IP端口與Django交互
CACHES = {
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
‘LOCATION‘: ‘127.0.0.1:11211‘,
}
}

也可以通過一個本地的Unix socket file/tmp/memcached.sock來交互
CACHES = {
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
‘LOCATION‘: ‘unix:/tmp/memcached.sock‘,
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
題外話:Memcached有一個非常好的特點就是可以讓幾個服務的緩存共享。 這就意味著你可以再幾個物理機上運行Memcached服務,這些程序將會把這幾個機器當做 同一個 緩存,從而不需要復制每個緩存的值在每個機器上。為了使用這個特性,把所有的服務地址放在LOCATION裏面,用分號隔開或者當做一個list。

CACHES = {
‘default‘: {
‘BACKEND‘: ‘django.core.cache.backends.memcached.MemcachedCache‘,
‘LOCATION‘: [
‘172.19.26.240:11211‘,
‘172.19.26.242:11211‘,
]
}
}
1
2
3
4
5
6
7
8
9
2.Django中具體使用和Redis差不多
緩存數據

from django.core.cache import cache
def about(request):
if cache.get(‘key1‘):
data = cache.get(‘key1‘)
else:
訪問數據庫,得到data
cache.set(‘data‘)
...
1
2
3
4
5
6
7
8
每次進來,先查看cache中是否存在,若存在,直接獲得該值,若不存在,則訪問數據庫,
得到數據之後,將其寫入到cache之後,以便後續之用。

緩存整個頁面。
可以使用Django提供的cache_page裝飾函數,例如緩存about頁面:
from django.views.decorators.cache import cache_page

@cache_page(60*30)
def about(request):
...
1
2
3
只需在view函數前加上cache_page裝飾函數便可以該頁面,cache_page的參數是緩存時間
這裏設的是60s*30,即30分鐘。同時也可以指定使用的緩存,通過cache參數來指定,例如:
@cache_page(60*30, cache=‘file_cache‘)則指定使用settings文件中CACHES中的file_cache
來緩存,若不指定,默認用default的來緩存。

更多參考:
http://python.usyiyi.cn/translate/django_182/topics/cache.html

Django 緩存
Django緩存簡介為什麽要用緩存?我們知道,在Django中,請求到達視圖後,視圖會從數據庫取數據放到模板中進行動態渲染,渲染後的結果就是用戶看到的html頁面。但是,如果每次請求都從數據庫取數據並...
---------------------
作者:Peace & Love
來源:CSDN
原文:https://blog.csdn.net/u013205877/article/details/77397273?utm_source=copy
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

Django 緩存 使用 Redis Memcached 為網站提速