Django redis用于通知
我已经用Django REST框架构建了一个REST API。在应用程序中,需要facebook类型的通知(新朋友请求、新消息等)。目前,我正在使用长轮询处理此问题:Django redis用于通知,django,redis,django-rest-framework,django-redis,django-notification,Django,Redis,Django Rest Framework,Django Redis,Django Notification,我已经用Django REST框架构建了一个REST API。在应用程序中,需要facebook类型的通知(新朋友请求、新消息等)。目前,我正在使用长轮询处理此问题: 前端客户端发送GET请求 我的REST视图搜索新对象,如果有,立即返回,否则搜索20秒,如果没有,返回空响应 收到响应后(从前端客户端)立即发送新的GET请求 注意:我们不使用WebSocket,如果需要,请写信给我 我想用django/redis替换这个方法,因为我认为我的长轮询方法大量滥用了DB,我认为redis的速度和结
- 前端客户端发送GET请求
- 我的REST视图搜索新对象,如果有,立即返回,否则搜索20秒,如果没有,返回空响应
- 收到响应后(从前端客户端)立即发送新的GET请求
有没有关于如何完成类似任务的建议?使用Redis,您可以缓存通知并加快仅在前端显示内容的过程,而不必滥用数据库。 例如,您可以有如下键:
<user_id>_new_message
\u新消息
现在,每当用户ID为的用户收到新消息时,您可以更新redis缓存,将新消息更新为1。
现在应该有一个函数/AJAX调用来检查\u new\u message
,并将前端的通知更新为先前的未读notif count+1
。您可以着手更新数据库(如果需要的话),比如每20分钟为所有用户批量更新一次
现在,来看看实际的更新。由于您的系统需要在服务器和用户端之间进行交互(例如向用户显示消息并能够回复消息),Redis在这方面无法帮助您。您将需要WebSocket之类的服务。对于消息和好友请求,您需要用户和API之间的交互。使用基于内存的键值存储更适合您当前的使用情况,因为它将极大地减少数据库的负载并加快应用程序的速度 Redis不仅仅是内存中的键值存储,因此您可以利用它更轻松地实现目标 我在这里写一个简单的实现,你可以在这个基础上实现你想要的 总之
干杯感谢您的回复,这似乎是一个有用的解决方案。我们将尝试实现它(可能会修改一点),然后我们将回到您的comment@lcadc17你还需要什么回答吗?这似乎对我很有效,我使用了集合/散列,效果很好。谢谢你的回答,我会从你的回答中看到什么。关于消息传递,我们仍然使用长轮询(除了WebSocket之外,不知道这是否是一种流行的解决方案),但目前它还可以正常工作
from redis import StrictRedis
import json
# Function to add new notifications for user
def add_notification(user_id, notification_id, data):
r = StrictRedis(host='localhost', port=6379)
r.hset('%s_notifications' % user_id, notification_id, json.dumps(data))
# Function to set the notification as read, your Frontend looks at the "read" key in
# Notification's data to determine how to show the notification
def set_notification_as_read(user_id, notification_id):
r = StrictRedis(host='localhost', port=6379)
data = json.loads(r.hget('%s_notifications' % user_id, notification_id))
data['read'] = True
add_notification(user_id, notification_id, data)
# Gets all notifications for a user, you can sort them based on a key like "date" in Frontend
def get_notifications(user_id):
r = StrictRedis(host='localhost', port=6379)
return r.hgetall('%s_notifications' % user_id)