![d60084437e85a7d73fa3307d109eb751.png](https://i-blog.csdnimg.cn/blog_migrate/b67ba6bdfb93201c842cb5a82a48054e.jpeg)
redis 中的数据是存在内存的,如果一个用户很久没有登录过服务器,那么他的数据就是不活跃数据。
这部分不活跃数据会占用大部分 Redis 的存储空间。
我们可以将这些不活跃数据迁移到磁盘数据库中,如 MYSQL。
获取数据时,先从 Redis 中获取,Redis 中数据不存在时,再从 MYSQL 中获取数据。
迁移的具体实现步骤如下:
- 利用
scan
命令遍历 Redis 的键空间。Scan 命令通过反向二进制迭代器循序渐进的遍历 Redis 的键空间,它的特点是有重复到不会漏掉 key。 - 通过
object idletime key ...
命令批量(一次 scan 的结果)获取 key 的空转时间,通过这个时间来判断是否为不活跃数据。例如我们认为一个星期以前的数据为不活跃数据,空转时常大于一个星期就是不活跃数据。 - 通过
type key ...
命令批量获取 key 的类型并过滤。返回的类型有 string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)、stream (流)。我们只迁移是 string 类型的 key(注:为什么不迁移其他类型的 key,可以思考一下)。 - 通过
ttl key ...
命令批量获取 key 的过期时间,判断是否设有过期时间。为了简单处理,我们不处理包含有过期时间的 key。 - 获取 key 最新的数据, 并计算 md5sum。将最新的[key,value]保存到 MYSQL 中。再次获取 key 的最新数据,并计算 md5sum。
- 对比两次 md5sum。如果相同就删除 Redis 中的数据,key 完成迁移,如果不同(表示 key 被修改,变成了活跃数据)就结束迁移过程。求两次 md5sum 的原因是,将数据保存到 MYSQL 这段时间内,有可能用户刚好访问并修改了数据。