一、Redis數據庫介紹
1. Redis安裝
"""
1、官網下載:安裝包或是綠色面安裝 (https://redis.io/)
2、安裝並配置環境變量
"""
2. redis VS mysql
"""
redis: 內存數據庫(讀寫快)、非關系型(操作數據方便、數據固定)
mysql: 硬盤數據庫(數據持久化)、關系型(操作數據間關系、可以不同組合)
大量訪問的臨時數據,才有redis數據庫更優
"""
3. redis VS memcache
"""
redis: 操作字符串、列表、字典、無序集合、有序集合 | 支持數據持久化(數據丟失可以找回(默認持久化,主動持久化save)、可以將數據同步給mysql) | 高並發支持
memcache: 操作字符串 | 不支持數據持久化 | 並發量小
"""
二、Redis的基本使用
1. 啟動服務
# dump.rdb文件:(我們在哪啟動的redis服務,就會在哪生成該文件,所以啟動redis服務前,應該先切換到合適的位置)
redis緩存中的數據將會保存到該文件
"""
1)前台啟動服務(就是在終端啟動,這個終端關了,服務也關了)
>: redis-server
2)后台啟動服務 (就是在終端啟動,這個終端關了,服務還在運行)
>: redis-server --service-start
3)通過配置文件啟動服務
>: redis-server 配置文件的絕對路徑
>: redis-server --service-start 配置文件的絕對路徑
eg>: redis-server --service-start D:/redis/redis.conf
"""
2. 密碼管理
"""
1)提倡在配置文件中配置,采用配置文件啟動后,就需要輸入密碼才有查看數據的權限
安裝文件中的配置文件redis.windowsconf中:requirepass 密碼
2)當服務啟動后,並且連入數據庫,可以再改當前服務的密碼(該密碼只對當前服務有效;服務重啟,則密碼重置,就是普通啟動的話,密碼會重置為空,通過配置文件啟動的話,密碼會重置為配置文件中的密碼)
config set requirepass 新密碼
3)連入數據庫,查看當前服務密碼密碼
config get requirepass
"""
3. Redis客戶端連接服務端
- Redis也是一個客戶端一個服務端,啟動服務端后,以客戶端連接服務端,進行數據庫操作。
"""
1)默認連接:-h默認127.0.0.1,-p默認6379,-n默認0,-a默認無
>: redis-cli
書寫連接參數時,一定要與前面的-h,-p等這些符號空一格。而mysql則不用空格
其中:-h 表示服務端IP,連接本機時就是127.0.0.1,也可以寫成localhost
-p 表示端口號
-n 表示連接哪個數據庫,默認從0到15個,共16個數據庫
-a 表示密碼
2)完整連接:
>: redis-cli -h ip地址 -p 端口號 -n 數據庫編號 -a 密碼
3)先連接,后輸入密碼
>: redis-cli -h ip地址 -p 端口號 -n 數據庫編號
>: auth 密碼
"""
4. 關閉Redis服務
"""
1)當沒有連接進服務端時,執行
>: redis-cli shutdown
2)當連接進服務端后,執行
>: shutdown
"""
5. 切換數據庫
'''
Redis默認從0到15個,共16個數據庫
1)在連入數據庫后,執行
>: select 數據庫編號 (數據庫編號就是0-15,當輸入沒有的數字類型的編號時,默認連接進0數據庫,當輸入不是數字的編號時,會報錯)
'''
6. 數據持久化
"""
1)配置文件中的默認配置
save 900 1 # 超過900秒有1個鍵值對操作,會自動調用save完成數據持久化
save 300 10 # 超過300秒有10個鍵值對操作,會自動調用save完成數據持久化
save 60 10000 # 超過60秒有10000個鍵值對操作,會自動調用save完成數據持久化
2)安全機制
# 當redis服務不可控宕機,會默認調用一下save完成數據持久化
3)主動持久化
>: save # 連入數據庫時,主動調用save完成數據持久化,不用在save后面加括號
注:數據持久化默認保存文件 dump.rdb,保存路徑默認為啟動redis服務的當前路徑
"""
三、Redis的數據類型和使用方法
- 因為Redis是非關系型數據庫,所以Redis的使用,都是直接操作各種鍵值對
"""
數據類型:字符串、列表、哈希(字典)、無序集合、有序(排序)集合
有序集合的應用:游戲排行榜
******************在終端中的使用方法*******************
字符串:
set key value
get key
mset k1 v1 k2 v2 ...
mget k1 k2 ...
setex key exp value
incrby key increment
列表:
rpush key value1 value2 ...
lpush key value1 value2 ...
lrange key bindex eindex
lindex key index
lpop key | rpop key
linsert key before|after old_value new_value
哈希:
hset key field value
hget key field
hmset key field1 value1 field2 value2 ...
hmget key field1 field2
hkeys key
hvals key
hdel key field
集合:
sadd key member1 member2 ...
sdiff key1 key2 ...
sdiffstore newkey key1 key2 ...
sinter key1 key2 ...
sunion key1 key2 ...
smembers key
spop key
有序集合:
zadd key grade1 member1 grade2 member2 ...
zincrby key grade member
zrange key start end
zrevrange key start end
"""
四、python中使用Redis
1. 安裝redis模塊
pip install redis
2. 在python中Redis的使用
1. 直接使用
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=1, password=None, decode_responses=True)
2. 以連接池的方式使用,這樣就有類似線程池一樣的作用
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, max_connections=100, password=None, decode_responses=True)
r = redis.Redis(connection_pool=pool)
3. 使用方式:和終端中的使用方式基本一樣
r.get(key) ...
3. Django項目中利用Redis作為緩存數據庫
(1)Django項目為什么要用Redis
- Django中雖然自帶管理緩存的
cache
模塊,但是,cache管理的是Django項目的緩存,當Django項目程序關閉后,該緩存也會自動銷毀,所以我們需要用Redis來當做Django的緩存數據庫。讓cache管理Redis數據庫。這樣就算是Django項目程序關閉,緩存中的數據依然存在。
- Redis數據庫只能存儲字符串、數字和二進制類型的數據,對於其他的python中的對象,不能直接存儲。需要利用Django自帶的cache來處理,達到存儲復雜對象的目的。
(2)Django項目的緩存模塊應用Redis
使用步驟:
# 1.將緩存存儲位置配置到redis中:settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"DECODE_RESPONSES": True,
"PSAAWORD": "",
}
}
}
# 2.操作cache模塊直接操作緩存:views.py
from django.core.cache import cache # 結合配置文件實現插拔式
# 存放token,可以直接設置過期時間
cache.set('token', 'header.payload.signature', 300)
# 取出token
token = cache.get('token')
4. 接口緩存
(1)什么是接口緩存
1. 后台接口是提供數據庫數據的,IO操作慢,可以將數據存儲在緩存中,接口數據從緩存中調
2. 一般將大量訪問(數據時效性要求不是很苛刻)的接口建立緩存
3. 接口緩存思想:數據先走緩存,有直接返回,沒有走數據庫(同步到緩存)
(2)接口緩存實例
# Django項目中網站主頁的輪播圖展示的后端業務邏輯
from rest_framework.viewsets import GenericViewSet
from rest_framework import mixins
from django.conf import settings
from utils.response import APIResponse
from . import models, serializers
from rest_framework.response import Response
from django.core.cache import cache
class BannerListViewSet(mixins.ListModelMixin, GenericViewSet):
queryset = models.Banner.objects.filter(is_delete=False, is_show=True).order_by('-orders').all()[:settings.BANNER_COUNT]
serializer_class = serializers.BannerModelSerializer
# 自定義響應結果的格式
# def list(self, request, *args, **kwargs):
# response = super().list(request, *args, **kwargs)
# return APIResponse(results=response.data)
# 接口緩存
def list(self, request, *args, **kwargs):
data = cache.get('banner_cache')
if not data:
print('走了數據庫')
response = super().list(request, *args, **kwargs)
cache.set('banner_cache', response.data) # 不設置過期時間,緩存的更新在后台異步更新(celery異步框架)
return response
return Response(data)