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()
...