Python中Django定时将Redis缓存同步到数据库的最佳实践是什么?

搞了一下午 celery 都没弄好,报 Apps aren't loaded yet.完全不知道怎么解决。


Python中Django定时将Redis缓存同步到数据库的最佳实践是什么?
10 回复

没有实践过,第一反应是任务计划

不过,我怎么感觉怪怪的
应该是数据先落地再做缓存 不应该是先缓存再落地 这样会有可能导致意外数据丢失的
一般 up 主这种如果是落地耗时的业务 是不是应该考虑走异步 比如队列


在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做定时,缓存键设计要方便批量操作。


我是想把点击点赞这种不是很重要又很频繁的操作先用 redis 缓存,然后空闲时间一次性存到数据库。

可以任务计划 或者 设定一个阀值 满多少落地一次

我就是想问用什么计划任务最简单方便

写个脚本 然后配置到 crontab 不就好了…

最佳实践:别用 Python,用自带的二进制工具

Celery beat
Crontab

又看了下,redis 搞个主从,然后在从机上去做定时任务,获取 size 大小,超过你的设置的阈值就同步嘛

managment/commands/sync_cache.py

*/5 * * * * python manage.py sync_cache

回到顶部