在Django里搞Redis缓存同步到DB,我一般用Celery Beat。直接上代码:
首先,装依赖:
pip install celery redis django-celery-beat
配置celery.py:
# proj/celery.py
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
# 定时任务配置
app.conf.beat_schedule = {
'sync-redis-to-db-every-hour': {
'task': 'yourapp.tasks.sync_redis_to_db',
'schedule': crontab(minute=0, hour='*/1'), # 每小时执行
},
}
然后写任务逻辑:
# yourapp/tasks.py
from celery import shared_task
from django.core.cache import cache
from yourapp.models import YourModel
import json
@shared_task
def sync_redis_to_db():
# 假设你的Redis缓存有特定前缀
keys = cache.keys('your_prefix:*')
for key in keys:
data = cache.get(key)
if data:
# 这里根据你的业务逻辑处理数据
# 示例:假设缓存的是模型数据
obj_id = key.split(':')[-1]
try:
obj = YourModel.objects.get(id=obj_id)
# 更新字段,这里根据实际数据结构调整
obj.cached_field = json.loads(data)
obj.save()
# 可选:同步后删除缓存
cache.delete(key)
except YourModel.DoesNotExist:
pass
最后启动worker和beat:
celery -A proj worker --loglevel=info
celery -A proj beat --loglevel=info
关键点:1)用Celery Beat做调度;2)缓存键要有规律前缀方便遍历;3)任务里要处理异常和并发问题。如果你缓存结构复杂,可能需要在任务里加锁或者用Redis的原子操作。
一句话建议:用Celery Beat做定时,缓存键设计要方便批量操作。