使用缓存是否是一个好主意以及如何将其用于 Django 中单个页面的 4000-10000 数据行?
Is it a good idea to use cache and how to use it for 4000-10000 data rows in Django for a single page?
Django 2.2
我需要从特定数据表(我们称之为 commonsites
)中获取 4000-10000 行数据以显示网页。
我可以缩小到这 4000-10000 行中的 3 个字段(id、名称、business_id)
我的流量很低。但我想知道使用 caching 来获取这 4000-10000 行是否是个好主意
这些行的数据不太可能更改。但是万一它们确实发生更改或被删除,我如何 update/remove 缓存中的个别行,而不是整个缓存?
或者这甚至是个好主意?
我的安装是:
- 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。
既然我们q/a在评论里,我可能会给出一个完整的答案。
在单个字符串中保留 ~4K-10K 行可能不是一个好的做法。但是您不打算在前端进行任何分页。即使您将参数数量减少到 id
、name
、business_id
- 对于该行数,由于以下原因,它可能并不好;
- 您需要整体获取值,这可能会导致网络问题。特别是当流量越来越大的时候,每个人都会去获取那块数据。
- 如果你想update/delete一些行,你需要(get+update+set)/set them as whole (network again)
- 您不能使值的某些部分无效。
- 您不能设置部分 TTL - 您要么 expire/persist 整个。
The data for these rows are unlikely to change. But in case they do change or get deleted, how do I update/remove individual rows in the cache, rather than the entire cache?
由于您不需要分页并希望将它们保存在一个键中,因此您可以使用 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
一次更新single/multiplerow/s。您可以通过 hdel
从缓存中删除单个行。您仍然可以通过使用 hgetall
将所有数据作为单个数据获取。哈希字段没有部分 TTL(排序集在应用程序层有一些代码)但哈希比字符串更适合您的用例。
Django 2.2
我需要从特定数据表(我们称之为 commonsites
)中获取 4000-10000 行数据以显示网页。
我可以缩小到这 4000-10000 行中的 3 个字段(id、名称、business_id)
我的流量很低。但我想知道使用 caching 来获取这 4000-10000 行是否是个好主意
这些行的数据不太可能更改。但是万一它们确实发生更改或被删除,我如何 update/remove 缓存中的个别行,而不是整个缓存?
或者这甚至是个好主意?
我的安装是:
- 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。
既然我们q/a在评论里,我可能会给出一个完整的答案。
在单个字符串中保留 ~4K-10K 行可能不是一个好的做法。但是您不打算在前端进行任何分页。即使您将参数数量减少到 id
、name
、business_id
- 对于该行数,由于以下原因,它可能并不好;
- 您需要整体获取值,这可能会导致网络问题。特别是当流量越来越大的时候,每个人都会去获取那块数据。
- 如果你想update/delete一些行,你需要(get+update+set)/set them as whole (network again)
- 您不能使值的某些部分无效。
- 您不能设置部分 TTL - 您要么 expire/persist 整个。
The data for these rows are unlikely to change. But in case they do change or get deleted, how do I update/remove individual rows in the cache, rather than the entire cache?
由于您不需要分页并希望将它们保存在一个键中,因此您可以使用 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
一次更新single/multiplerow/s。您可以通过 hdel
从缓存中删除单个行。您仍然可以通过使用 hgetall
将所有数据作为单个数据获取。哈希字段没有部分 TTL(排序集在应用程序层有一些代码)但哈希比字符串更适合您的用例。