new_candy

导航

Redis管道功能

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

 

posted on 2018-11-01 20:23  new_candy  阅读(1478)  评论(0编辑  收藏  举报