如何在Django中使用redis?


95

我听说过redis-cache,但是它是如何工作的呢?通过以某种方式缓存rdbms查询,它是否被用作Django和我的rdbms之间的一层?

还是应该将其直接用作数据库?我对此表示怀疑,因为该github页面不包含任何登录详细信息,所以没有设置..只是告诉您设置一些config属性。

Answers:


72

这个Redis的Python模块在自述文件中有一个清晰的用法示例:http : //github.com/andymccurdy/redis-py

Redis被设计为RAM缓存。它支持键的基本GET和SET以及字典等集合的存储。您可以通过将RDBMS查询的输出存储在Redis中来缓存它们。目标是加快Django网站的速度。在需要速度之前,不要开始使用Redis或任何其他缓存-不要过早地进行优化。


但是,如何检查redis上的缓存是否需要更新?您比较记录数还是有更好的方法?
Marconi

7
通常通过为密钥设置TTL来完成:redis.io/commands/ttl。如果密钥过期,则必须转到数据库。因此,如果密钥位于redis中,则可以使用它。请注意,此操作的简单实现会引起一些问题:当公用密钥过期时,您将具有en.wikipedia.org/wiki/Thundering_herd_problem,您想使用en.wikipedia.org/wiki/Negative_cache,并且您的数据库需要en.wikipedia。 org / wiki / Admission_control
Spike Gronim 2011年

4
嗯,好吧,a)Redis的设计不仅仅是RAM缓存-它是持久性的(但包括缓存功能),b)它不仅仅是简单的键值存储-列表,哈希集等带有内置操作。
Olli 2012年

8
老实说,缓存模型/响应对象不会属于过早的优化。除非您要为此付费(例如在heroku上),否则即使对于小型应用程序而言,缓存也不会受到损害。
维基

1
这与速度无关,而与资源有关。缓存中的表将更便宜。
dman 2014年

60

仅仅因为Redis将事物存储在内存中并不意味着它就是缓存。我见过人们将它用作数据的持久存储。

可以将其用作高速缓存暗示它可以用作高性能存储。如果您的Redis系统出现故障,则可能会丢失尚未再次写回到磁盘的数据。有一些方法可以减轻这种危险,例如,热备份副本。如果您的数据是“关键任务”,例如您经营一家银行或商店,那么Redis可能不是您的最佳选择。但是,如果您使用持久的实时数据或一些社交互动的东西来编写流量高的游戏,并且将数据丢失的可能性控制在可以接受的范围内,那么Redis可能值得一看。

无论如何,重点仍然存在,是的,Redis可以用作数据库。


3
对于我的公司,我们使用Redis来存储摘要和从Cassandra&Postgres生成的产品。这些产品的数量(数十亿),需要更改的频率以及我们永远不知道需要什么,这使它们非常适合Redis。此外,一旦您在SQL数据库中超过一百万行,redis可以成为成员资格测试的绝佳免费资源(例如,这些实体在此域中吗?)
David

忍不住想知道为什么我的答案在几个月前就完全相同了,所以为什么您的答案如此之高?
ostergaard

22

Redis基本上是一个“记忆中”的KV存储,带有大量的铃声和口哨声。它非常灵活。您可以将其用作临时存储(例如缓存)或永久存储(例如数据库)(带有其他答案中提到的警告)。

当与Django结合使用时,Redis的最佳/最常见用例可能是缓存“响应”和会话。

这里有一个后端https://github.com/sebleier/django-redis-cache/和Django文档中的出色文档,这里是https://docs.djangoproject.com/en/1.3/topics/cache/

我最近开始使用https://github.com/erussell/django-redis-status监视我的缓存-很有魅力。(在redis上配置maxmemory或结果不是很有用)。



2

Redis作为主数据库

是的,您可以将Redis键值存储用作主数据库。Redis不仅存储键值对,还支持不同的数据结构,例如

  1. 清单
  2. 排序集
  3. 散列
  4. 位图
  5. 超级日志

Redis数据类型官方文档

Redis在内存键值存储中,因此如果Redis服务器发生故障,您必须知道它,您的数据将丢失。

Redis还可以保留数据检查官方文档。

Redis Persistence官方文档


Redis作为缓存

是的,Redis驻留在Django和RDBMS之间。

这个怎么运作

given a URL, try finding that page in the cache if the page is in the cache: return the cached page else: generate the page save the generated page in the cache (for next time) return the generated page

Django的缓存框架Official Doc


如何在Django中使用Redis

我们可以将redis python客户端redis-py用于Django应用程序。

Redis Python客户端redis-py Github

我们可以将Django-redis用于Django缓存后端。

Django-redis基于redis-py构建,并添加了与Django应用程序相关的额外功能。

Django-redis doc Github

还存在其他库。


Redis用例和数据类型

一些用例

  • 会话缓存
  • 实时分析
  • Web缓存
  • 排行榜

按核心数据结构类型划分的顶级Redis用例


使用Redis的大型科技公司

 Twitter GitHub Weibo Pinterest Snapchat Craigslist Digg StackOverflow Flickr 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.