1

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

  • 前端客户端发送 GET 请求
  • 我的 REST 视图搜索新对象并在有时立即返回它们,否则搜索 20 秒并在没有时返回空响应
  • 收到响应后立即发送一个新的 GET 请求(来自前端客户端)

注意:我们没有使用 websockets,如果需要请写信给我

我想用 django/redis 替换此方法,因为我认为我的长轮询方法大量滥用数据库,而且我认为 Redis 的速度和结构可以提供很大帮助。

关于如何完成这样的事情有什么建议吗?

4

2 回答 2

2

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

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

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

简而言之

  1. 我们将用户的所有通知保存在 redis 中的 HashMap 中,HashMap 的键以用户命名。

  2. HashMap 是 notificationId 到 notificationData 的映射(Json 格式)。

  3. 通知的元数据保存在通知数据主体内。(日期、阅读状态等信息……)

    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)
    

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

干杯

于 2018-06-20T10:33:17.767 回答
0

使用 Redis,您可以缓存通知并加快在前端显示事物的过程,而滥用数据库则要少得多。例如,您可以使用以下键:

<user_id>_new_message

现在,每当用户 ID = 的用户<user_id>收到一条新消息时,您可以更新 redis 缓存以将 更新<user_id>_new_message为 1。现在应该有一个函数/AJAX 调用检查<user_id>_new_message,并将前端的通知更新为previous unread notif count + 1。您可以每 20 分钟为所有用户批量更新数据库(如果需要)。

现在,进行实际更新。由于您的系统需要服务器和用户端之间的交互(例如向该人显示消息并能够回复它),因此 Redis 无法在此处为您提供帮助。您将需要像 websockets 这样的服务。您需要用户和 API 之间的交互来处理消息和好友请求。

于 2018-06-20T09:29:15.080 回答