學習筆記之車票搜索為什么用Redis而不是ES?

在文章正式開始前,大家打開 12306.cn 搜索一趟列車,根據搜索條件判斷,數據搜索技術使用 ElasticSearch 或者其它搜索技術是否合適?

這里我先把答案說下,12306 車票搜索用的是 Redis ,而不是大家常用的 ElasticSearch。至于為什么?大家可以先思考下再繼續閱讀。

12306 列車搜索條件

先來一張 12306 列車檢索的截圖,讓大家看下 12306 都有哪些搜索條件。

搜索條件如下:

  • 單程或者往返
  • 出發地
  • 目的地
  • 出發日或者返程日
  • 普通或者學生
  • 車次類型
  • 出發車站
  • 到達車站
  • 車次席別
  • 發車時間
  • 顯示積分兌換車次
  • 顯示全部可預訂車次

許多同學都感到疑惑,因為搜索條件實在太多了,這似乎會嚴重影響數據庫的性能。有些人甚至認為,如果性能不佳,至少應該使用 Elasticsearch 等搜索引擎來處理。這也是我一開始的想法,與大多數同學一致。

然而,隨著進一步的思考,我發現了一個有意思的頁面交互,這改變了我的看法。跟著馬哥的思路,一起來深入探討一下。

數據搜索框架

1. 搜索中間件 ElasticSearch

ElasticSearch 是一款非常強大的、基于 Lucene 的開源搜索及分析引擎;它是一個實時的分布式搜索分析引擎,它能讓你以前所未有的速度和規模,去探索你的數據。

許多年前,一個剛結婚的名叫 Shay Banon 的失業開發者,跟著他的妻子去了倫敦,他的妻子在那里學習廚師。 在尋找一個賺錢的工作的時候,為了給他的妻子做一個食譜搜索引擎,他開始使用 Lucene 的一個早期版本。

直接使用 Lucene 是很難的,因此 Shay 開始做一個抽象層,Java 開發者使用它可以很簡單的給他們的程序添加搜索功能。 他發布了他的第一個開源項目 Compass。

后來 Shay 獲得了一份工作,主要是高性能,分布式環境下的內存數據網格。這個對于高性能,實時,分布式搜索引擎的需求尤為突出, 他決定重寫 Compass,把它變為一個獨立的服務并取名 Elasticsearch。

第一個公開版本在2010年2月發布,從此以后,Elasticsearch 已經成為了 Github 上最活躍的項目之一,他擁有超過 300 名 contributors。 一家公司已經開始圍繞 Elasticsearch 提供商業服務,并開發新的特性,但是,Elasticsearch 將永遠開源并對所有人可用。

據說,Shay 的妻子還在等著她的食譜搜索引擎…

?

Elasticsearch 提供了一個強大而靈活的搜索和分析引擎,適用于各種應用場景,包括日志分析、電子商務搜索、實時監控等。它具有高性能、可擴展性和可用性,能夠處理大規模數據,并提供豐富的搜索、分析和可視化功能,幫助用戶從數據中獲取有價值的信息。

根據大家對 Elasticsearch 的了解,以及對 12306 復雜搜索條件的背景,肯定是 Elasticsearch 更適合實現改數據檢索的功能。不急,咱們繼續往下看。

2. 緩存中間件 Redis

Redis(Remote Dictionary Server)是一個開源的內存數據結構存儲系統,被廣泛應用于緩存、消息隊列、實時數據分析、排行榜等場景。它提供了以下主要功能:

  1. 內存緩存:Redis 將數據存儲在內存中,以實現高速的讀寫操作。作為緩存系統,它可以顯著提升應用程序的性能,減少對后端存儲系統的訪問壓力。
  2. 鍵值存儲:Redis 是一個鍵值存儲系統,其中的數據是以鍵值對的形式進行存儲和訪問。這使得 Redis 非常適合存儲簡單的數據結構,如字符串、哈希表、列表、集合和有序集合。
  3. 發布/訂閱:Redis 支持發布/訂閱模式,允許多個客戶端通過訂閱頻道來接收消息,同時可以通過發布消息來向訂閱者廣播消息。這使得 Redis 可以用作消息隊列、實時通知等場景。
  4. 數據持久化:Redis支持將內存中的數據持久化到硬盤中,以便在重啟后恢復數據。它提供了兩種持久化方式:RDB(Redis Database)快照和 AOF(Append-Only File)日志。
  5. 分布式:Redis 提供了一些分布式特性,如主從復制、集群等。主從復制可以實現數據的熱備份和讀寫分離,在主節點寫入數據后,數據會自動同步到從節點。集群模式可以將數據分布在多個節點上,提供更高的容量和吞吐量。
  6. 事務支持:Redis 支持事務操作,可以將一系列操作組合成一個原子操作進行提交。通過事務,可以確保多個操作在執行過程中不會被其他客戶端中斷。
  7. Lua 腳本:Redis 支持使用 Lua 腳本執行復雜的操作。通過編寫腳本,可以減少與 Redis 之間的網絡通信次數,提高性能。

