【问题标题】:Database cache ( redis, memcache ) usage, query vs. items数据库缓存(redis、memcache)使用、查询与项目
【发布时间】:2021-08-16 17:44:33
【问题描述】:

我想知道首选的方法是使用内存缓存(如 redis 或 memcache)缓存数据库中的元素。上下文是我有一个由 API 访问的项目表,经常(每秒数百万次)作为实时统计信息。一般来说,API 只是在给定的时间范围内查找具有特定辅助 id 的项目。相同的数据很可能会被多次命中。您似乎可以通过以下几种方式做到这一点:

  1. 缓存整个查询。

意思是,对数据库的实际查询产生的整个数据字符串将存储在缓存中,以最小查询作为键。优点是对于经常使用的查询,只需一次访问即可获取整个结果集。但是任何稍微不同的查询都需要重做和缓存。

  1. 缓存查询中的项目。

意思是,从真实查询​​返回的每个项目都单独存储在缓存中,并以可搜索的 id 作为键。优点是对于稍微不同的查询,您不需要再次对 DB 运行完整查询,只需当前未缓存的元素即可。

  1. 镜像整个数据库

意思是,每个项目在数据库中创建/更新后立即放入缓存。缓存始终假定为最新的,因此所有查询都可以直接在缓存上运行。

似乎这些方法在某些情况下可能更好或更差,但是这里是否存在一些使某些完全不受欢迎的陷阱?还是在这个用例中明显更好?

感谢您的建议!

【问题讨论】:

    标签: database api redis memcached


    【解决方案1】:

    #3 即,镜像数据库不是一个好的选择。另外,请记住,像 Redis 这样的大多数内存系统都没有查询语言,而是基于 Keys 的检索。因此,复制数据不是一个好主意,尤其是在数据是关系的情况下。 您应该使用#1 和#2 的组合。 Redis 是基于键的,因此您必须根据查询条件设计键。我建议建立一个基于 etag 概念的库。在 redis 中,保存 etag 和查询响应。库应该将 etag 传递给后端逻辑,只有当 etag 不匹配时才会重新运行查询。如果 etag 匹配,则后端将不会重新运行查询,并且库将从 redis 获取缓存的响应并发送回客户端。

    参考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag 概念。

    【讨论】:

      猜你喜欢
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2022-01-23
      • 2012-09-06
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多