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