大家對 Redis 熟知的一些概念就是 Redis 非常快,那快是如何體現以及原理是什么?

  1. 數據存儲在內存中: Redis 將數據存儲在內存中,這使得數據的讀取和寫入非常快。內存的隨機訪問速度遠遠快于磁盤上的存儲,因此 Redis 能夠在極短的時間內響應讀寫請求。
  2. 單線程模型: Redis 采用單線程模型,這意味著在任何給定時刻只有一個線程處理請求。盡管它是單線程的,但通過使用非阻塞I/O和事件循環,它能夠處理大量并發請求而不需要消耗大量的 CPU 開銷。這減少了上下文切換和鎖競爭,提高了性能。
  3. 精心優化的數據結構: Redis 支持多種數據結構,如字符串、哈希表、列表、集合、有序集合等,每種數據結構都經過高度優化,以提供高性能的操作。例如,Redis的有序集合允許你快速進行范圍查詢和排名操作。
  4. 高度優化的網絡協議: Redis 使用高度優化的協議進行與客戶端的通信,如 RESP(REdis Serialization Protocol)。這個協議非常輕量,減少了網絡通信的開銷,從而提高了性能。

為什么使用 Redis

考慮使用 Redis 和 Elasticsearch 兩個技術都是有一定道理的,它們分別有自己的優勢和適用場景。

作為承受請求最多的列車搜索功能,需要同時兼容實時性、并發性以及部署成本幾大要點。為此,我梳理了為什么必須用 Redis 的幾個原因。

1. 實時性能

  • 內存存儲: Redis 將數據存儲在內存中,因此具有極低的讀取延遲,可以快速響應實時查詢請求。這對于需要即時更新的列車數據非常重要。
  • 單線程模型: Redis 使用單線程模型,雖然是單線程的,但通過非阻塞 I/O 和事件循環,它可以處理大量并發請求,減少了上下文切換和鎖競爭,提高了實時性。

2. 并發性能

  • 多客戶端支持: Redis 支持多個客戶端并發連接,每個客戶端可以獨立地執行讀取和寫入操作,這使得它在處理高并發請求時表現出色。
  • 原子性操作: Redis 提供了原子性操作,如原子增減和原子加鎖,這些操作可以在多線程或多進程環境下安全使用,有助于處理并發操作。

3. 部署成本

  • 輕量級: Redis 是一款輕量級的數據庫,易于部署和維護。它的內存占用相對較低,可以在相對較小的硬件配置上運行,從而減少了部署成本。
  • 容易擴展: Redis 集群模式允許你將數據分布在多個節點上,以增加吞吐量和可伸縮性,而且這一擴展性是相對容易實現的。

公司實際用過 ElasticSearch 集群的同學應該知道,這玩意就是個性能深淵,非常消耗資源,懂得都懂。

4. 搜索條件拆解

到這里,許多人可能會有疑問,面對如此多的搜索條件,難道不應該使用 Elasticsearch 嗎?然而,這正是要強調為什么選擇 Redis 的關鍵原因。

您是否注意到了這張圖的一個關鍵點?它只允許選擇一天的出發日期。深思熟慮一下。

如果只能選擇一天,那我們是不是可以這么來設計 Redis 緩存存儲 12306 列車查詢數據。

也許有些人會問,這么多的查詢條件怎么處理呢?你可以親自在12306網站上嘗試,雖然頁面上有很多查詢條件,但大多數條件都是由前端進行篩選,實際上并沒有觸發后端的請求。

?

文末總結

12306列車數據搜索具有多個搜索條件,包括單程/往返、出發地、目的地、出發日期/返程日期、乘客類型、車次類型、出發車站、到達車站、車次席別、發車時間、顯示積分兌換車次以及顯示全部可預訂車次等。這些條件使搜索功能變得復雜,但在實際使用中,大部分條件是前端篩選,而不是每個條件都會發起后端請求。

