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 行可能不是一个好的做法。但是您不打算在前端进行任何分页。即使您将参数的数量减少到id
、name
、business_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(排序集在应用程序层有一些代码(,但哈希比字符串更适合您的用例。