【问题标题】:Push notification to change someone else's memcache/session data推送通知以更改其他人的内存缓存/会话数据
【发布时间】:2013-01-21 21:37:59
【问题描述】:

我想知道处理我的网站用户将相互发送的 cmets 推送通知的最佳方式。

当提交新评论时,它显然会存储在我的数据库中。但是,我还想将每个用户的 cmets 存储在 memcache 中或作为会话数据(什么被认为是最好的?),这样每次用户访问我的网站/刷新页面时,他们都可以快速获得未读通知而不会点击我的数据库。

我想到的一种方法是在用户收到推送通知时,将 AJAX 请求发送回服务器以更新他们的内存缓存/会话数据。

问题是如果用户未登录或当前未使用该站点,该怎么办。即使用户不在那里“接收”它,AJAX 请求是否仍会被发送?还是 AJAX 请求会“等待”并在用户重新访问该站点时立即发生?首先以这种方式处理通知是否是个好主意?

【问题讨论】:

  • 查看 Redis。 redis.io Havent 自己实现了它,但听起来像你要找的。​​span>
  • @cgatian,谢谢,我只是在看那个,尽管在这种情况下尚不清楚为什么 Redis 与 Memcached 相比。另外,我是一个人操作,我花了很多时间来实现我目前所做的事情,将 Redis 添加到组合中似乎令人生畏,你知道它的易用性吗?
  • 在此处查看 Redis 通过 Memcached 提供什么的答案:stackoverflow.com/questions/10558465/memcache-vs-redis
  • 感谢@ErikNedwidek,现在我已经考虑了更多,看来切换技术并不能真正解决这个问题。我的问题更多关于如果用户不在那里接收推送通知如何处理。推送通知是否只是“等待”直到用户出现或者如果用户不在那里接收它就会丢失?
  • 看我的回答。没有真正的方法可以使用 AJAX 进行推送通知。在 AJAX 中,它们始终是客户端轮询。如果用户不在您的网站上,则没有客户端进行轮询。

标签: php codeigniter session memcached push-notification


【解决方案1】:

您希望保持 PHP 会话较小。将大量数据塞入其中会导致性能下降。我不会将它们用于此目的。我最常用的就是存储他们上次检查 cmets 的时间。

您也不是在做推送通知,而是在使用客户端轮询。您可以使用 Websockets 进行推送通知,但不能使用 AJAX(您可以使用长轮询来伪造它)。除非您的用户已登录并打开浏览器访问您的站点,否则不会运行任何 Javascript 来启动 AJAX 调用以检查 cmets。

Websockets 或长轮询要求您使用 Apache 的辅助服务器。它们会占用您在 Apache 中的可用连接。

我假设您希望 cmets 具有持久性,因此请记住“忘记”是 Memcached 的一个功能。 Redis 可以设置为持久化数据。如果您使用 memcached 作为性能提升,您需要确定数据完整性是否重要(删除通知是可以的),或者您是否需要设计一些健壮性以便他们总能收到通知。

希望这会有所帮助。

【讨论】:

  • 嗨,Erik,我正在使用 websockets 进行推送通知。我的问题是如果用户不在那里接收推送通知,客户端如何处理它。我所说的 AJAX 请求将由客户端发送,以响应收到推送通知。
  • 使用 websocket,当浏览器窗口或选项卡关闭或以任何方式导航时,websocket 将关闭。现在,如果他们正在重新加载当前页面或转到您网站上将重新打开 websocket 的另一个页面,您可以将任何新通知推送到该管道。如果他们不在网站上,您将无法进行推送。
猜你喜欢
  • 2018-06-26
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多