使用缓存以及如何在 Django 中为单个页面使用 4000-10000 个数据行是一个好主意吗?



Django 2.2

我需要从特定的数据表中获取 4000-10000 个数据行(我们称之为commonsites(等以显示网页。

我可以缩小到这 3-4000 行中的 10000 个字段(id、名称business_id(

我的流量很低。但我想知道使用缓存来获取这 4000-10000 行是否是一个好主意

这些行的数据不太可能更改。但是,如果它们确实更改或删除,如何更新/删除缓存中的单个行,而不是整个缓存?

或者这甚至是一个好主意?

我的安装是:

  • redis==3.3.11 # https://github.com/antirez/redis
  • Django-redis==4.11.0 # https://github.com/niwinz/django-redis

更新

更清楚的是,该网页是一个检索。一旦发出页面请求,javascript 前端将进行 API 调用。然后,此 API 调用将从数据表中获取这 4000-10000 个数据行。

因此,这些数据行是预先存在的数据。

数据作为 API json 数据作为 json 数据中的列表发送。

需要明确的是,数据不会被分页。全部显示。而且我没有测量数据大小,所以我不能说数据有多大。我怀疑它超过 5mb。

由于我们在评论中问/答,我可能会给出一个完整的答案。

在单个字符串中保留 ~4K-10K 行可能不是一个好的做法。但是您不打算在前端进行任何分页。即使您将参数的数量减少到idnamebusiness_id- 对于该行数,由于以下原因,它可能不好;

  • 您需要获取整个值,这可能会导致网络问题。特别是当流量变得很高时,每个人都会获取该块数据。
  • 如果要更新/
  • 删除某些行,则需要(获取+更新+设置(/将它们设置为整个(再次网络(
  • 不能使值的某些部分无效。
  • 您无法设置部分 TTL - 您要么使整个 TTL 过期/持久化。

这些行的数据不太可能更改。但是,如果它们确实更改或删除,如何更新/删除缓存中的单个行,而不是整个缓存?

由于您不需要分页并希望将它们保存在单个键中,因此您可以使用hash来满足上面列出的条件,而不是string

127.0.0.1:6379> hset row 1 "some-json"
(integer) 1
127.0.0.1:6379> hset row 2 "some-json2"
(integer) 1
127.0.0.1:6379> hset row 3 "some-json3"
(integer) 1
127.0.0.1:6379> hset row 4 "some-json4"
(integer) 1
127.0.0.1:6379> hgetall row
1) "1"
2) "some-json"
3) "2"
4) "some-json2"
5) "3"
6) "some-json3"
7) "4"
8) "some-json4"
127.0.0.1:6379> hset row 3 "some-other-json"
(integer) 0
127.0.0.1:6379> hgetall row
1) "1"
2) "some-json"
3) "2"
4) "some-json2"
5) "3"
6) "some-other-json"
7) "4"
8) "some-json4"
127.0.0.1:6379> hdel row 3
(integer) 1
127.0.0.1:6379> hgetall row
1) "1"
2) "some-json"
3) "2"
4) "some-json2"
5) "4"
6) "some-json4"
127.0.0.1:6379>

您可以使用hset一次更新单行/多行。您可以通过hdel缓存中的单个行来删除。您仍然可以使用hgetall通过以下方式将所有数据作为一个单一数据获取。哈希字段没有部分 TTL(排序集在应用程序层有一些代码(,但哈希比字符串更适合您的用例。

相关内容

最新更新