如何在Rails中通过Octopus遍历所有分片,获取分片名称及用户数?
解决多分片数据库的用户统计问题
嘿,我来帮你搞定这个问题!你用Octopus的using_all遍历分片的思路是对的,但拿不到分片名称是因为用错了获取当前分片的方法——@shard并不是Octopus提供的变量,咱们换个正确的方式就行:
修正后的代码
Octopus.using_all do # 获取当前正在操作的分片名称 current_shard = Octopus.current_shard # 直接用数据库层面的count统计用户数,比User.all.length高效得多 user_count = User.count # 用你习惯的awesome_print输出结果 ap({ 分片名称: current_shard, 用户数量: user_count }) end
关键说明
Octopus.current_shard是Octopus官方提供的方法,专门用来在分片切换的块中获取当前正在使用的分片名称(就是你在Octopus配置里定义的那些shard标识)- 替换
User.all.length为User.count:前者会把所有用户实例加载到内存再统计长度,后者直接让数据库执行COUNT(*)查询,性能差异在数据量大的时候会非常明显 - 如果想先确认所有配置的分片是否正确,可以先执行这段代码验证:
# 打印所有已配置的分片名称 puts "已配置的分片列表:#{Octopus.shards.keys.join(', ')}"
这样就能准确遍历每个分片,输出对应的用户数量和分片名称啦!
内容的提问来源于stack exchange,提问作者Suthan Bala
相关产品推荐
相关产品推荐

