linux下redis的安裝與django-redis使用方法
Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。 Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。Django中經常用它來提升資料查詢效能。下面與大家一起學習如何在Linux下安裝與使用redis。
文章轉自django中文網:https://www.django.cn/article/show-24.html
1、redis安裝
一、redis安裝
Centos7下安裝redis
1、通過yum源安裝redis
yum install redis
2、如果沒有redis yum源則下載fedora的epel倉庫,然後再安裝redis
yum install epel-release #下載fedora的epel倉庫 yum install redis #安裝redis
3、安裝成功之後,通過下面命令啟動redis
# 啟動redis service redis start # 停止redis service redis stop # 檢視redis執行狀態 service redis status # 檢視redis程序 ps -ef | grep redis
4、讓redis開機自行啟動
chkconfig redis on
Ubuntu下安裝redis
1、安裝與解除安裝命令
sudo apt-get install redis-server #安裝 sudo apt-get purge --auto-remove redis-server #解除安裝
2、啟動redis
ps aux|grep redis #檢視redis狀態 sudo service redis-server start #啟動redis sudo service redis-server stop #停止redis
二、redis配置常用的配置方法
redis預設配置檔案為/etc/redis.conf,我們通常按需求修改裡面的引數對其進行設定。
1、指定Redis監聽埠,預設埠為6379
port 6379
2、繫結主機IP地址
bind 127.0.0.1
3、設定資料庫的數量,預設資料庫為0
databases 16
4、指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合
save <seconds> <changes>
Redis預設配置檔案中提供了三個條件:
save 900 1 save 300 10 save 60 10000
5、指定本地資料庫檔名,預設值為dump.rdb
dbfilename dump.rdb
6、指定本地資料庫存放目錄
dir /var/lib/redis #預設存放目錄
7、指定是否啟用重置雜湊,預設為開啟
activerehashing yes
8、設定Redis連線密碼,如果配置了連線密碼,客戶端在連線Redis時需要通過AUTH <password>命令提供密碼,預設關閉
requirepass foobared #foobared 為密碼
上面是學用的,更多的配置,請直接檢視配置檔案的註釋或者檢視官方文件。
三、redis常用操作
1、連線redis
redis-cli -h [ip] -p [埠] #例 redis-cli -h 127.0.0.1 -p 6379
如果設定密碼了的話,就輸入密碼:
auth 445813 #445813為密碼,輸入密碼前要密碼前面加 auth和空格
2、簡單的redis 鍵(key)操作
#新增 set key value #例 set webname django.cn set usrname "My namne is XXX" #中間有空格的要用引號 #通過KEY查詢 127.0.0.1:6379> get webname "django.cn" #刪除key del webname #設定過期時間(單位為秒) expire key timeout #也可以在設定值的時候,一同指定過期時間 set key value EX timeout #例子 set name django.cn EX 20 #設定20秒過期 #檢視過期時間 ttl key #如 ttl name #檢視當前redis中所有Key keys *
Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。更多關於不同資料型別操作方法,請大家檢視官方文件:https://redis.io/commands (英文),這裡還有一箇中文的,可以去看看。http://redisdoc.com/index.html
四、Python操作redis
1、安裝 python-redis
pip install redis
2、新建一個redis_demo.py檔案。輸入如下程式碼:
# 從redis包中匯入Redis類 from redis import Redis # 初始化redis例項變數 myredis = Redis(host='192.168.1.100',port=6379) #如果設定了密碼則 myredis = Redis(host='192.168.1.100',port=6379, password='445813')
3、對字串的操作
#新增一個值,並設定過期時間為60秒,如果不設定,則永遠不會過期 myredis.set('webname','django.cn',ex=60) #獲取Key值 myredis.get('webname') # 刪除一個值 myredis.delete('username') # 給某個值自增1 myredis.set('views',1) myredis.incr('views') # 這時候views變為2 # 給某個值減少1 myredis.decr('views') # 這時候views變為1
以上便展示了 python-redis 的一些常用方法,如果想深入瞭解其他的方法,可以參考 pythonredis 的原始碼(檢視原始碼 pycharm 快捷鍵提示:把滑鼠游標放在 import Redis 的 Redis 上,然後按 ctrl+b 即可進入)。
五、Django中使用redis
1、Django想要使用redis,我們需要先安裝django-redis
pip3 install django-redis
2、settings.py裡配置redia
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": "密碼", } } }
3、常規redis使用方法
import redis from django.shortcuts import render,HttpResponse from utils.redis_pool import POOL def index(request): conn = redis.Redis(connection_pool=POOL) conn.hset('kkk','age',18) return HttpResponse('設定成功') def order(request): conn = redis.Redis(connection_pool=POOL) conn.hget('kkk','age') return HttpResponse('獲取成功')
4、設定多個redis連結(settings.py)
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": "密碼", } }, "back": { "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": "密碼", } } }
獲取資料:
import redis from django.shortcuts import render,HttpResponse from django_redis import get_redis_connection def index(request): conn = get_redis_connection("default") return HttpResponse('設定成功') def order(request): conn = get_redis_connection("back") return HttpResponse('獲取成功')
5、Django全站快取
django中給整個網站都設定快取,我們需要在中介軟體的第一行和最後一行進行如下設定:
MIDDLEWARE = [ # 站點快取 , 注意必須在第一個位置 'django.middleware.cache.UpdateCacheMiddleware', ... # 站點快取, 注意必須在最後一個位置 'django.middleware.cache.FetchFromCacheMiddleware', ]
使用中介軟體,經過一系列的認證等操作,如果內容在快取中存在,則使用FetchFromCacheMiddleware獲取內容並返回給使用者,當返回給使用者之前,判斷快取中是否已經存在,如果不存在則UpdateCacheMiddleware會將快取儲存至快取,從而實現全站快取。
示例:
from django.shortcuts import render,HttpResponse import time def index(request): ctime = str(time.time()) return HttpResponse(ctime) def order(request): ctime = str(time.time()) return HttpResponse(ctime)
6、單頁面快取或者單檢視快取
把之前的中介軟體去掉,我們在視圖裡加裝飾器。需要留意的是,給檢視新增快取是有風險的,如果檢視所展示的網頁中有經常動態變動的資訊,那麼被新增快取命不可取。快取整個檢視最實用的場景應該是這個檢視所展示的網頁的內容基本上不怎麼變動,或者說在很長一段時間內不需要變動,這樣使用快取就非常有效。
from django.shortcuts import render,HttpResponse import time from django.views.decorators.cache import cache_page from rest_framework.throttling import SimpleRateThrottle @cache_page(60 * 15) def index(request): ctime = str(time.time()) return HttpResponse(ctime) def order(request): return render(request,'order.html')
7、URLconf中使用快取
上面說了函式檢視使用快取,但是我們可能還有一種場景,那就是多個 URL 指向同一個函式檢視,但是我只想快取一部分的 URL,這時候就可以採用在 URLconf 中使用快取,這樣就指定了哪些 URL 需要快取。
下面分別表示了函式檢視和類檢視的路由中使用快取的方式,基本一致:
from django.views.decorators.cache import cache _page urlpatterns = [ url(r'^foo/([0-9]{1,2})/$',cache_page(60 * 15)(index)), url(r'^$', cache_page(60 * 30)(IndexView.as_view()), name='order'), ]
URLconf 使用快取和檢視函式使用快取需要注意的地方是一樣的,因為它們都是快取整個頁面,所有都需要考慮是否整個頁面都應該快取。
8、模板頁面(區域性頁面)快取
模板中使用快取是比較推薦的一種快取方式,因為使用這種方式可以充分的考慮快取的顆粒度,細分顆粒度,可以保證只快取那些適合使用快取的 HTML 片段。
{% load cache %} <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title>Myblog</title> </head> <body> <h2>測試redis</h2> <div><p>非快取地段</p></div> {% cache 10 aabbcc %} <div><p>這裡快取</p></div> {% endcache %} </body>
如上圖,留意飄紅的位置。很多地方是不需要從資料庫查詢資料的,訪問頻率高,所以可以進行快取。
9、做快取之前,建議做一下測試(非必須)
進入django的後臺命令模式:
python manage.py shell
逐條輸入如下命令測試:
from django.core.cache import cache #引入快取模組 cache.set('v', '555', 60*60) #寫入key為v,值為555的快取,有效期30分鐘 cache.has_key('v') #判斷key為v是否存在 cache.get('v') #獲取key為v的快取
最後:
建議一般情況下不要進行整個頁面的快取,要有選擇性的,快取的使用原則:
1、純靜態頁面
2、讀取了資料庫資訊,但是不經常變動的頁面,比如文章熱門排行榜,這個呼叫資料庫資訊並且還要排序的完全可以使用快取,因為不需要實時展現最新的
3、HTML 的片段,比如整個頁面都經常變動,但是有個側邊欄不經常變動,就可以快取側邊欄
4、需要使用複雜邏輯生成的 HTML 片段,使用快取可以減少多次重複操作