Python中Redis存储的item数据丢失问题如何排查与解决

用 scrapy-redis 写了个小爬虫放在服务器上跑,早上起来发现 item 数据丢失了,多了几个数据库,有谁知道这是什么吗 https://i.imgur.com/DnoRr5h.png


Python中Redis存储的item数据丢失问题如何排查与解决
4 回复

详细描述一下啊,你这说的太简单了


遇到Redis数据丢失,先别慌,按这个顺序排查,基本能定位问题。

1. 先确认数据是真的丢了,还是没取对 检查你的读写代码。最常见的问题是key设错了或者过期时间(TTL)设太短。

import redis
r = redis.Redis(host='localhost', port=6379, db=0)

# 写入时,确认成功了吗?
is_set = r.set('my_key', 'my_value', ex=60)  # ex参数是过期时间(秒)
print(f"Set操作成功: {is_set}")  # 应该返回True

# 读取时,用对key了吗?
value = r.get('my_key')
print(f"读取到的值: {value}")  # 如果返回None,可能是key不存在或已过期

# 检查key的剩余生存时间
ttl = r.ttl('my_key')
print(f"Key剩余生存时间: {ttl}秒")  # -2表示key不存在,-1表示永不过期

2. 查Redis服务器状态 连上Redis,用info命令看内存和持久化情况。

redis-cli info memory    # 看内存使用,是否达到maxmemory触发了淘汰
redis-cli info persistence # 看RDB/AOF持久化状态
redis-cli config get maxmemory-policy # 看当前淘汰策略

3. 核心原因和解决方向

  • 过期淘汰:检查是否设置了ex/px参数,或用了EXPIRE命令。数据到期自动删除是正常行为。
  • 内存淘汰:当Redis内存达到maxmemory限制时,会根据maxmemory-policy(如allkeys-lru)淘汰数据。如果数据不重要,可以调大内存或换用volatile-*策略只淘汰设了过期时间的key。
  • 持久化问题:如果依赖RDB快照,在两次快照之间宕机会丢失期间的数据。考虑开启AOF(appendonly yes)或使用混合持久化(Redis 4.0+)。
  • 主从同步延迟:如果从库读取,可能数据还没同步过来。在主库上读确认一下。

一句话建议:从代码、内存淘汰、持久化配置三个方向依次排查。

#1 本来只有 mboker 文件夹下三个文件,然后早上起来发现 mboker 下的 item 文件不见了,反而多了三个类似数据库的文件

有没有相关的代码,是不是在 item 的存储地方做了什么判断了

回到顶部