Redis構建自動補全功能案例

2021-10-07 04:15:08 字數 2598 閱讀 3797

方法二方法一通過使用聯絡人列表來記錄使用者最近聯絡過的100個人,並嘗試盡可能減少實現自動補全所需的記憶體。

方法二自動補全則為更大的聯絡人列表提供了更好的效能和可擴充套件性,但是所花費的記憶體較多一點。

場景:模擬使用者在客戶端輸入聊天物件時,會自動補全顯示使用者已經輸入過的聊天物件名稱。redis主要用於記錄聯絡人列表,而非實際地執行自動補全操作。

因為伺服器上數百萬使用者都需要乙個屬於自己的聯絡人列表來儲存最近聯絡過的100人,所以我們需要快速向列表裡面新增使用者或者刪除使用者的前提下,盡可能的減少儲存這些聯絡人列表帶來的記憶體消耗。自動補全操作將放在伺服器裡面處理。

更新使用者最近聯絡人

實現該功能通常需要執行3個步驟:

如果指定的聯絡人已經存在於最近聯絡人列表裡面,那麼移除他。

將指定聯絡人新增到最近的聯絡人列表最前面

如果新增完成後,最近聯絡人列表數量超過了100個,那麼將對列表進行修剪,只保留位於前面100最新聯絡人。

以上3個操作可以依次執行redis 的lremlpushltrim命令

/**

* 更新使用者輸入最近聯絡人

* @param name 姓名

* @param input 輸入聯絡人

*/public

void

updatelink

(string name, string input)

自動補全聯絡人

獲取該使用者的最近所有聯絡人,在伺服器裡面進行匹配,最後返回匹配成功的資料給客戶端。

/**

* 根據字首獲取使用者聯絡人

* @param name 姓名

* @param prefix 輸入聯絡人

*/public string showrecent

(string name, string prefix)

}return jsonobject.

tojsonstring

(result);}

// 模糊匹配

private

boolean

containsprefix

(string match, string target)

for(

int i =

0; i < match.

length()

; i++)}

return

true

;}

刪除最近聯絡人

使用者除了能檢視到最近的聯絡人外,還可以刪除聯絡人記錄。

/**

* 使用者刪除指定聯絡人

* @param name 姓名

* @param input 輸入聯絡人

*/public

void

delete

(string name, string input)

相較於方法一的自動補全,對於比較短的列表來講,這種做法還算可行的,但是對於非常長的聯絡人列表來說,為了獲取幾個所需元素而查詢成千上萬個元素是一種非常浪費資源的做法。

模擬場景:有乙個郵件傳送功能,針對單位使用者發起郵件,會自動補全滿足條件的單位使用者。補全物件範圍,當前單位下的所有員工。

注意:使用者名稱都為英文本母(可以根據思路擴充套件至其他型別名稱)

實現步驟

使用有序集合來儲存通訊錄,再把有序集合的分值設為0(成員分值都相同時,有序集合會將根據成員的名字進行排序)。

將輸入的字首使用起始元素結束元素進行有序集合定位,獲取查詢範圍。

取出範圍後,將2個標識元素進行刪除,為了避免滋擾使用者,程式最多隻取出10個元素。

為了防止多個使用者補全相似範圍的資料,將多個相同的起始元素和結束元素重複新增至有序集合裡面,或者錯誤的刪除了其他自動補全的標識位置元素,所以程式將在起始元素與結束元素的後面加乙個唯一標識uuid,防止勿刪。

步驟二解析

如查詢abc字首的單詞,實際上是查詢abzz … abd之間的字串,可以使用zrange方法呼叫取得。因為我們不知道該兩個元素的具體排名,所以需要構建開始與結束的兩個元素,根據這兩個元素排名來獲取abc字首的單詞。

;}最終實現

public set

autocompleteonprefix

(string unit, string prefix)})

;if(res != null)

}// 過濾識別符號

items.

removeif

(s -

> s.

indexof

('

以上兩種實現方法都可以自行測試,或者給原始檔自行嘗試。

提取碼:j57u

vim自動補全功能

本文 vi7.0版本自帶了自動補全功能omni completion。那麼vim是如何找到匹配的單詞的呢?在預設的情況下,vim在查詢乙個單詞時是按照如下的步驟 1 在當前檔案中進行查詢 2 在其他視窗中進行查詢 3 在其他的已裝入的緩衝區中進行查詢 4 在沒有裝入緩衝區的檔案中進行查詢 5 在當前...

vim 自動補全功能

大家都發現寫 的時候,有時候為了是變數名承載更多的資訊,可能名字會比較長,再次要使用變數名的時候,發現好像記不住了,記得以前vc 6.0的時候,可以使用乙個 工具,外號 番茄 如果是在vs這樣的環境中,自帶這樣的自動提示,vi vim這樣的環境 比較麻煩,原來有招的,今天才發現,在vim的輸入狀態下...

linux 自動補全功能增強

在 rhel7 centos7 以前的版本中,bash 自動補全功能僅限於命令和檔名,然而網路裝置往往可以自動補全命令的引數,常常讓搞網路出身的工程師唏噓不已。在新出的 rhel7 centos7 中的 bash 已經可以自動補全命令引數了,需要注意的是 rhel7 centos7 的預設安裝型別是...