如果redis过载,我可以将其配置为丢弃设置请求吗?我有一个应用程序,其中数据实时更新(每个项目每秒10-15次),用于大量项目。这些值很快就过时了,我不需要任何一致性。
我还想计算实时写入的值的并行总和。这里最好的选择是什么? LUA在redis中执行?小应用程序与使用UNIX套接字的redis位于同一个框中?
答案 0 :(得分:1)
当Redis过载时,它只会减慢其客户端的速度。对于大多数命令,协议本身是同步的。
Redis虽然支持流水线操作,但客户端无法取消仍在管道中的流量,但服务器尚未确认。 Redis本身并没有真正对传入流量进行排队,TCP堆栈就是这样。
因此无法将Redis服务器配置为删除设置请求。但是,可以在客户端实现最后一个值队列:
队列实际上是由您的项目索引的2个地图表示的(每个项目只存储一个值)。应用程序将使用主映射。辅助映射将由特定线程使用。 2个地图内容可以原子方式交换。
主映射为空时,特定线程正在阻塞。如果不是,则交换两个映射的内容,使用主动流水线和可变参数命令将辅助映射的内容异步发送到Redis。它还从Redis收到确认。
当线程正在使用辅助映射时,应用程序仍然可以填充主映射。如果Redis太慢,应用程序将只累积主映射中的最后一个值。
此策略可以在C中使用hiredis和您选择的事件循环实现。
但是,实现起来并非易事,因此我首先要检查Redis对所有流量的性能是否不足以达到我的目的。如今,使用单核心对Redis进行超过500K op / s的测试并不罕见。如果需要,没有什么可以阻止您在多个Redis实例上对数据进行分片。
您可能会在Redis服务器的CPU之前使网络链接饱和。这就是为什么最好在客户端而不是服务器端实现最后一个值队列(如果需要)。
关于总和计算,我会尝试实时计算和维护它。例如,GETSET命令可用于在返回前一个值时设置新值。
您可以执行以下操作,而不仅仅是设置您的值:
[old value] = GETSET item <new value>
INCRBY mysum [new value] - [old value]
mysum键将随时包含所有项目的值的总和。使用Redis 2.6,您可以使用Lua来计算此计算以节省往返次数。
运行一大批来计算现有数据的统计数据(这就是我理解你的“并行”总和)并不适合Redis。它不是为地图/简化计算而设计的。