RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 876405
Accepted
jshapen
jshapen
Asked:2020-09-02 18:52:35 +0000 UTC2020-09-02 18:52:35 +0000 UTC 2020-09-02 18:52:35 +0000 UTC

当多个客户端同时访问时,Redis 是如何工作的?

  • 772

第一个客户端(本地)每秒向萝卜列表写入一个 50 字节的字符串 20 次。假设我们有 200,000 行 = 10 MB 第二个客户端尝试获取前 100,000 行。通过互联网传输需要一些时间。此时第一个客户会发生什么?

redis
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Petrov
    2020-09-02T21:21:19Z2020-09-02T21:21:19Z

    Redis 中的所有操作都是原子的。

    据我所知,Redis 中没有版本控制。

    因此,将出现阻塞:当一个客户端读取数据时,第二个客户端将等待。


    引用:

    写入列表

    如果我们在谈论列表- 列表,那么列表的总大小不会影响客户端的工作:一个客户端将数据写入列表,另一个客户端读取。正如我之前所说,其中一个客户端必须等待另一个客户端的操作完成。但是列表的总大小不会影响这一点,因为另一个客户端一次会读取一个 50 字节的短字符串,而不是一次读取列表的全部内容。

    我试图用以下 C# 代码来说明这一点:

    using System;
    using System.Collections.Generic;
    using System.Threading;
    using System.Threading.Tasks;
    using StackExchange.Redis;
    
    namespace ConAppRedis
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost,allowAdmin=true");
                redis.GetServer("localhost", 6379).FlushAllDatabases();
    
                var are = new AutoResetEvent(false);
                const int count = 10000;
                RedisKey key = "key";
    
                var t1 = Task.Run(() =>
                {
                    IDatabase db = redis.GetDatabase();
                    var list = new List<string>();
                    are.WaitOne();
    
                    for (int i = 0; i < count; i++)
                    {
                        list.Add(db.ListRightPop(key));
                    }
                });
    
                var t2 = Task.Run(() =>
                {
                    IDatabase db = redis.GetDatabase();
                    var s = new string('a', 25); // 50 bytes
    
                    for (int i = 0; i < count * 2; i++)
                    {
                        db.ListLeftPush(key, s);
                        if (i == count)
                        {
                            are.Set();
                        }
                    }
                    Console.WriteLine(db.ListLength(key));
                });
    
                Task.WaitAll(t1, t2);
            }
        }
    }
    

    启动(客户端的)两个任务:第一个首先等待权限启动(它将由第二个任务发出,已写入一半数据),然后开始读取数据。

    第二个任务将数据写入列表。最后,此任务获取列表的当前大小并将其打印出来。每次取值都不一样,很自然,大概在 10055 左右。

    也就是说,当第二个任务完成写入 20,000 个值时,第一个任务已经读取了将近一半。因此,他们共同依次访问服务器。


    但是如果我们谈论使用 APPEND 连接一个字符串,这会导致它的增加,那么第二个任务将等待相当长的时间,以便第一个任务一次完全接收它(否则没有办法)。

    • 3

相关问题

  • redis中keyspace中的参数提示

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5