Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django redis用于通知_Django_Redis_Django Rest Framework_Django Redis_Django Notification - Fatal编程技术网

Django redis用于通知

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的速度和结

我已经用Django REST框架构建了一个REST API。在应用程序中,需要facebook类型的通知(新朋友请求、新消息等)。目前,我正在使用长轮询处理此问题:

  • 前端客户端发送GET请求
  • 我的REST视图搜索新对象,如果有,立即返回,否则搜索20秒,如果没有,返回空响应
  • 收到响应后(从前端客户端)立即发送新的GET请求
注意:我们不使用WebSocket,如果需要,请写信给我

我想用django/redis替换这个方法,因为我认为我的长轮询方法大量滥用了DB,我认为redis的速度和结构可以帮助很多


有没有关于如何完成类似任务的建议?

使用Redis,您可以缓存通知并加快仅在前端显示内容的过程,而不必滥用数据库。 例如,您可以有如下键:

<user_id>_new_message
\u新消息
现在,每当用户ID为的用户收到新消息时,您可以更新redis缓存,将新消息更新为1。 现在应该有一个函数/AJAX调用来检查
\u new\u message
,并将前端的通知更新为
先前的未读notif count+1
。您可以着手更新数据库(如果需要的话),比如每20分钟为所有用户批量更新一次


现在,来看看实际的更新。由于您的系统需要在服务器和用户端之间进行交互(例如向用户显示消息并能够回复消息),Redis在这方面无法帮助您。您将需要WebSocket之类的服务。对于消息和好友请求,您需要用户和API之间的交互。

使用基于内存的键值存储更适合您当前的使用情况,因为它将极大地减少数据库的负载并加快应用程序的速度

Redis不仅仅是内存中的键值存储,因此您可以利用它更轻松地实现目标

我在这里写一个简单的实现,你可以在这个基础上实现你想要的

总之

  • 我们将用户的所有通知保存在 以用户名称命名的HashMap的键

  • HashMap是notificationId到notificationData的映射(Json格式)

  • 通知的元数据保存在通知数据体中。(日期、读取状态等)

  • 您还可以构建更多功能或使用redis的不同功能,为您的网站/应用程序创建近实时通知后端。(我复制了redis连接创建部分、用户id和…以便答案更清楚)


    干杯

    感谢您的回复,这似乎是一个有用的解决方案。我们将尝试实现它(可能会修改一点),然后我们将回到您的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)