首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Redis建议-何时分组数据以及何时拆分数据

Redis建议-何时分组数据以及何时拆分数据
EN

Stack Overflow用户
提问于 2021-11-28 08:11:33
回答 1查看 28关注 0票数 0

希望能从那些曾经参与其中的人那里得到一些明智的建议,并能帮助我更好地理解在Redis中何时将数据集群在一起,以及何时将其拆分。

我在一个多租户平台上工作,对于我跟踪的每个资产,GPS数据每3-5秒传入一次。在处理数据时,我们存储与资产相关的附加信息(即是否准时、是否迟到等)。

每个资产都属于一个或多个租户。例如,当跟踪一辆家用汽车时,这辆车可能为丈夫和妻子而存在。每个人都需要知道它相对于他们的需求在哪里。例如,这辆车可能正由青少年使用,并在下午3:00准时供丈夫使用,但在下午2:30晚到妻子使用。

作为附加要求,单个租户可能希望拥有对其他租户的读访问权限。也就是说,这位父亲想看看家里的车,还有任何青少年的车。因此,继承制可以开始看起来像这样:

超级租户--

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--Super Tenant (Family)
   --Tenant (Dad)
      --Vehicle 1
         --Gps:123.456,15.123
         --Status:OnTime
      --Vehicle 2
         --Gps:123.872,15.563
         --Status:Unused
   --Tenant (Mom)
      --Vehicle 1
         --Gps:123.456,15.123
         --Status:Late
      --Vehicle 2
         --Gps:123.872,15.563
         --Status:Unused
   --Tenant (Teenager)
      --Vehicle 1
         --Gps:123.456,15.123
         --Status:Unused
      --Vehicle 2
         --Gps:123.872,15.563
         --Status:Unused

我的问题是关于在Redis中存储它的最好方法。

我可以按租户存储--也就是说,我可以为爸爸使用一把钥匙,然后收集他可以使用的所有车辆。每当有新的GPS定位进入(无论是车辆1还是车辆2),我都会更新集合的内容。我担心的是,如果有几十辆车,我们会经常更新他的收藏方式。

我可以先按租户存储,然后再按车辆存储。这意味着当Vehicle 1的GSP位置到来时,我将更新3个不同租户的信息。还不错。

让我犹豫的是,我正在开发一个网站,让爸爸可以看到他所有的车辆。那个电话会打进来,要求得到爸爸所有租户名下的车辆。如果我将数据拆分成按租户/车辆存储,那么我将不得不存储爸爸有2辆车的事实,然后向Redis索要(key1、key2等)中的所有内容。

如果我将所有内容都存储在一个集合中,那么我对Redis的请求将会简单得多,并且将请求密钥爸爸下的所有内容。

实际上,每个租户将拥有5-100辆车,而我们有100个租户。

根据您的经验,您首选的方法是什么(请随时提供此处未提供的任何方法)。

EN

回答 1

Stack Overflow用户

发布于 2021-11-29 14:56:28

从您的问题看,您似乎希望将所需的一切存储在一个密钥下。Redis不支持按原样嵌套哈希。这篇answer中有一些关于如何解决的建议。

根据GPS数据的更新节奏,最好将所需的总写入次数降至最低。这可能会增加构造读取响应的操作数量;但是,添加只读从实例应该允许您扩展读取。您可以通过一些流水线更新来调整您的写入。

从你所描述的情况看,更新似乎仅限于用户的GPS和车辆状态。读取时请求的数据将用于单个用户查看他们的车辆位置和状态集。

我将从一个租户开始,该租户存储为具有用户名的散列,以及一个引用与该用户关联的车辆和会话的字段。如果您采用类似的命名约定,这实际上并不是必需的,但如果需要缓存其他用户数据,则显示为一个选项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Tenant user-1 (Hash)
-- name: Dad (String)
-- vehicles: user-1:vehicles (String) reference to key for set of vehicles assigned.
-- sessions: user-1:sessions (String) reference to key for set of user-vehicle sessions.

如果不需要任何其他租户数据,则可以使用关键字格式化来查找车辆。成员将是对车辆密钥的引用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- UserVechicles user-1:vehicles (Set)
-- member: vehicle-1 (String)

