相信大家曾經都有過這樣的經歷:注冊某個網站時,通過點擊獲取短信驗證碼,而驗證碼會一般會有60秒的超時時間限制,即:60s之后短信驗證碼失效,需重新獲取驗證碼。
剛才說的短信驗證碼失效的事 和 今天的話題redis有什么關系呢?
redis是一個軟件,他恰好提供了一個可以設置值並允許設定超時時間的功能,例如:
例如:我在redis中設置一個 鍵 值 並指定超時時間為 10 秒,簡化之后可以這樣實現
conn.set("15131255089",9871,10)
,之后還可以根據 鍵 再可以去獲取對應的值value = conn.get("15131255089")
,如果已超時則獲取的值為空。
so,今天要給大家先聊聊redis,這樣以后在項目中我們就可以用上他了。
聲明:redis中要學的知識點非常多,而這些redis專項內容會在咱們之后的Linux架構的課程中詳細講解,本節主要以“短信超時”功能為目的來講解。
1. 什么是redis?
官方:Redis是一個使用 C語言 編寫的開源、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫。
白話:Redis是一個軟件,這個軟件可以幫助我們維護一部分內存,讓我們往那塊內存中進行存取值。如果數據在內存中存儲,遇到宕機那么數據就會丟失,而redis解決了這個問題,他可以將內存中的數據以某種策略存儲到硬盤,以保證宕機數據不丟失。
Redis和MySQL數據庫的比較?
redis,直接在內存中進行存取數據,速度非常快;由於在內存,所以存儲的數據不能太多,內存一般8G/16G;對數據可以設置自動超時時間;mysql,通過SQL語句操作的數據都在硬盤上,速度相對慢;由於存儲在硬盤,所以存儲的數據可以非常多,硬盤一般500G/1T;數據不能自動超時,想超時需要自定寫SQL處理;
2. 安裝redis
由於目前同學們還未接觸過 Linux 操作系統,所以大家可以先安裝到windows系統上來進行學習。
注意:以后在工作中使用到redis時,都是需要安裝在Linux操作系統上,咱們后期Linux架構課程會單獨講解Linux並帶着大家手把手搭建redis和高可用及集群等。
2.1 下載redis
選擇最新穩定版安裝,地址:https://github.com/microsoftarchive/redis/releases
提醒:截止目前redis穩定版本已到 5.0 ,由於windows實際應用不多,所以版本就比較滯后。
2.2 安裝redis
找到已下載好的安裝包,根據下圖的提示按步驟點擊執行即可。
最后點擊next就開始安裝,直至安裝成功,成功之后所有redis相關安裝的窗口都會自動關閉。
2.3 修改配置
redis這個軟件安裝上之后,需要對他進行一些基本設置,以便於我們以后可以通過python代碼來對redis中的數據進行操作。
-
打開配置文件,redis安裝的目錄下的
redis.windows-service.conf
文件 -
修改配置
-
設置綁定IP,如果想要讓局域網內其他主機訪問自己的redis,需要設置
bind 0.0.0.0
-
設置redis密碼,如果想需要提供密碼再登錄redis,需要設置
requirepass 密碼
-
2.4 啟動redis
安裝和配置完成之后,需要啟動redis。
命令行指定配置文件啟動:
python D:\redis>redis-server.exe redis.windows.conf
-
打開電腦的【控制面板】,然后選擇【管理工具】,在選擇【服務】
-
啟動 或 關閉,在右邊找到並選中redis服務,然后點擊 重啟動 或 關閉
3. redis-cli連接redis
redis安裝並啟動之后,就可以通過各種客戶端連接redis並做各種操作。
redis-cli是安裝上redis之后自帶的客戶端工具,他可以讓我們快速通過命令對redis操作。
在windows中打開終端,輸入 redis-cli 就可以使用這個客戶端了。例如:
4. python連接redis
python代碼也可以實現連接redis並對redis中進行各種操作。python代碼想要操作redis必須先安裝相關模塊。
提示:在安裝redis的主機上執行 ipconfig 獲取redis的IP(windows系統)
第一步:安裝python操作redis模塊
pip3 install redis
第二步:寫代碼去操作redis
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
# 直接連接redis
conn = redis.Redis(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8')
# 設置鍵值:15131255089="9999" 且超時時間為10秒(值寫入到redis時會自動轉字符串)
conn.set('15131255089', 9999, ex=10)
# 根據鍵獲取值:如果存在獲取值(獲取到的是字節類型);不存在則返回None
value = conn.get('15131255089')
print(value)
上面python操作redis的示例是以直接創建連接的方式實現,每次操作redis如果都重新連接一次效率會比較低,建議使用redis連接池來替換,例如:
import redis
# 創建redis連接池(默認連接池最大連接數 2**31=2147483648)
pool = redis.ConnectionPool(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8', max_connections=1000)
# 去連接池中獲取一個連接
conn = redis.Redis(connection_pool=pool)
# 設置鍵值:15131255089="9999" 且超時時間為10秒(值寫入到redis時會自動轉字符串)
conn.set('name', "武沛齊", ex=10)
# 根據鍵獲取值:如果存在獲取值(獲取到的是字節類型);不存在則返回None
value = conn.get('name')
print(value)
5. django連接redis
按理說搞定上一步python代碼操作redis之后,在django中應用只需要把上面的代碼寫到django就可以了。
例如:django的視圖函數中操作redis
import redis
from django.shortcuts import HttpResponse
# 創建redis連接池
POOL = redis.ConnectionPool(host='10.211.55.28', port=6379, password='foobared', encoding='utf-8', max_connections=1000)
def index(request):
# 去連接池中獲取一個連接
conn = redis.Redis(connection_pool=POOL)
conn.set('name', "武沛齊", ex=10)
value = conn.get('name')
print(value)
return HttpResponse("ok")
上述可以實現在django中操作redis。但是,這種形式有點非主流,因為在django中一般不這么干,而是用另一種更加簡便的的方式。
第一步:安裝django-redis模塊(內部依賴redis模塊)
pip3 install django-redis
第二步:在django項目的settings.py中添加相關配置
# 上面是django項目settings中的其他配置....
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.211.55.28:6379", # 安裝redis的主機的 IP 和 端口
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {
"max_connections": 1000,
"encoding": 'utf-8'
},
"PASSWORD": "foobared" # redis密碼
}
}
}
第三步:在django的視圖中操作redis
from django.shortcuts import HttpResponse
from django_redis import get_redis_connection
def index(request):
# 去連接池中獲取一個連接
conn = get_redis_connection("default")
conn.set('nickname', "武沛齊", ex=10)
value = conn.get('nickname')
print(value)
return HttpResponse("OK")
寫在最后
至此,就是本節的所有內容,大家可以在django中通過redis進行存取值,在后續的項目開發中可以用他來完成短信驗證碼過期的功能。
以后關於redis還會講很多其他高級的知識點,參見:
- https://pythonav.com/wiki/detail/3/33/
- https://www.cnblogs.com/wupeiqi/articles/5132791.html
- http://www.redis.cn/