- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Scylla 如何确定何时从其缓存中逐出数据?例如,假设表 T
具有以下结构:
K1 C1 V1 V2 V3
我用 500 行填充了上面的表(例如,查询 SELECT * from T WHERE K1 = X & C1 = Y
返回 500 行)。
一段时间后,我在上面的表中插入了一个新行,这将导致上面的查询返回 501 行,而不是 500 行。
Scylla 是否知道自动从其缓存中逐出 500 行或至少将第 501 行添加到其缓存中?否则,大多数查询将很快开始返回过时的数据。同样,如果我不向数据库添加新行,而是更新现有 500 行中的一个,会发生什么情况。 Scylla 是否知道此修改并能够自动更新其缓存?如果是,它是否足够聪明,只更新更改的数据(新行或修改的行),还是逐出/更新所有 500 行?
是否有任何情况需要注意数据在 SSTables
而不是在内存中更新的位置?
谢谢
附言
我阅读了很多关于 how caching works in Scylla 的内容但我没有看到上述问题的明确答案。如果 Scylla 确实知道后台更新,我也很想知道它如何实现缓存的动态和智能更新。
最佳答案
我认为您误解了缓存在 Scylla 或任何数据库中的作用。
行缓存,顾名思义,缓存(即保存在内存中)单个行 - 而不是整个请求的结果。因此,一次请求返回 500 行的事实并不意味着下一次此请求将返回 Scylla 将返回相同的 500 行。一点也不。让我试着解释一下到底发生了什么,尽管这在其他地方也有记录,我还将简化一些细节以希望能理解这一点:
当 Scylla 节点启动时,所有数据都位于磁盘上(存储在称为 sstables 的文件中),内存中没有任何数据。当用户请求读取内存缓存中不存在的特定行时,将从磁盘读取该行,然后将其存储在缓存中。如果用户稍后再次读取同一行,它会立即从缓存中返回。如果用户写入这一行,该行在缓存中和磁盘上都会更新(细节稍微复杂一些,还有一个内存表——memtable - 但我正在尝试简化)。缓存始终是最新的 - 如果其中出现一行,则它是正确的。当然也可以不出现在里面。
您在问题文本中描述的情况(虽然不是您发布的实际查询!)是关于分区切片的扫描,返回的不是一行而是多行(500 或 501) . Scylla 需要(并且确实)做更多的工作来正确处理这种情况:
当第一次扫描某个范围时,Scylla 会读取该范围内的 500 行,并将它们中的每一行放入行缓存中。但它还记得缓存在该范围内是连续的——这 500 行是该范围内存在的所有内容。因此,当用户再次尝试相同的查询时,缓存不需要检查这 500 行之间是否还有其他行——它知道没有。如果您稍后在此范围内写入第 501 行,则此行将添加到缓存,缓存知道它保持连续,因此此范围的下一次扫描将返回 501 行。 Scylla 不需要仅仅因为一个被添加到同一个分区就需要逐出 500 行。
如果在稍后的某个时间点 Scylla 内存不足并且需要从缓存中逐出一些行,它可能会决定从缓存中逐出所有这 501 行 - 或其中的一些。如果它驱逐了其中的一些,它就会失去连续性 - 如果它只记得原始范围的 400 行,如果用户要求再次扫描该范围,Scylla 将被迫(再次简化一些细节)读取所有行来自磁盘的范围,因为它不知道在此范围内缺少哪些特定行。
关于database - Scylla 如何从其缓存中逐出数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72253581/
我阅读了有关 JSR 107 缓存 (JCache) 的内容。 我很困惑:据我所知,每个 CPU 都管理其缓存内存(无需操作系统的任何帮助)。 那么,为什么我们需要 Java 缓存处理程序? (如果C
好吧,我是 jQuery 的新手。我一直在这里和那里搞乱一点点并习惯它。我终于明白了(它并不像某些人想象的那么难)。因此,鉴于此链接:http://jqueryui.com/sortable/#dis
我正在使用 Struts 2 和 Hibernate。我有一个简单的表,其中包含一个日期字段,用于存储有关何时发生特定操作的信息。这个日期值显示在我的 jsp 中。 我遇到的问题是hibernate更
我有点不确定这里发生了什么,但是我试图解释正在发生的事情,也许一旦我弄清楚我到底在问什么,就可能写一个更好的问题。 我刚刚安装了Varnish,对于我的请求时间来说似乎很棒。这是一个Magneto 2
解决 Project Euler 的问题后,我在论坛中发现了以下 Haskell 代码: fillRow115 minLength = cache where cache = ((map fill
我正试图找到一种方法来为我网络上的每台计算机缓存或存储某些 python 包。我看过以下解决方案: pypicache但它不再被积极开发,作者推荐 devpi,请参见此处:https://bitbuc
我想到的一个问题是可以从一开始就缓存网络套接字吗?在我的拓扑中,我在通过双 ISP 连接连接到互联网的 HAProxy 服务器后面有 2 个 Apache 服务器(带有 Google PageSpee
我很难说出不同缓存区域 (OS) 之间的区别。我想简要解释一下磁盘\缓冲区\交换\页面缓存。他们住在哪里?它们之间的主要区别是什么? 据我了解,页面缓存是主内存的一部分,用于存储从 I/O 设备获取的
1.题目 请你为最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象 in
1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: ① LRUCache(int capacity) 以正整数作为容量 capacity
我想在访问该 View 时关闭某些页面的缓存。它适用于简单查询模型对象的页面。 好像什么时候 'django.middleware.cache.FetchFromCacheMiddleware', 启
documents为 ExePackage element state Cache属性的目的是 Whether to cache the package. The default is "yes".
我知道 docker 用图层存储每个图像。如果我在一台开发服务器上有多个用户,并且每个人都在运行相同的 Dockerfile,但将镜像存储为 user1_myapp . user2 将其存储为 use
在 Codeigniter 中没有出现缓存问题几年后,我发现了一个问题。我在其他地方看到过该问题,但没有适合我的解决方案。 例如,如果我在 View 中更改一些纯 html 文本并上传新文件并按 F5
我在 Janusgraph 文档中阅读了有关 Janusgraph Cache 的内容。关于事务缓存,我几乎没有怀疑。我在我的应用程序中使用嵌入式 janusgrah 服务器。 如果我只对例如进行读取
我想知道是否有来自终端的任何命令可以用来匹配 Android Studio 中执行文件>使缓存无效/重新启动的使用。 谢谢! 最佳答案 According to a JetBrains employe
我想制作一个 python 装饰器来内存函数。例如,如果 @memoization_decorator def add(a, b, negative=False): print "Com
我经常在 jQuery 事件处理程序中使用 $(this) 并且从不缓存它。如果我愿意的话 var $this = $(this); 并且将使用变量而不是构造函数,我的代码会获得任何显着的额外性能吗?
是的,我要说实话,我不知道varnish vcl,我可以解决一些基本问题,但是我不太清楚,这就是为什么我遇到问题了。 我正在尝试通过http请求设置缓存禁止,但是该请求不能通过DNS而是通过 Varn
在 WP 站点上加载约 4000 个并发用户时遇到此问题。 这是我的配置: F5 负载均衡器 ---> Varnish 4,8 核,32 Gb RAM ---> 9 个后端,4 个核,每个 16 RA
我是一名优秀的程序员,十分优秀!