这将允许查找车辆的详细信息。车辆会有他们自己的位置。您可以包括一个字段来引用以车辆为中心的会话计划,类似于下面的用户会话。此外,如果响应也需要车辆名称或其他数据,则可以放置这些数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Vehicle: vehicle-1 (Hash) 
-- gps: "123.456,15.123" (String)

将特定于用户的会话存储在已排序的集合中。成员将是对存储会话信息的密钥的引用。分数将被设置为允许对该用户的最近和即将到来的会话进行范围查找的时间戳值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Schedule user-1:sessions
-- member: user-1:vehicle-1:session-1 (String)
-- score: 1638216000 (Float)

租户会话在车辆上您可以简单地使用字符串中的状态列表。这里显示了一个替代方案,如果您需要支持以车辆为中心的时间表视图,则允许存储计划和可用时间的额外状态。将这一点与车辆会话的排序集结合起来,就可以完善这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Session user-1:vehicle-1:session-1 (Hash)
-- status: OnTime (String)
-- scheduled_start: 1638216000 (String) [optional]
-- scheduled_end: 1638216600 (String) [optional]
-- earliest_available: 1638215000 (String) [optional]

如果您没有在其他地方跟踪状态,则可以使用散列来存储缓存对象的计数器,以便在发出新的缓存对象时使用。在添加新的缓存对象时读取并递增这些值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Globals: global (Hash)
-- user: 0
-- vehicle: 0
-- session: 0

对于更新,您将拥有:每个更新周期200k次写入操作。100k租户-车辆(1000个租户* 100辆/租户),每个租户

  • 1 HSET vehicle
  • 1 HSET session

流水线和调整流水线中的请求数量可以提高写性能,但我预计您应该能够在<2秒内完成所有写操作。

对于一次读取,你可能会有这样的结果:每个用户每个请求大约300次操作。

  • 1 HGETALL user
  • 1 ZRANGESTORE tempUSessions user-sessions LIMIT 200 (为用户查找最多200个会话)
  • 200 HGETALL session
  • 1 SMEMBERS user-vehicles (查找用户的所有车辆)
  • 100 HGET车辆gps (获取所有车辆的位置)

Considerations:

在会话和它们的引用通过后定期删除它们的进程将防止内存无限增长和性能一致。

添加一些脚本,以便在添加新用户或车辆时更容易地更新缓存,并将您所描述的需要显示的状态返回给用户,这将使这一切变得更加完整。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70145233

复制
相关文章
flutter - 方法 '[]'在null上被调用,但在inApp中有效
这意味着检索数据需要很短的时间, 试试这个。数据为空时,它将在短时间内通过进度指示器
徐建国
2021/08/03
9570
C++ this指针:用于在成员函数中指向调用该函数的对象
C++中this指针是一个指向当前对象的指针。在成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。
很酷的站长
2023/08/25
2680
C++ this指针:用于在成员函数中指向调用该函数的对象
Typo3 CVE-2019-12747 反序列化漏洞分析
TYPO3是一个以PHP编写、采用GNU通用公共许可证的自由、开源的内容管理系统。
Seebug漏洞平台
2019/08/06
2.6K0
Typo3 CVE-2019-12747 反序列化漏洞分析
实战C++对象模型之成员函数调用
先说结论:C++的类成员函数和C函数实质是一样的,只是C++类成员函数多了隐藏参数this。
一见
2019/03/20
1K0
成员可能是null的
但如果想避免NullReferenceException的发生,确实需要做很多麻烦的工作。
solenovex
2022/05/10
6070
成员可能是null的
让类成员函数指针成为可调用对象
    类成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象。
学徒漠筱歌
2022/07/17
1.2K0
【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )
静态成员函数归属 : 在 C++ 类中 , 静态成员函数 是一种 特殊的函数 , 该函数属于类 , 而不是属于 类实例对象 ;
韩曙亮
2023/10/15
1.6K0
【C++】静态成员函数 ( 静态成员函数概念 | 静态成员函数声明 | 静态成员函数访问 | 静态成员函数只能访问静态成员 )
成员函数
输入n个学生的信息,每个学生的信息包括姓名、身高、学号。变成输出身高最高的学生信息。
全栈程序员站长
2022/09/07
5800
不报错地调用空指针类的成员函数
  前两个应该都会段错误才对的呀,怎么都运行正常了。其实上述的行为都由this指针左右结果。