在這種情況下,Redis作為列車數據的緩存存儲是有道理的,原因如下:

  1. 實時性: Redis 以內存為基礎,具有極低的讀取延遲,可以快速響應實時查詢請求,這對于需要即時更新的列車數據非常重要。單程或往返、出發日期等條件可以通過快速的 Redis 查詢來滿足。
  2. 緩存: Redis 是一個出色的緩存數據庫,可以用于緩存熱門的列車路線和查詢結果,從而減輕后端數據庫的負載。對于需要被查詢的路線,可以將其結果緩存在 Redis 中,以提高響應速度。
  3. 簡單性: Redis 的數據模型相對簡單,適合存儲簡單的鍵值對或一些常規數據結構。這使得 Redis 適合存儲一些搜索條件,如出發地、目的地、車次類型等,以便快速篩選結果。
  4. 部署成本: Redis 是一款輕量級的數據庫,易于部署和維護。它的內存占用相對較低,可以在相對較小的硬件配置上運行,從而減少了部署成本。
  5. 只需后端查詢一次: 在實際操作中,頁面上的搜索條件大多是前端篩選,而只有在點擊查詢按鈕時才會發起后端請求。因此,Redis 可以用于快速存儲和檢索列車數據,而 Elasticsearch 等搜索引擎可以在需要進行全文搜索或復雜查詢時使用。

總的來說,Redis 作為列車數據的緩存存儲在實時性、并發性和部署成本方面具有一些優勢,尤其適用于快速檢索和緩存常用路線數據。然而,對于復雜的全文搜索和高級查詢需求,可以考慮將 Redis 與 Elasticsearch 等搜索引擎結合使用,以充分發揮它們各自的優勢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72191.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72191.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72191.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

揭秘AI:機器學習與深度學習的奧秘

文章目錄 機器學習與深度學習1. 什么是人工智能?2. 機器學習、深度學習和人工智能又是什么關系?3. 人工智能解決了什么問題?為什么需要人工智能?4. 機器學習、深度學習常用術語1)模型2)數據集3)…

【具體場景實踐】使用存儲過程查數據全流程+自動調度

文章目錄 場景設計場景描述:公司員工管理系統需求1. 創建數據庫和表2. 插入測試數據3. 復雜存儲過程4. 調用存儲過程5. 結果示例6. 細節優化存儲過程總結7. 自動定期執行存儲過程7.1 啟用 MySQL 事件調度器7.2 創建定時任務(每天凌晨 2 點自動執行)7.3 查看和管理事件1?? …

【ubuntu】——wsl中使用windows中的adb

一、引言 在 Windows Subsystem for Linux(WSL)環境下工作時,有時需要使用 Android Debug Bridge(ADB)工具與 Android 設備進行交互。通過特定設置,能夠在 WSL 中便捷地調用 Windows 系統中已安裝的 ADB&a…

Centos離線安裝gcc

文章目錄 Centos離線安裝gcc1. gcc是什么?2. gcc下載地址3. gcc的安裝4. 安裝結果驗證 Centos離線安裝gcc 1. gcc是什么? GCC(GNU Compiler Collection)是 GNU 項目下的開源編譯器套件,主要用于將 C、C 等編程語言的源…

JAVA中的多態性以及它在實際編程中的作用

JAVA中的多態性以及它在實際編程中的作用? 在Java中,多態性是指一個對象可以具有多種形態。它主要體現在兩個方面:編譯時多態和運行時多態。 1.編譯時多態 編譯時多態通過方法重載(Overloading)來實現。方法重載是指…

NetLink內核套接字案例分析

一、基礎知識 Netlink 是 Linux 系統中一種內核與用戶空間通信的高效機制,而 Netlink 消息是這種通信的核心載體。它允許用戶態程序(如網絡配置工具、監控工具)與內核子系統(如網絡協議棧、設備驅動)交換數據&#xff…

批量壓縮與優化 Excel 文檔,減少 Excel 文檔大小

當我們在 Excel 文檔中插入圖片資源的時候,如果我們插入的是原圖,可能會導致 Excel 變得非常的大。這非常不利于我們傳輸或者共享。那么當我們的 Excel 文件非常大的時候,我們就需要對文檔做一些壓縮或者優化的處理。那有沒有什么方法可以實現…

基于深度學習的多模態人臉情緒識別研究與實現(視頻+圖像+語音)

這是一個結合圖像和音頻的情緒識別系統,從架構、數據準備、模型實現、訓練等。包括數據收集、預處理、模型訓練、融合方法、部署優化等全流程。確定完整系統的組成部分:數據收集與處理、模型設計與訓練、多模態融合、系統集成、部署優化、用戶界面等。詳…

