是这样的,我要操作一个智能灯泡,目前是这样做的,我在网页上操作,然后把数据通过http提交存到数据库,有一个客户端发起一个socket连接,连接到服务端,服务端是死循环地从数据库里面取出数据给客户端,每次操作后休眠一下,如果客户端很多,比如10万,我每秒就要查询数据库10W次,所以想改进,服务端收到http数据后,就立马给客户端,不需要存数据库了。
认证高级PHP讲师
try yi try “websocket”另外,不建议每次查询都操作数据库。你可以读出来放到cache里,每次查询直接从cache里读。 然后另外一个进程监控到该值发生变化以后,修改数据库的同时,更新一下cache。
可以考虑内存数据库redis,然后定时持久化,即存盘。
客户端很多,为什么要读10w次?客户端和服务器长连,服务端内存中保存一个映射:
map[client_id] = socket_fd
http提交存到数据库,服务端死循环读取数据库信息,如果是发给某一个客户端的,消息中应该包含客户端的client_id,从map中找到socket_fd,消息发送出去就好了,如果是广播到所有客户端,遍历map发送也就可以了。读多少次数据库,只和消息数量有关系,和多少个客户端没关系吧。
上面说的数据库,完全可以采用redis或者nsq之类的消息队列实现,服务端开多个线程或者协程并发处理就好了,如果部入库,直接拿到数据send出去,如果你的服务端crash,数据不就丢了?可靠性没法保证。
try yi try “websocket”
另外,不建议每次查询都操作数据库。你可以读出来放到cache里,每次查询直接从cache里读。 然后另外一个进程监控到该值发生变化以后,修改数据库的同时,更新一下cache。
可以考虑内存数据库redis,然后定时持久化,即存盘。
客户端很多,为什么要读10w次?客户端和服务器长连,服务端内存中保存一个映射:
http提交存到数据库,服务端死循环读取数据库信息,如果是发给某一个客户端的,消息中应该包含客户端的client_id,从map中找到socket_fd,消息发送出去就好了,如果是广播到所有客户端,遍历map发送也就可以了。读多少次数据库,只和消息数量有关系,和多少个客户端没关系吧。
上面说的数据库,完全可以采用redis或者nsq之类的消息队列实现,服务端开多个线程或者协程并发处理就好了,如果部入库,直接拿到数据send出去,如果你的服务端crash,数据不就丢了?可靠性没法保证。