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 片段,使用緩存可以減少多次重復操作
