大家好,我是Leo
會來講解的是redis的應用方式,還沒安裝redis的朋友們,可以參考我的day20的文章
OK~~~ Let's go now!!!
這邊資料直接爬取youbike資料當作測試
from django.core.cache import cache
import datetime
from rest_framework.response import Response
from rest_framework import permissions, views, status
import pandas as pd
class redisTaskTest(views.APIView):
permission_classes = (permissions.AllowAny,)
authentication_classes = []
def get(self,request):
#空白當key會error
now = datetime.datetime.strftime(datetime.datetime.now(),"%Y-%m-%d")
if cache.has_key(now):
youbike_data = cache.get(now)
return Response(youbike_data.values())
else:
'''
sno(站點代號)、sna(中文場站名稱)、tot(場站總停車格)、sbi(可借車位數)、
sarea(中文場站區域)、mday(資料更新時間)、lat(緯度)、lng(經度)、
ar(中文地址)、sareaen(英文場站區域)、snaen(英文場站名稱)、aren(英文地址)、
bemp(可還空位數)、act(場站是否暫停營運)
'''
url = "https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json"
res = requests.get(url).json()
df = pd.DataFrame(res)[['sna','updateTime','tot','sbi','bemp','lat','lng','sarea','ar']]
df.sort_values(by=['sbi','bemp'],ascending=[False,False],axis=0,inplace=True)
df.rename(columns={
'sna':'站點','updateTime':'更新時間','tot':'場站總停車格','sbi':'可借車位數','bemp':'可還空位數',
'lat':"緯度",'lng':'經度','sarea':'場站區域','ar':'地址'},inplace=True)
result = df.T.to_dict()
cache.set(now, result, 60 * 1)
return Response({"success": True, "message": "儲存成功,請重新執行"}, status=status.HTTP_200_OK)
cache.set(0,1,2)
0:key
1:save data
2:keep time (second)
如上圖所示(now, result, 60 * 1)
key = 今天日期(str) key不能有空格 ex 2023-12-31 08:00 -> 2023-12-31-08:00
result 取得的dict資料
60*1 = 儲存60秒
判斷時否有這個key:cache.has_key(now)
取得快取資料:cache.get(now) 會根據儲存的key不同,找到相對應的value
path('api/redis-task/test',csrf_exempt(redisTaskTest.as_view()),name='api-redis-task-test'),
接下來我們就可以測試了
第一次request會比較久,因為再儲存key,value
第二次call api 就會快很多了,幾乎同時顯示資料
這邊也可以透過task celery 預先排程儲存至redis內
今天主要介紹redis使用方式,接下來我們來製作log檔的儲存,有時間的話會再講到系統日誌的製作
我們明天見,各位掰掰~~~