Redis管道,Redis存儲用戶瀏覽數據
當頻繁的存儲獲取Redis數據庫中的數據時,可以使用Redis的pipeline(管道)功能,將多個相互沒有依賴關系的讀寫操作,如:下一步執行的Redis操作的開啟需要獲取上一步操作執行結束的數據。放到隊列中,使用pipeline對象一次性執行,可以很大程度上減少與數據庫建立TCP連接的性能損耗。(使用場景:用戶瀏覽歷史, 注冊登錄短信驗證碼,圖片驗證碼)
class RecommendJobView(GenericAPIView):
"""推薦職位視圖"""
# 更具用戶瀏覽最多的職位的(技術棧)的倒序,序列化器返回數據和最新數據一樣,因為存儲數據和查詢數據都與redis有關,所以不適用ListAPIView
serializer_class = PostJobSerializer
def perform_authentication(self, request):
pass
...
def post(self, request):
# 用戶瀏覽數據存儲在redis,user_id作為主鍵,采用list存儲職位id
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
redis_conn = get_redis_connection('job')
pl = redis_conn.pipeline()
# 去重
pl.lrem('user_id_%s' % user.id, 0, job_id)
# 保存,增加
pl.lpush('user_id_%s' % user.id, job_id)
# 保留規定長度的數據
pl.ltrim('user_id_%s' % user.id, 0, constants.MAX_Job_VIEW_HISTORY-1)
pl.execute()
...