美文网首页
Flask中将页面数据缓存至redis

Flask中将页面数据缓存至redis

作者: 晓函 | 来源:发表于2016-11-25 00:26 被阅读2807次

    核心就是利用pickle将数据序列化,以文字流的方式缓存至redis,要用的时候再取出来进行反序列化。

    import redis
    from datetime import datetime
    from flask import session,request
    from ..models import db
    
    import pickle
    
    
    
    class Redis:
        @staticmethod
        def connect():
            r = redis.StrictRedis(host='localhost', port=6379, db=0)
            return r
    
        #将内存数据二进制通过序列号转为文本流,再存入redis
        @staticmethod
        def set_data(r,key,data,ex=None):
            r.set(key,pickle.dumps(data),ex)
    
        # 将文本流从redis中读取并反序列化,返回返回
        @staticmethod
        def get_data(r,key):
            data = r.get(key)
            if data is None:
                return None
    
            return pickle.loads(data)
    
    @home.route('/detail/<int:id>')
    def detail(id):
        today = datetime.now().date()
        list_goods = None
    
        # 缓存标记,在页面显示出来
        cached_redis_remark = ""
    
    
        r = Redis.connect()
    
        #商品详情
        key = "data-cached:detail-id-%d" % (id)
        #从redis读取缓存(不存在的商品不会缓存,因为还是获取得到None)
        goods = Redis.get_data(r, key)
        if current_app.config['ENABLE_CACHED_PAGE_TO_REDIS'] and goods:
            # flash("读取缓存数据")
            cached_redis_remark += "goods|"
        else:
            # flash("查询数据库")
            goods=Goods.query.get(id)
            #将时间转为字符串才能序列化
            simple_goods = goods
            if goods:
                simple_goods.timestamp = str(goods.timestamp)
            #缓存入redis
            if current_app.config['ENABLE_CACHED_PAGE_TO_REDIS']:
                # 加入redis缓存,5分钟过期
                Redis.set_data(r, key, simple_goods, current_app.config['EXPIRE_CACHED_PAGE_TO_REDIS'])
    
    
    
        #推荐商品列表
        #推荐数量
        recommend_count = 4 if goods else 12
    
        key = "data-cached:detail-recommend-%d" % recommend_count
        list_recommend_goods = Redis.get_data(r, key)
        if current_app.config['ENABLE_CACHED_PAGE_TO_REDIS'] and list_recommend_goods:
            # flash("读取缓存数据")
            cached_redis_remark += "recommend|"
        else:
            list_recommend_goods = Goods.query.filter(Goods.coupon_expire >= today).filter_by(effective=True).limit(recommend_count).all()
            # 缓存入redis
            if current_app.config['ENABLE_CACHED_PAGE_TO_REDIS']:
                # 加入redis缓存,5分钟过期
                Redis.set_data(r, key, list_recommend_goods, current_app.config['EXPIRE_CACHED_PAGE_TO_REDIS'])
    
    
    
        return render_template("home/detail.html", goods=goods,list_goods=list_recommend_goods,cached_redis_remark=cached_redis_remark)
    
    

    相关文章

      网友评论

          本文标题:Flask中将页面数据缓存至redis

          本文链接:https://www.haomeiwen.com/subject/dmeipttx.html