草庐IT

caching - Redis缓存设计

coder 2023-07-17 原文

我想在我的 node.js API 中集成一个缓存层。我以前从未构建过,所以我有几个问题。

我有一个叫做“容器”的对象

我想通过id 查找这些容器。通常一次有多个容器。查找不一致,每个用户都会有一组不同的查找 ID。

我目前不需要查询数据。所以我开始使用键/值存储,其中的键类似于 “container_1”,数据是序列化的 json 表示形式。

但我必须同时有效地查找多个容器。我注意到散列数据类型,所以现在我执行“hmset containers [id] [serialized json]。这样我可以执行 hmget containers 1 3 4 以返回容器 1, 3,4.

hmset containers:1 name test-container 这样的真实对象将哈希存储在 redis 中会更好吗? 这是处理数据的有效方式还是正常方式?从时间复杂度的角度来看,这种策略如何扩展到数万或数十万条目?我可以在集合上使用 expire 键吗?

谢谢

最佳答案

这里有几个问题。我会尽力回答所有问题。

听起来您提出了三种可能的存储方案。以下是关于每种后果的一些注释。

选项 #1:将每个序列化容器存储在字符串键中

您可以使用 MGET 轻松地一次检索多个容器。此选项在性能上应与将所有容器存储在单个哈希中相同。此选项将需要稍微多一点的内存,因为顶级键比散列字段有更多的开销。您可以获得使用顶级 key 的优势,因此您可以单独使容器过期并使用其他 key 命令,如 DUMP/RESTORE/OBJECT/MIGRATE 在单个容器上。

选项 #2:将所有序列化容器存储在一个散列中,每个容器都在散列中的一个单独字段中

如您所述,HMGET 可让您一次检索多个容器。此选项比选项 #1 的内存效率略高。这也允许您的顶级 key 空间保持较小,因为它不会随着每个容器而增长。这个优势并不显着,但却是一个小的管理帮助,因为您可以更轻松地使用 KEYS 命令。它应该和选项 #1 一样快。

选项#3:将每个容器存储在一个散列中,以某种非序列化的格式,散列字段对应于容器属性

如果每个容器都是一个 JSON 对象,这应该可以很好地映射。当对象的值不是简单字符串时,您仍然必须决定要做什么。您可能仍然需要将每个值存储为 JSON 或其他一些序列化格式。这个解决方案可以说是最复杂的。尝试在 javascript 中重新创建原始容器时可能会影响性能,因为每个属性都需要独立解析并重组为最终对象,除非驱动程序在某处为您执行此操作。

这种方法可以使检索容器的特定字段变得更加容易和高效。

使用这种方法在一个命令中检索多个容器会更加困难,因为它需要 pipeliningLua scripting .

结论

每种方法的适用性、可扩展性和时间复杂性在很大程度上取决于您的访问模式。您是否正在尝试按容器属性的值进行搜索?然后,选项 #3 开始看起来很有吸引力。否则,选项 #1 和 #2 看起来最有吸引力。理想情况下,您将使用额外的键为各种用例构建数据索引。您可能有一个包含属于某个用户的容器 ID 的集合,或者一个包含按上次更新时间排序的容器 ID 的列表。

所有这些方法都是合理的,使用额外的索引可以帮助确保它们中的任何一个都可以扩展。

Can I use the expire key on sets?

是的。无论类型如何,您都可以使任何 key 过期。字符串、散列、列表、集合等。

关于caching - Redis缓存设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27911633/

有关caching - Redis缓存设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

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

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

  3. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  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 - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  9. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

  10. ruby-on-rails - Rails 5,公寓和设计 : sign in with subdomains are not working - 2

    我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的

随机推荐