草庐IT

mysql - 原子计数器 - redis 与 postgres 或其他?

coder 2023-07-17 原文

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

4年前关闭。




Improve this question




我需要一个 的实现原子计数器 在云上从并发连接生成一个串行整数。背后的业务是跟踪服务器。

优先级要求:

  • (必须)耐用 - 确保一旦客户获得一个号码,其他客户将永远不会获得相同的号码。没有重复...
  • (必须)可扩展 - 当前负载为 10K/秒, future 200-1000 个并发客户端连接为 1M/秒。递增 100 的可扩展性特征
  • (必须) < +-15ms="" 平均值=""> (postgres/mysql/redis 很棒,像 DynamoDB 这样的 http 延迟是不可能的)这只是为了过滤掉缓慢的解决方案
  • (很高兴)增加 这是一种可扩展性,其中客户端增加一个块(例如 100)并管理应用程序内存中的增量。
  • (很高兴拥有)票价 < 150="" 美元=""> 5k/s 并期待更精简的定价增长。
  • (很高兴拥有)HA(高可用性) - 我可以处理 0.01% 的失败,但耐用性很重要,我需要没有重复的数字。

  • 我的选择是:
  • postgres 序列 CREATE SEQUENCE serial CACHE 100; SELECT nextval(sequence) - 140 美元/米 MultiAZ AWS RDS db.m3.medium 不如 redis 快,但我认为平均 < 7ms。="" “缓存”是一个强大的功能,可以提高性能。="">
  • Redis INCR 与 Redis Sentinel/RDS MultiAZ - cache.m3.medium MultiAZ - 120$/m - 耐用性有问题。

  • redis 有 INCRBY,而 postgres 只有序列的“缓存”功能,需要往返数据库。

    任何输入?关于这两种选择还是其他选择?

    相关引用:
  • Atomic counters Postgres vs MongoDB
  • http://redis.io/topics/persistence
  • https://www.quora.com/When-should-I-use-redis-as-my-primary-data-store
  • https://muut.com/blog/technology/redis-as-primary-datastore-wtf.html
  • https://discuss.elastic.co/t/replacing-redis-with-elasticsearch-get-query-speed-counters-and-lists/5609/2
  • 最佳答案

    我认为您高估了 redis 故障导致其无法刷新到磁盘的风险,并低估了任何 RDBMS 执行相同操作的风险。通过将写入同步到磁盘,可以降低这两种风险。

    在 redis 中,这意味着切换到 AOF(仅附加文件)模式,如您已经链接到的持久性链接中所述。

    没有必要做任何过期的 key 诡计。 incr的原子行为和 incrby足以确保唯一性和持久性,尤其是与 AOF 持久性结合使用时。

    Redis 非常适合这个用例。它足够快且可扩展。 Redis 已经存在一段时间了。没有合法的持久性问题也不会为 PostgreSQL 或 MySQL 担心。

    正如@Solarflare 所指出的,让应用程序一次抓取 ID 块甚至更具成本效益和可扩展性。这可以在 redis 中使用 incrby 来完成。 .

    关于mysql - 原子计数器 - redis 与 postgres 或其他?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40198753/

    有关mysql - 原子计数器 - redis 与 postgres 或其他?的更多相关文章

    1. ruby - 其他文件中的 Rake 任务 - 2

      我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

    2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    3. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

      我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

    4. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

      尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

    5. ruby - 使用多个数组创建计数 - 2

      我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']

    6. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

      我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

    7. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    8. 使用canal同步MySQL数据到ES - 2

      文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

    9. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

      我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

    10. ruby - 导轨 4 : column reference "updated_at" is ambiguous with Postgres - 2

      我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d

    随机推荐