redis 双写一致性
双写一致性
加入了缓存后,缓存有数据,先去缓存拿,但mysql中数据边了,缓存中数据不会自动变化,出现不一致问题,
#双写一致性
写入mysql,rredis没有改,导致数据不一致
#解决方法
-1 修改数据,删除缓存
-2 修改数据,更新缓存
-3 定时更新缓存---》实时性差一点
#定时任务celery
在celery中配置任务
app.conf.beat_schedule={
"update_banner":{
"task":"celery_task.home_task.update_banner",
"schedule":timedelta(seconds=3)},
}
启动worker,启动beat
celery -A 路径 beta -l info
celery -A 路径 beta -l info -p eventlet
#更新代码
from home.models import Banner
from home.serializer import BannerSerializer
from django.core.cache import cache
from django.conf import settings
@app.task
def update_banner():
# 只要这个任务一执行,就更新轮播图的缓存
banners = Banner.objects.all().filter(is_delete=False, is_show=True).order_by('orders')
ser = BannerSerializer(instance=banners, many=True)
for item in ser.data:
item['image'] = settings.BACKEND_URL + item['image']
cache.set('banner_list', ser.data) # 会出问题,轮播图地址显示不全
return True
接口加缓存
-写一个类,继承这个类,查询所有就有缓存,没继承就没有缓存
-common_view.py
class CacheListModelMixin(ListModelMixin):
cache_key = None
def list(self, request, *args, **kwargs):
data = cache.get(self.cache_key)
if data:
return APIResponse(data=data)
# 走数据库
res = super(CacheListModelMixin, self).list(request, *args, **kwargs)
cache.set(self.cache_key, res.data)
return APIResponse(data=res.data)