構建比HTTP快100倍的Elixir Redis 伺服器 - statetrace
執行 Redis 協議比依賴 HTTP 快 100 倍以上。在大約 10 分鐘內編寫了一個基於 Redis 協議的高效能伺服器。該伺服器可以輕鬆處理數千個連線,並且開銷最小。一個缺點是,在使用 HTTP 以外的協議進行多節點部署時,負載平衡變得更加困難。
如果您有一個或數千個客戶端需要以最快的方式與伺服器通訊,請考慮使用 Redis 作為您的首選協議,而不是 HTTP。
構建基於 RESP(Redis 協議)的伺服器意味著您正在削減與 HTTP 相關的大量開銷。除了更精簡的協議之外,幾乎每種語言都有一個為 Redis 構建的高效能客戶端,允許流水線操作。流水線在您傳送命令時組合命令,以提高效率。大多數 redis 客戶端甚至支援池化以在高併發下工作。
使用這些內建功能,您無需做太多事情就可以以極高的效能方式與伺服器通訊。
完整示例:
defmodule MyRedisServer.Redis do require Logger def accept(port) do {:ok, socket} = :gen_tcp.listen(port, [:binary, active: false, reuseaddr: true]) Logger.info("Accepting connections on port #{port}") loop_acceptor(socket) end defp loop_acceptor(socket) do {:ok, client} = :gen_tcp.accept(socket) {:ok, pid} = Task.start(fn -> serve(client, %{continuation: nil}) end) :ok = :gen_tcp.controlling_process(client, pid) loop_acceptor(socket) end defp serve(socket, %{continuation: nil}) do case :gen_tcp.recv(socket, 0) do {:ok, data} -> handle_parse(socket, Redix.Protocol.parse(data)) {:error, :closed} -> :ok end end defp serve(socket, %{continuation: fun}) do case :gen_tcp.recv(socket, 0) do {:ok, data} -> handle_parse(socket, fun.(data)) {:error, :closed} -> :ok end end defp handle_parse(socket, {:continuation, fun}) do serve(socket, %{continuation: fun}) end defp handle_parse(socket, {:ok, req, left_over}) do resp = handle(req) :gen_tcp.send(socket, Redix.Protocol.pack(resp)) case left_over do "" -> serve(socket, %{continuation: nil}) _ -> handle_parse(socket, Redix.Protocol.parse(left_over)) end end def handle(data) do data end end |
有關完整的基準測試,請參閱原始碼。
相關文章
- 使用Java和Redis構建高效能的快取系統JavaRedis快取
- 使用Netty構建一個帶註解的Http伺服器框架NettyHTTP伺服器框架
- redis 叢集構建Redis
- Discord CTO 談如何構建500W併發使用者的Elixir應用
- 基於HAProxy的高效能HTTP快取伺服器和RESTful NoSQL快取伺服器HTTP快取伺服器RESTSQL
- 基於HAProxy的高效能HTTP快取伺服器和RESTful NoSQL快取伺服器。HTTP快取伺服器RESTSQL
- 億級流量客戶端快取之Http快取與本地快取對比客戶端快取HTTP
- 探討下如何更好的使用快取 —— Redis快取的特殊用法以及與本地快取一起構建多級快取的實現快取Redis
- 比Redis快5倍的中介軟體,究竟為什麼這麼快?Redis
- 對比Memcached和Redis,誰才是適合你的快取?Redis快取
- 構建FTP伺服器FTP伺服器
- 構建api gateway之 http路由實現APIGatewayHTTP路由
- [實戰驗證] http快取(無代理伺服器)HTTP快取伺服器
- redis快的原因Redis
- [elixir! #0078] elixir 版本升級的歷程(1.11 -> 1.12)
- Docker構建redis叢集環境DockerRedis
- 基於ubuntu映象構建redis映象UbuntuRedis
- 構建前端mock伺服器前端Mock伺服器
- HTTP快取HTTP快取
- 基於Redis構建微服務的反應式架構 - bitsrcRedis微服務架構
- Redis 6.0 客戶端快取的伺服器端實現Redis客戶端快取伺服器
- HTTP 快取中的 VaryHTTP快取
- 淺聊HTTP快取 (HTTP Cache)HTTP快取
- HTTP----HTTP快取機制HTTP快取
- Redis 為何這麼快?聊聊它的資料結構~Redis資料結構
- redis5.* 手動構建叢集Redis
- Python 之構建代理伺服器Python伺服器
- 圖解 HTTP 的快取機制 | 實用 HTTP圖解HTTP快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- 二、雲伺服器環境的構建+Jenkins伺服器Jenkins
- Redis快取雪崩、快取穿透、快取擊穿對比看這一篇就夠了Redis快取穿透
- 初探Http快取?HTTP快取
- HTTP - 快取策略HTTP快取
- 前端 http 快取前端HTTP快取
- http快取梳理HTTP快取
- HTTP 快取的那些事兒HTTP快取
- NuSTER: HTTP 協議,面向使用者, RESTful 的 NoSQL 快取伺服器HTTP協議RESTSQL快取伺服器
- Netty系列文章之構建HTTP(HTTPS)應用程式NettyHTTP