草庐IT

High-concurrency-counters-without

全部标签

concurrency - 在单个 Redis 连接上交错 Watch Multi/exec。预期或奇怪的行为?

考虑一个前置应用程序,其中每个请求共享相同的Redis连接,我认为这是推荐的方式(?)。在这种情况下,我相信我看到了一些奇怪的watchmulti/exec行为。具体来说,我预计两个交易之一会因为乐观锁定失败而失败(即:watch守卫),但两个交易似乎都没有发脾气,但导致了错误的最终值。为了说明,请参阅以下人为设计的场景。它在Node中,但我相信这是一个普遍的事情。这并行运行2个进程,它们都更新一个计数器。(它基本上实现了在RedisDocs中看到的Watch的规范示例。预期结果是第一个进程导致增量1,而第二个进程更新失败并返回null。相反,结果是两个进程都将计数器更新为1。但是,一

asp.net-mvc - 雷迪斯 : New Keys not persisted in concurrent requests

我们在我们的应用程序中集成了Redis缓存,在正常情况下工作正常。最近,我们在我们的应用程序中发现了一个非常奇怪的问题,即在并发ajax请求的情况下,新添加的键会自动删除,并且修改后的键具有旧值。场景如下:Ajax请求1:-从数据库读取数据,大约需要5-6秒返回-在页面加载时触发(document.ready事件)Ajax请求2:-触发按钮点击-在session中设置值-在Ajax请求1完成之前完成Ajax请求3:-简单地读取session值-找到旧值,应该已经收到Ajax请求2设置的值所以这里的顺序是这样的:1)AjaxReq1触发并开始处理,2)AjaxReq2triggered,

concurrency - 使用redis捕获计数器的峰值

我有一个处理session的分布式系统(session的定义对于这个问题并不重要,除了要注意它是一个持续时间大于一秒的进程,通常要大得多),我想在哪里识别在给定时间段内并发处理的最大session数是多少。基本设置是一个Redis数据库,我在每次session开始时递增一个计数器,并在每次session结束时递减它。因此,计数器值表示任何给定时间点的当前并发数。我的问题是如何生成给定时间片内峰值(最大)并发的准确指标(例如,给定日期的最大并发是多少)。我想听听其他人如何解决这个问题,但我目前的做法是:session开始INCRcounter-name增加计数器的当前值递增命令的结果就是

concurrency - 使用 Celery 同时由两个工作进程运行的独特任务

我正在从事一个项目,该项目的目标是运行一个将任务发送到Celery队列的守护进程,Redis用作代理。每个任务必须一次处理一次(不允许并发)。为了执行此操作,我在我的守护进程中实现了以下代码,它充当Redis的锁:whileTrue:forfooinbar:ifnotself.redis_client.exists(foo.name):# SendthetasktotheCeleryqueuetask=celery_app.send_task('buzz',context={'name':foo.name})redis_client.send(foo.name,task.id)time

concurrency - Redis BITSET 和 WATCH

我正在使用Redis创建一种算法,用于从一个范围内声明未使用的整数。我的解决方案基于我对this得到的答案所以问题。此解决方案使用BITPOS和BITSET,为了避免竞争条件,我还使用了WATCH/MULTI/执行。为了测试并发方面,我创建了一个bash脚本,它同时尝试并行查找一个空闲号码10次,以调查EXEC命令的可能结果。我发现EXEC从未返回null,即使监视的键被另一个客户端修改了。我添加了延迟,以便有足够的时间来触发应该触发监视机制的并发修改,以便EXEC失败,但事实并非如此。所以基本上我有这段代码:while(true){WATCHmykeynumber=BITPOSmyk

concurrency - 当我并发运行 zadd 时,如何限制排序集的最大长度?

我想使用redis来存储这样的数据:{id:timestamp(1416991171)}在一个排序集中,它需要有一个最大长度。我只是在插入新的成员/值对之前检查排序集的长度。但我不确定这是否是确保最大长度的好主意,因为我将同时运行它。代码是这样的(在ruby​​中):key="list"max=5if$redis.zcard(key)如何保证最大长度?提前致谢。 最佳答案 注意:您的问题似乎有错字,因为您使用了key两次-一次用于排序集,一次用作标识符。我在回复中将标识符称为keyx。您有两种选择来确保您的SortedSet不会增长

node.js - Node redis 报告 "EXEC without MULT"

错误输出:[Error:ERREXECwithoutMULTI]Nodejs脚本:client=redis.createClient(REDIS_SOCK);client.keys(['*'],function(err,keys){client.multi();keys.forEach(function(key){count=start;while(count 最佳答案 这不是您使用multi/exec的方式。multi调用返回一个您必须持有的对象:client=redis.createClient(REDIS_SOCK);clie

redis - 如何实现Redis Labs Enterprise Cluster High Availability?

开始学习RedisLabsEnterpriseCluster,但我对如何使用RLEC实现高可用性感到困惑。我了解到RLEC使用专有复制,这与开源Redis不同。我想要实现的是,如果我的主数据库出现故障,我的应用程序仍然可以通过连接到副本数据库正常运行。我的问题是:我已经创建了2个节点。如果我创建了一个名为testing并启用了复制的新Redis数据库,其中哪个节点是主数据库(以及哪个节点是奴隶)?端点表示的是当前的master吗?我连接到每个服务器中的localhost:19332(如端点所示)。为什么我可以从两个服务器进行设置?(并且它出现在两个服务器中)。我认为通常复制应该是从主到

lua - Redis cjson : Is there a way to manipulate JSON without decoding it completely?

给定下面的例子,有没有办法在不解码的情况下将值从“bar”更改为“blah”?redis127.0.0.1:6379>eval'returncjson.encode({["foo"]="bar"})'0"{\"foo\":\"bar\"}"redis127.0.0.1:6379>eval'returncjson.decode(ARGV[1])["foo"]'0"{\"foo\":\"bar\"}""bar"引用示例:https://redis.io/commands/eval 最佳答案 不,您必须经历完整的解码和编码周期。这正是ht

Redis 集群 : Replace failing master that has no slave without downtime

我正在研究使用RedisCluster(Redis4.0)。我有一个包含5个主节点的集群,每个节点都有一个副本。我们可以分别调用每个主机A、B、C、D、E,每个从机A1、B1、C1、D1、E1。举例来说,一个节点填满了它的内存并导致主节点B和从节点B1都失败。有什么方法可以从这种状态中恢复吗?理想情况下,我希望能够启动一个新节点,用B的RDB备份加载它,将其加入集群,然后将B的插槽重新分配给替换节点,而无需将其余的集群宕机。我似乎无法弄清楚如何完成此任务。可能吗? 最佳答案 您可以做的一件事是在不同节点上创建比主节点更多的副本。在上