構建比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 |
有關完整的基準測試,請參閱原始碼。
相關文章
- Go Protobuf(比xml小3-10倍, 快20-100倍)GoXML
- 比Redis快5倍的中介軟體,究竟為什麼這麼快?Redis
- 比Python快100倍,利用Cython實現高速NLP專案Python
- 比SpringBoot快10倍的Bootique框架Spring Boot框架
- 利用太赫茲助力超高速WiFi的研發,比現有技術快100倍WiFi
- 歡迎光臨Li-Fi的高速通訊世界比Wi-Fi快100倍
- 新無線通訊技術LiFi開始測試:比WiFi快100倍WiFi
- 使用Java和Redis構建高效能的快取系統JavaRedis快取
- 一個比 webpack 快10倍的打包工具Web
- 使用Netty構建一個帶註解的Http伺服器框架NettyHTTP伺服器框架
- redis快取架構概述Redis快取架構
- 初試redis,比memcached快10倍速Redis
- NEON彙編比純C程式碼快17倍!C程式
- redis 叢集構建Redis
- Django使用redis快取伺服器DjangoRedis快取伺服器
- fleet:構建速度提高了5倍的Rust構建工具。Rust
- 探討下如何更好的使用快取 —— Redis快取的特殊用法以及與本地快取一起構建多級快取的實現快取Redis
- 基於HAProxy的高效能HTTP快取伺服器和RESTful NoSQL快取伺服器HTTP快取伺服器RESTSQL
- 基於HAProxy的高效能HTTP快取伺服器和RESTful NoSQL快取伺服器。HTTP快取伺服器RESTSQL
- 比ls快8倍?百萬級檔案遍歷的奇技淫巧
- 億級流量客戶端快取之Http快取與本地快取對比客戶端快取HTTP
- Discord CTO 談如何構建500W併發使用者的Elixir應用
- 微服務基準測試:Chronicle Queue比Kafka快750倍?微服務Kafka
- 比Chrome快3倍!世界最快PC瀏覽器釋出Chrome瀏覽器
- 比 JSON.stringify 快兩倍的fast-json-stringifyJSONAST
- 一個比 UUID 快百倍的唯一 ID 生成器UI
- 用Redis構建分散式鎖Redis分散式
- 構建FTP伺服器FTP伺服器
- 對比Memcached和Redis,誰才是適合你的快取?Redis快取
- redis快的原因Redis
- httpteleport能提高10倍的Http流量HTTP
- [實戰驗證] http快取(無代理伺服器)HTTP快取伺服器
- Docker構建redis叢集環境DockerRedis
- 基於ubuntu映象構建redis映象UbuntuRedis
- 構建api gateway之 http路由實現APIGatewayHTTP路由
- angular學習筆記(二十七)-$http(5)-使用$http構建RESTful架構Angular筆記HTTPREST架構
- 構建前端mock伺服器前端Mock伺服器
- Ruby 3.0.0釋出:Ruby3將比Ruby2快3倍