我是 Django 新手,现在我正在学习 Django 与通道异步。我注意到一些程序员在他们的项目中使用channels_redis,一些使用django_redis,一些使用asgi_redis,我在google中找到了redis服务器。这些库有什么区别吗?
Django-redis是一个缓存后端redis数据的服务。 Redis 数据是有关事件的准确时间信息,例如与服务器或数据库的连接。所以 django-redis 是一个用于上述目的的 api。 Django 通道是 Django 的一项功能,允许框架直接使用 Websocket、物联网协议、聊天协议等。这些实用程序依赖于 ASGI-redis API 的服务。 ASGI-Redis 服务器必须与 Django 通道连接才能执行其任务。
您可以在这里阅读有关该主题的更多信息:
https://realpython.com/getting-started-with-django-channels/
我刚开始的时候也有过类似的问题。现在这是我的答案,可以帮助其他人。我的回答故意忽略了更详细的细节,但如果你问这样的问题 - 这意味着你是初学者,需要首先获得高层次的理解。
Redis: 宽松地说,可以将 Redis 视为内存数据库。由于它位于内存中,您会期望它非常快,并且(取决于您如何使用它)不是 100% 可靠(即您可能会丢失一些已写入内存但尚未写入的数据)磁盘)
Django-Redis: 该库/包允许您使用 Redis 服务器作为 Django 网站的后端来缓存页面或会话。请记住,Django 中的默认后端是 Postgres,它是传统的 SQL 数据库,用于将所有写入保存到磁盘。 Django 能够缓存您的网页(通常是动态生成的)。缓存使您的网站响应速度更快,因为您不必重新生成页面(只需从缓存中提供它)。基本上,Redis 在这种情况下所做的就是让你的缓存更快(比 Postgres 保存缓存的速度更快)。
渠道: Channels 允许您的 Django 网站处理 WebSockets(以及其他一些东西)。 WebSockets 基本上是您的网站向连接的客户端异步发送消息的能力。例如,客户端不是每隔几秒就询问服务器“你有消息给我吗?”,而是告诉服务器“只要你有消息给我,就发送给我”。
通道层: 在了解channels_redis之前,您需要了解通道层的概念。通道层是一种允许数据(技术上是消息或事件)在不同实例或线程之间共享的机制。例如,如果您的网站同时在多个服务器上运行(用于负载共享),则您正在运行多个实例。或者,如果您使用 WebSockets(通道),那么每个客户端连接通常会在自己的线程(worker)中运行。请记住,不同的进程/实例不共享内存。即使同一进程中的不同线程也无法轻松地相互发送事件/通知/消息。你需要一个外部沟通机制。理论上,您可以使用数据库、文件系统或消息队列(每个实例都会检查是否有消息)。但 Django 使用通道层让您可以更轻松地做到这一点。想象一下一个聊天应用程序,其中两个人互相发送消息。在服务器端,您将有两个 Websocket 连接(每个客户端一个)。现在,每当一条消息到达一个连接时,您都需要将其发送到另一个连接。进入通道层
Channels_Redis: channels_redis 为您提供通道层。 如果您使用通道层,您可能需要高响应能力。这就是为什么channels_redis使用redis作为后端。 根据他们的文档,“channels_redis 是唯一支持生产使用的由 Django 官方维护的通道层”。
asgi_redis: 它只是channels_redis 的旧名称。除非你的项目已经使用这个包,否则你不需要担心它。