我建议您在http://redis.io/topics/persistence上了解更多相关内容。基本上,当您通过仅使用内存存储来提高性能时,您会失去可靠的持久性。想象一下,当您将数据插入到内存中时,但在它被持久化到磁盘之前断电了。这将导致数据丢失。
Redis支持所谓的“快照”。这意味着它会定期完全复制内存中的内容(例如每个整点)。如果在两次快照之间断电,您将会失去从最后一个快照到崩溃时间(不一定是停电)之间的数据。Redis在数据安全与性能之间进行折衷,就像大多数NoSQL数据库一样。
大多数NoSQL数据库都遵循多个节点之间的复制概念,以最小化此风险。 Redis被认为更像是一个快速缓存,而不是保证数据一致性的数据库。因此,它的用例通常与真实数据库不同:例如,您可以使用它来存储会话、性能计数器或其他内容,并获得无与伦比的性能,在崩溃的情况下没有真正的数据损失。但处理订单/购买历史记录等任务则被认为是传统数据库的工作。
Redis服务器会定期将其数据保存到硬盘,因此具有一定的持久性。
以下情况下会保存数据:
BGSAVE
命令时但是,Redis中的数据并不是真正的持久性,因为:
BGSAVE
操作只有在有足够空闲内存时才能执行(额外RAM的大小等于Redis数据库的大小)N.B.:BGSAVE
RAM 要求是一个真正的问题,因为Redis会在没有可运行的RAM之前继续工作,但它停止将数据保存到硬盘得更早(大约在RAM使用量的50%)。
更多信息请参见Redis Persistence。
这是一个配置问题。您可以在Redis上没有、部分或完全持久化数据。最佳决策将由项目的技术和业务需求驱动。
根据Redis关于持久性的文档,您可以设置实例定期或在每次查询时将数据保存到磁盘中。 Redis提供了两种策略/方法AOF和RDB(阅读文档以查看其详细信息),您可以单独使用每种方法或一起使用。
如果您想要“类似SQL的持久性”,他们这样说:
一般建议如果您希望获得与PostgreSQL相当的数据安全度,应该同时使用这两种持久性方法。
TL;DR
从官方文档得知:
- RDB持久化[默认]在指定的时间间隔内执行数据集的时间点快照。
- AOF持久化[需要显式配置]记录服务器接收到的每个写入操作,这些操作将在服务器启动时再次播放以重建原始数据集。
如果需要使用AOF持久化,Redis必须进行显式配置,这会导致性能损失以及日志的增长。对于相对可靠的有限数据流的持久化可能已经足够。
您可以选择不使用持久化。这样可以获得更好的性能,但是在Redis关闭时将失去所有数据。
Redis有两种持久化机制:RDB和AOF。RDB使用全局快照调度程序,而AOF将更新写入类似于MySQL的追加日志文件中。
您可以使用其中一种或两种机制。当Redis重新启动时,它会从读取RDB文件或AOF文件来构建数据。
这个帖子中的所有答案都在谈论redis持久化数据的可能性:https://redis.io/topics/persistence(使用AOF + 每次写入(更改)之后)。
这是一个很好的链接,可以帮助您入门,但它绝对没有展示完整的情况。
Redis文档没有提及以下内容:
在AWS上使用1个x1.16xlarge实例 - 他们无法达到低于2ms的延迟:
其中延迟是从请求的第一个字节到集群发送“写”响应的第一个字节返回给客户端的时间进行测量的
他们在更好的硬盘(Dell-EMC VMAX)上进行了额外的基准测试,结果为小于1ms的操作延迟(!!),并且从70K ops/sec(写入密集测试)增加到660K ops/sec(读取密集测试)。相当令人印象深刻!!!
但是,要创建这种基础设施并随着时间的推移对其进行维护,需要一个(非常)熟练的DevOps。
set x 1
,此更改(或任何更改)需要多长时间才能在所有其他节点中进行。因此,附加读取将接收相同的输出。嗯,这取决于很多因素和配置。WAIT
命令以了解其他Redis节点接收到的最新更改量): def save_payment(payment_id)
redis.rpush(payment_id,”in progress”) # Return false on exception
if redis.wait(3,1000) >= 3 then
redis.rpush(payment_id,”confirmed”) # Return false on exception
if redis.wait(3,1000) >= 3 then
return true
else
redis.rpush(payment_id,”cancelled”)
return false
end
else
return false
end
总结这项研究,需要考虑以下几点: