На сколько я знаю, по умолчанию TTL бессрочный, так что дело не в нем, я не ставил никакой TTL.
Попробовал хранить физически, а не в оперативной памяти, так я ловлю ошибку - Background saving error
Failed opening the RDB file crontab (in server root dir /etc) for saving: Permission denied
Вот redis.conf
# RDB настройка
save 900 1
save 300 10
save 60 10000
dir /data
# AOF настройка
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
Вот часть в docker-compose
redis:
container_name: redis
image: redis:6.2
ports:
- "6379:6379"
restart: always
networks:
- postgres
volumes:
- redis-data:/data
- ~/telegrambot/redis.conf:/usr/local/etc/redis/redis.conf # Подключение конфигурационного файла
command: ["redis-server", "/usr/local/etc/redis/redis.conf"] # Использование конфигурационного файла
volumes:
pgdata:
pgadmin-data:
redis-data:
networks:
postgres:
driver: bridge
Вот класс отвечающий за взаимодействие с редисом
import aioredis
import json
class RedisClient:
def __init__(self, host='redis', port=6379, db=0):
self.host = host
self.port = port
self.db = db
self.redis = None
async def connect(self):
self.redis = await aioredis.from_url(f'redis://{self.host}:{self.port}/{self.db}', decode_responses=True)
async def close(self):
if self.redis:
await self.redis.close()
async def set_user_data(self, user_id, data):
if self.redis is None:
raise ConnectionError("Redis connection is not established.")
# Проходим по элементам словаря
for key, value in data.items():
if value is not None:
if isinstance(value, (list, dict)): # Если значение является списком или словарем
value_str = json.dumps(value) # Преобразуем его в строку JSON
else:
value_str = str(value) # Иначе просто преобразуем его в строку
else:
value_str = 'None' # Если значение None, оставляем его как есть
# Устанавливаем каждый элемент словаря в Redis
await self.redis.hset(f'user:{user_id}', key, value_str)
async def get_user_data(self, user_id):
if self.redis is None:
raise ConnectionError("Redis connection is not established.")
data = await self.redis.hgetall(f'user:{user_id}')
# Преобразуем строки JSON обратно в оригинальные типы данных
for key, value in data.items():
if value == 'None':
data[key] = None
else:
try:
data[key] = json.loads(value)
except json.JSONDecodeError:
pass # Если ошибка, значит значение не было JSON строкой и оставляем его как есть
return data
async def user_data_exists(self, user_id):
if self.redis is None:
raise ConnectionError("Redis connection is not established.")
return await self.redis.exists(f'user:{user_id}')
Проблема в том, что он добавляет данные, держит какое-то время и данные для юзера становятся пустыми спустя какое-то время.