fix: 修复多work导致数据不同步问题

This commit is contained in:
shaohuzhang1 2024-10-30 18:07:28 +08:00 committed by shaohuzhang1
parent 8076d4b048
commit 6f284420d6
3 changed files with 27 additions and 14 deletions

View File

@ -12,7 +12,7 @@ import os
import time
from diskcache import Cache
from django.core.cache.backends.base import DEFAULT_TIMEOUT, BaseCache
from django.core.cache.backends.base import BaseCache
class FileCache(BaseCache):
@ -29,35 +29,42 @@ class FileCache(BaseCache):
finally:
os.umask(old_umask)
def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
def add(self, key, value, timeout=None, version=None):
expire = timeout if isinstance(timeout, int) or isinstance(timeout,
float) or timeout is None else timeout.total_seconds()
return self.cache.add(key, value=value, expire=expire)
return self.cache.add(self.get_key(key, version), value=value, expire=expire)
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
def set(self, key, value, timeout=None, version=None):
expire = timeout if isinstance(timeout, int) or isinstance(timeout,
float) or timeout is None else timeout.total_seconds()
return self.cache.set(key, value=value, expire=expire)
return self.cache.set(self.get_key(key, version), value=value, expire=expire)
def get(self, key, default=None, version=None):
return self.cache.get(key, default=default)
return self.cache.get(self.get_key(key, version), default=default)
@staticmethod
def get_key(key, version):
if version is None:
return f"default:{key}"
return f"{version}:{key}"
def delete(self, key, version=None):
return self.cache.delete(key)
return self.cache.delete(self.get_key(key, version))
def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None):
def touch(self, key, timeout=None, version=None):
expire = timeout if isinstance(timeout, int) or isinstance(timeout,
float) else timeout.total_seconds()
return self.cache.touch(key, expire=expire)
return self.cache.touch(self.get_key(key, version), expire=expire)
def ttl(self, key):
def ttl(self, key, version=None):
"""
获取key的剩余时间
:param key: key
:return: 剩余时间
@param version:
"""
value, expire_time = self.cache.get(key, expire_time=True)
value, expire_time = self.cache.get(self.get_key(key, version), expire_time=True)
if value is None:
return None
return datetime.timedelta(seconds=math.ceil(expire_time - time.time()))

View File

@ -6,7 +6,9 @@
@date2024/7/24 19:23
@desc:
"""
from django.core.cache import cache
from django.core.cache import caches
cache = caches['default_file']
def get_data_by_default_cache(key: str, get_data, cache_instance=cache, version=None, kwargs=None):
@ -43,10 +45,10 @@ def get_cache(cache_key, use_get_data: any = True, cache_instance=cache, version
if cache_instance.has_key(key, version=version):
return cache_instance.get(key, version=version)
data = get_data(*args, **kwargs)
cache_instance.add(key, data, version=version)
cache_instance.add(key, data, timeout=None, version=version)
return data
data = get_data(*args, **kwargs)
cache_instance.set(key, data, version=version)
cache_instance.set(key, data, timeout=None, version=version)
return data
return run

View File

@ -104,6 +104,10 @@ CACHES = {
'CULL_FREQUENCY': 5,
}
},
'default_file': {
'BACKEND': 'common.cache.file_cache.FileCache',
'LOCATION': os.path.join(PROJECT_DIR, 'data', 'cache', "default_file_cache") # 文件夹路径
},
'chat_cache': {
'BACKEND': 'common.cache.file_cache.FileCache',
'LOCATION': os.path.join(PROJECT_DIR, 'data', 'cache', "chat_cache") # 文件夹路径