Qt君
2019/10/24
1.2K0
Typo3 CVE-2019-12747 反序列化漏洞分析
TYPO3是一个以PHP编写、采用GNU通用公共许可证的自由、开源的内容管理系统。
知道创宇云安全
2019/08/02
2.5K0
Typo3 CVE-2019-12747 反序列化漏洞分析
ASTMatcher分析函数调用链(上)
clang是llvm的编译器前端,是一个C语言、C++、Objective-C、Objective-C++语言的轻量级编译器,基本工作是进行词法分析、语法分析,生成抽象语法树(Abstract Syntax Code, AST)。要得到函数之间的调用关系,我们必须分析抽象语法树,clang提供了两种方法:ASTMatchers和RecursiveASTVisitor,RecursiveASTVisitor有两种方式实现,一是clang plugin,二是libtooling
adding
2019/10/18
7.3K0
C++类的成员函数 | 成员函数
在C++中,类的成员函数是函数的一种,它有返回值和函数类型,它与一般函数的区别只是:
小林C语言
2021/01/18
1.9K0
C++类的成员函数 | 成员函数
禁止在构造函数里调用虚函数
在构造函数中调用虚函数会导致程序出现莫名其妙的行为,这主要是对象还没有完全构造完成。下面我们先来看一段代码:
喵叔
2020/09/08
1.6K0
TiDB 在 Raft 成员变更上踩的坑
上次跟好基 黄东旭 在咖啡厅撩天的时候谈笑风生地探讨了一个 TiDB 使用 Raft 时遇到的问题:
drdrxp
2022/04/28
4590
TiDB 在 Raft 成员变更上踩的坑
静态成员函数和非静态成员函数的区别?
一个静态成员函数不与任何对象相联系,故不能对非静态成员进行默认访问。 它们的根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this。 例如: 1 class Sc 2 { 3 public: 4 void nsfn(int a); //像声明Sc::nsfn(Sc *this , int a); 5 static void sfn(int a); // 无this指针 6 //.... 7 }; 8 9 void f(Sc
猿人谷
2018/01/17
1.9K0
sql =null is null_sqlserver isnull函数
3、如果value1为null,结果返回vaule2的值。vaule2是你设定的值。
全栈程序员站长
2022/11/01
7290
2021-04-14 quickjs调用类的非静态成员函数
有这样一个需求:多线程条件下执行交易,每个交易都会通过quickjs回调c++代码的函数,而这个函数使用的数据又来自于当前的交易 首先不考虑用全局变量来保存交易的数据,因为js回调c函数的时候我们无法在回调函数中区分当前属于哪个交易,如果你总是把交易的id通过回调函数传递过来也是可以实现,只是这样函数就多了个参数,写js代码的人无法理解。 一个简单的思路是c代码创建交易的类,然后把类的函数传递给quickjs,然后在js中调用这个类的函数,但是这个实现不了,因为quickjs没有注入非静态成员函数的接口,其原因文章非static成员函数通过类名::来调用,空指针调用成员方法不出错!讲解的比较清楚 换个思路,我们先用js创建这个类,然后调用eval把类的数据传递给它,这样调用这个类的非静态成员函数的时候就可以正确访问到数据了,我们直接修改文件example.cpp 具体实现如下:
oracle3
2022/04/22
1K0
Rc-lang开发周记8 OOP之成员函数调用
本周做的内容不多,主要都是在做基础的成员调用相关工作(也只处理了成员函数,还没处理成员变量),然后就是修复一些问题添加了一些dump设施(目前做的并不好,等做好了可以单独拿一期讲一下),以及学习了解了一些其他语言相关的知识。
AkemiHomura
2023/04/07
3010
Go语言在模版中调用函数
如果希望调用自定义函数,需要借助html/template包下的FuncMap进行映射
IT工作者
2022/03/31
2.8K0
帝国cms栏目别名如何调用?
  我们在用帝国cms建站时经常会发现栏目的标题不好设置,栏目名称太长的话在后台那边看了眼花,太短又不好优化。能不能直接调用栏目别名呢?栏目别名不会什么影响。那么,帝国cms栏目别名怎么调用呢?和yt
ytkah
2018/03/05
4.7K0
帝国cms栏目别名如何调用?

相似问题

TYPO3扩展:在null上调用成员函数setParent()

232

调用null上的成员函数?

14

调用null上的成员函数

23

致命错误:在findAll中对null调用成员函数TYPO3 ()

34

调用null上的成员函数helper()

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文