如何在Django中使用redis?

111

我听说过redis-cache,但它究竟是如何工作的呢?它是通过某种方式缓存rdbms查询,作为django和我的rdbms之间的一层来使用吗?

还是它应该直接用作数据库?我表示怀疑,因为那个Github页面没有涵盖任何登录详细信息,也没有设置说明..只告诉你设置一些配置属性。

5个回答

80

这个 Python 模块用于 Redis,readme 中有一个清晰的使用示例: http://github.com/andymccurdy/redis-py

Redis 旨在作为 RAM 缓存。它支持基本的 GET 和 SET 键操作,以及像字典这样的集合存储。您可以通过将其输出存储到 Redis 中来缓存 RDBMS 查询。目标是加速 Django 网站的运行速度。在需要提高速度之前不要开始使用 Redis 或任何其他缓存方式,不要过早的优化。


9
通常可以通过为键设置TTL来实现:http://redis.io/commands/ttl。如果键过期,您必须访问数据库。因此,如果键在Redis中,则使用它。请注意,简单的实现会引起一些问题:当一个热门的键过期时,会出现“雷鸣群”问题(http://en.wikipedia.org/wiki/Thundering_herd_problem),您需要使用“负缓存”(http://en.wikipedia.org/wiki/Negative_cache),并且您的数据库需要进行“准入控制”(http://en.wikipedia.org/wiki/Admission_control)。 - Spike Gronim
4
Redis的设计不仅仅是为了作为RAM缓存,它还具有持久化功能(但包括缓存特性)。此外,Redis不仅仅是一个简单的键值存储系统,它还有列表、哈希集合等内置操作功能。 - Olli
9
说实话,缓存模型/响应对象并不属于过早优化。除非你被要求这样做(比如在Heroku上),否则即使是对于小型应用程序进行缓存也没有坏处。 - vikki
1
这不是关于速度,而是关于资源。在缓存中的表会更经济。 - dman
@SpikeGronim,您能详细说明一下我为什么会遇到“雷鸣群”问题吗?我猜想在Redis中一个热门键过期后的第一个请求必须向我的DBMS发出查询,然后Redis缓存该结果,因此后续请求可以直接从Redis读取查询结果。 - nalzok
显示剩余4条评论

62

仅仅因为Redis将数据存储在内存中,并不意味着它只能用作缓存。 我曾经看到人们将其用作数据的持久化存储。

它可以作为缓存使用,这表明它非常适合高性能存储。 但是,如果您的Redis系统出现故障,可能会丢失没有再次写回磁盘的数据。 有一些方法可以减轻这种危险,例如热备份副本。

如果您的数据是“使命必达”的,例如运行银行或商店,那么Redis可能并不是最好的选择。 但是,如果您正在编写具有持久性实时数据或某些社交互动内容的高流量游戏,并且管理数据丢失的概率相当可接受,则Redis值得一看。

无论如何,要点是,是的,Redis可以用作数据库。


3
我们公司使用Redis存储由Cassandra和Postgres生成的摘要和产品。这些产品数量很大(几十亿),需要经常更改,而且我们永远不知道在任何时刻需要什么,因此它们非常适合Redis。此外,一旦在SQL数据库中超过一百万行的任何内容,Redis可以成为极好的辅助资源进行成员测试(例如,这些实体是否在此域中?)。 - David

24

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,否则结果不是很有用)。


5

Redis作为主要数据库

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

  1. 列表
  2. 集合
  3. 有序集合
  4. 哈希表
  5. 位图
  6. Hyperloglogs

Redis数据类型官方文档

Redis是内存中的键值存储,如果Redis服务器出现故障,您的数据将会丢失。

Redis也可以持久化数据,请查看官方文档。

Redis持久化官方文档


Redis作为缓存

是的,Redis驻留在Django和关系型数据库之间。

它是如何工作的

给定一个URL,尝试在缓存中找到该页面,如果页面在缓存中:返回缓存页面,否则:生成该页面,将生成的页面保存在缓存中(供下一次使用),并返回该生成的页面

Django缓存框架官方文档


如何使用Redis与Django

我们可以为Django应用程序使用Redis Python客户端redis-py

Redis Python客户端redis-py Github

我们可以使用Django-redis作为Django缓存后端。

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

Django-redis文档Github

还存在其他库。


Redis使用案例和数据类型

一些使用案例

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

基于核心数据结构类型的顶级Redis使用案例


使用Redis的大型技术公司

 Twitter GitHub Weibo Pinterest Snapchat Craigslist Digg StackOverflow Flickr 


5

您还可以将Redis用作Django应用程序中分布式任务的队列。 您可以将其用作CeleryPython RQ的消息代理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接