云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

全站加速_泰隆企业邮箱登录_试用

小七 141 0

Ruby中字符串插值的优化

[rubyonrails是一个很好的web应用程序框架,可以让初创公司看到他们的想法快速发展为产品。正因为如此,Freshworks的大多数产品都是使用rubyonrails构建的。从初创企业过渡到scaleup意味着必须不断改进您的应用程序,以便它们能够扩展以跟上客户的增长。在这个全新的工程系列中,轨道刻度,我们将讨论我们在产品中使用的一些技术和模式,以调整它们的性能并帮助它们扩大规模。]Freshservice是一个基于云的IT服务台和服务管理解决方案,使组织能够简化IT操作。Freshservice提供支持ITIL的组件,帮助管理员管理资产、事件、问题、更改和发布。资产管理组件帮助组织对其IT资产进行控制。Freshservice是由rubyonrails提供支持的SaaS产品。它由MySQL数据库支持,用于持久性存储,并广泛使用Memcached和Redis进行缓存和配置存储。多租户是SaaS产品的核心,租户隔离是处理数据时的一个重要因素。为了确保,在缓存存储中表示数据的键总是以每个租户的唯一ID作为后缀。我们以Memcached和Redis上获取和设置数据的缓存键的方式作为基准。我们注意到,对于属于某个实体(或多个实体,如租户或用户)的每个缓存对象,我们都在创建哈希对象,以在缓存存储中构建表示该实体的唯一键这是在Ruby中构建字符串(在我们的例子中是缓存键)的一种相当常见的做法:1234#irbSOME_CONSTANT="SOME_CONSTANT%{value}"放入一些"u CONSTANT%{value:"shu.freshservice.com.freshservice.com"}>"一些_常量:dao.freshservice.com"上面的代码片段不必要地创建了一个新的哈希对象。由于最终目标是要有一个插值字符串,所以我们可以完全跳过哈希创建部分。使用替代方法,我们可以用动态值插值所需的常数。这个值可以是任何响应"to"的值。1234#irbSOME_CONSTANT="SOME_CONSTANT"将"#{SOME_CONSTANT}{shu.freshservice.com.freshservice.com'}">"一些_常量:dao.freshservice.com"我们在模块上引入了一个"#key"方法,它将以一个符号和一个值作为参数,并返回一个插值字符串。生成的结果键对于这两种方法都是相同的,因此现有的缓存对象不会受到此更改的影响。我们进行了基准测试,以检查此活动是否对性能有任何影响。对标结果如下:12345678910101112131415161718192021222324252627282930模块MemcacheKEY_HASH=YAML.load_文件(文件.join(轨道.根,'配置','内存缓存_键.yml')。象征钥匙!定义self.key键(key,value)"#{key_HASH[key]}:\{value}"end defself.multi_键(key,value1,value2)"#{key_HASH[key]}:\{value1}:#{value2}"endd Memcache::TENANT_BY_ID="TENANT_BY_ID:%{TENANT_ID}"基准.bmbm{x | x.report('existing'){1000.times do | n | 1000.times{Memcache::TENANT_BY_ID%{TENANT_ID:n}}end}x.report('new'){1000.times1000次{内存缓存.key(:tenant_by_id,n)}结束}我们运行的基准测试BenchmarksUserSystemTotalReal排练现有2.6000000.2400002.840000(2.833792)新1.1900000.0100001.200000(1.206466)实际现有2.1400000.0500002.190000(2.194628)新0.8300000.0100000.840000(0.835711)注意:上面的基准测试是在我们当前的Ruby/Rails产品版本(2.3.7/4.2.11.1)上运行的目前,我们通过两种不同的方法(MemcacheKeys#key,MemcacheKeys#multi#key)支持最多2个动态值。使方法接受一个动态数量的值将通过Ruby splat操作在每次调用上创建一个数组,并会破坏整个目的在发布了一个半月的关键生成更改之后,我们注意到对象分配和GC频率有了显著的改进。 上面的方法也减少了类常量占用。我们之前已经在许多类和模块中包含了这个模块,并使用了"include MemcacheKeys"来访问一个常量来构建所需的键。即使常量是通过引用包含而不是复制的,类仍然必须维护对它的引用。您可以检查module#constants方法。更改后,键常量不再需要在多个位置引用。 相关岗位使用定制中间件的Sidekiq队列管理快速破解,用最少的代码减轻数据库负载