jjzjj

c# - Redis StackExchange SortedSetAdd 不更新现有元素

coder 2023-11-07 原文

我刚刚开始学习 Redis,并且在使用 C# 编程时,我使用的是 StackExchange Redis。我想试用 SortedSet,这是我拥有的简单代码:

创建示例数据

  private List<User> SeedUsers() {
        var list = new List<User> {
            new User {Id = 1.ToString(), UserName = "Test1", Score = 10},
            new User {Id = 2.ToString(), UserName = "Test2", Score = 23},
            new User {Id = 3.ToString(), UserName = "Test3", Score = 15},
            new User {Id = 4.ToString(), UserName = "Test4", Score = 250},
            new User {Id = 5.ToString(), UserName = "Test5", Score = 100},
            new User {Id = 6.ToString(), UserName = "Test5", Score = 23},
            ......
        };
        return list;
    }

向Redis添加数据

 public bool AddUsersToLeaderBoard() {
        var db = Connection.GetDatabase();
        var list = SeedUsers();
        var numOfSuccesses = 0;

        foreach (var item in list) {
            var r = db.SortedSetAdd("test", JsonConvert.SerializeObject(item), item.Score);
            if (r) numOfSuccesses++;
        }

        var i = list[3];
        i.Score = 888;
        db.SortedSetAdd("test", JsonConvert.SerializeObject(i), i.Score);
        return numOfSuccesses == list.Count;
    }

让我感到困惑的是 foreach 循环之后的部分,我在其中更改列表的第 4 个元素,然后将其添加到排序集中,但它只添加了两次,即它没有在 Redis 中更新。

我是否误解了 Redis 文档的这一部分?

Just a final note about sorted sets before switching to the next topic. Sorted sets' scores can be updated at any time. Just calling ZADD against an element already included in the sorted set will update its score (and position) with O(log(N)) time complexity. As such, sorted sets are suitable when there are tons of updates.

同时为了确保 JSON 序列化没有任何问题,我尝试了这行代码:

 var x = db.SortedSetRank("test", JsonConvert.SerializeObject(list[4]), Order.Descending);

这给出了预期的结果。那我做错了什么?

最佳答案

这不是同一个对象,您在将其推送到 Redis 之前更新了它的分数。 改为这样做:

public bool AddUsersToLeaderBoard() {
    var db = Connection.GetDatabase();
    var list = SeedUsers();
    var numOfSuccesses = 0;

    foreach (var item in list) {
        var r = db.SortedSetAdd("test", JsonConvert.SerializeObject(item), item.Score);
        if (r) numOfSuccesses++;
    }

    var i = list[3];
    //i.Score = 888; - this line can be removed
    db.SortedSetAdd("test", JsonConvert.SerializeObject(i), 888);
    return numOfSuccesses == list.Count;
}

并且 zrange 的输出将是预期的(只有一次 Test4 和 888 的真实分数):

127.0.0.1:6379> zrange test 0 -1 withscores
1) "{\"Id\":\"1\",\"Score\":10,\"UserName\":\"Test1\"}"
2) "10"
3) "{\"Id\":\"3\",\"Score\":15,\"UserName\":\"Test3\"}"
4) "15"
5) "{\"Id\":\"2\",\"Score\":23,\"UserName\":\"Test2\"}"
6) "23"
7) "{\"Id\":\"6\",\"Score\":23,\"UserName\":\"Test5\"}"
8) "23"
9) "{\"Id\":\"5\",\"Score\":100,\"UserName\":\"Test5\"}"
10) "100"
11) "{\"Id\":\"4\",\"Score\":250,\"UserName\":\"Test4\"}"
12) "888"

关于c# - Redis StackExchange SortedSetAdd 不更新现有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32485962/

有关c# - Redis StackExchange SortedSetAdd 不更新现有元素的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  4. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  5. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  9. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  10. ruby-on-rails - Rails Associations 的更新方法是什么? - 2

    这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user

随机推荐