保姆級離線TiDB V8+解釋

以前學習的時候還是3版本,如今已經是8版本了 https://cn.pingcap.com/product-community/?_gl1ujh2l9_gcl_auMTI3MTI3NTM3NC4xNzM5MjU3ODE2_gaMTYwNzE2NTI4OC4xNzMzOTA1MjUz_ga_3JVXJ41175MTc0MTk1NTc1OC4xMS4xLjE3NDE5NTU3NjIuNTYuMC41NDk4MTMxNTM._ga_CPG2VW1Y4…

spark實驗2

一.實驗題目 實驗所需要求: centos7虛擬機 pyspark spark python3 hadoop分布式 統計歷屆春晚的節目數目 統計各個類型節目的數量,顯示前10名 統計相聲類節目歷年的數目。 查詢每個演員在春晚上表演節目的數量。 統計每年各類節目的數量&#xff0…

學習文章:Spring Boot 中如何使用 `@Async` 實現異步處理

文章目錄 學習文章:Spring Boot 中如何使用 Async 實現異步處理 一、什么是 Async?優點: 二、Spring Boot 中啟用 Async1. 啟用異步支持2. 配置線程池(可選)3. 使用 Async 注解4. 調用異步方法 三、Async 的進階用法1.…

Manus:成為AI Agent領域的標桿

一、引言 官網:Manus 隨著人工智能技術的飛速發展,AI Agent(智能體)作為人工智能領域的重要分支,正逐漸從概念走向現實,并在各行各業展現出巨大的應用潛力。在眾多AI Agent產品中,Manus以其獨…

Git Fast-forward 合并詳解:原理、場景與最佳實踐

在使用 Git 進行團隊協作時,我們經常需要合并分支。合并方式有很多種,其中 Fast-forward(快速合并) 是一種最簡單且無沖突的合并方式。本文將詳細介紹 Fast-forward 的原理、適用場景、常見問題及最佳實踐。 一、Fast-forward 合并…

命令行重啟Ubuntu軟件

我是用Todesk遠程桌面,如果卡死的時候,只能通過ssh連接命令行。于是,就有了如標題所示的需求。 首先,我們看一下todesk在系統里叫什么名字: systemctl list-unit-files | grep -i todesk看到發現是"todeskd.serv…

算法每日一練 (11)

💢歡迎來到張胤塵的技術站 💥技術如江河,匯聚眾志成。代碼似星辰,照亮行征程。開源精神長,傳承永不忘。攜手共前行,未來更輝煌💥 文章目錄 算法每日一練 (11)全排列題目描述解題思路解題代碼c/c…

《Spring日志整合與注入技術:從入門到精通》

1.Spring與日志框架的整合 1.Spring與日志框架進行整合,日志框架就可以在控制臺中,輸出Spring框架運行過程中的一些重要的信息。 好處:方便了解Spring框架的運行過程,利于程序的調試。 Spring如何整合日志框架 Spring5.x整合log4j…

《SQL性能優化指南:新手如何寫出高效的數據庫查詢

新手程序員如何用三個月成為SQL高手?萬字自學指南帶你彎道超車 在數據為王的時代,掌握SQL已成為職場新人的必修課。你可能不知道,僅用三個月系統學習,一個零基礎的小白就能完成從數據庫萌新到SQL達人的蛻變。去年剛畢業的小王就是…

【Unity】在項目中使用VisualScripting

1. 在packagemanager添加插件 2. 在設置中進行初始化。 Edit > Project Settings > Visual Scripting Initialize Visual Scripting You must select Initialize Visual Scripting the first time you use Visual Scripting in a project. Initialize Visual Scripting …

JConsole 在 Linux 上的使用

JConsole 在 Linux 上的使用指南 1. 啟動 JConsole 遠程監控 Linux 服務器上的 JVM 進程 1.1 修改 JMX 配置&#xff0c;允許遠程訪問 在 Linux 服務器 啟動 Java 應用時&#xff0c;需要加上 -Djava.rmi.server.hostname<服務器IP>&#xff0c;完整的啟動參數如下&am…

個人記錄,Unity資源解壓和管理插件

就是經典的兩個AssetStudio 和 Ripper 沒有什么干貨&#xff0c;就是記錄一下&#xff0c;內容沒有很詳細 AssetStudio 說錯了&#xff0c;AssetStudio比較出名&#xff08;曾經&#xff09;&#xff0c;但好像墮落了 是&#xff0c;AssetBundlExtractor 這個工具有個好處就…