電商項目-緩存相關

 1.想要顯示隨機展示商品,又需要商品能更好的利用緩存,又兼顧其他重要排序,隨機值可以取值範圍20-200

 select DISTINCT(wcate.id),
        wcate.priority, MOD(wcate.id,30) suiji
 from wcate
 left join wsku on wsku.wcate_id = wcate.id
 inner join offer on wsku.id = offer.wsku_id
 where offer.app_show = 1
 order by wcate.priority asc, suiji
 limit 20 offset;

2.一個雙緩存的設計

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, Decimal):
            return float(o)
        return json.JSONEncoder.default(self, o)


class WeCache:
    def __init__(self, url, params, interval=5):
        if not interval:
            interval = 5
        self.interval = interval
        self.url = url
        self.params = json.dumps(params, cls=JSONEncoder)
        self.minute = int(time.strftime('%M', time.localtime(time.time()))) // self.interval * self.interval
        self.key = self.build_key()

    def build_key(self):
        return self.url + '_' + self.params + '_' + str(self.minute)

    @staticmethod
    def parse(response):
        return json.loads(response.decode())

    @staticmethod
    def parse_list(response):
        return [r.decode() for r in response]


def we_cache(url, params, interval=5):
    '''
    用url+params組成的緩存,間隔interval單位是分鐘,推薦範圍是1-30分鐘
    :param url: 前綴標識,推薦用url
    :param params:請求參數
    :param interval:單位是分鐘,推薦範圍是1-30分鐘
    :return:

    #use demo:
    def f():
        return time.time()
    new_f = we_cache('url', 'params')(f)
    for i in range(3):
        print('res {}'.format(new_f()))
    '''

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            wc = WeCache(url, params, interval)
            value = r.get(wc.key)
            # 返回緩存值
            if value:
                return wc.parse(value)
            else:
                # 只允許一個來重建緩存
                if r.setnx(wc.key + '_' + "flag", 'mark'):
                    # bulid 緩存 response
                    response = func(*args, *kwargs)
                    cathe_response = json.dumps(response, cls=JSONEncoder) or ''
                    r.set(wc.key, cathe_response, ex=60 * wc.interval * 2)
                    r.expire(wc.key + '_' + "flag", 60)
                    return response
                else:
                    wc.minute = (wc.minute - wc.interval + 60) % 60
                    wc.key = wc.build_key()
                    value = r.get(wc.key)
                    # 這時候其實有兩種選擇,一是直接訪問數據庫,2是拒絕用戶請求等到緩存完成後下次用戶請求獲取成功,這裏選取的是1
                    if value:
                        return wc.parse(value)
                    else:
                        # raise ShopError(message='Other users are creating a new cache, please wait a moment.',
                        #                 error_code=501)
                        return func(*args, *kwargs)

        return wrapper

    return decorator

3.redis緩存的模糊查詢和批量刪除

keys "func:cate_list_new_*"

redis-cli -a '!QAZwemore' keys "func:cate_list_new_*" | xargs redis-cli -a '!QAZwemore' del

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章