怎麼使用高斯Redis實現二級索引
一、背景
提起索引,第一印象就是資料庫的名詞,但是,高斯Redis也可以實現二級索引! ! !高斯Redis中的二級索引一般利用zset來實現。高斯Redis相比開源Redis有著更高的穩定性、以及成本優勢,使用高斯Redis zset實現業務二級索引,可以獲得效能與成本的雙贏。
索引的本質就是利用有序結構來加速查詢,因而透過Zset結構高斯Redis可以輕鬆實現數值類型以及字元類型索引。
• 數值類型索引(zset依分數排序):
#• 字元類型索引(分數相同時zset依字典序排序):
#下面讓我們切入兩類經典業務場景,看看如何使用高斯Redis來構建穩定可靠的二級索引系統。
二、場景一:字典補全
當在瀏覽器中鍵入查詢時,瀏覽器通常會依照可能性推薦相同前綴的搜索,這種場景可以用高斯Redis二級索引功能實作。
2.1 基本方案
最簡單的方法是將使用者的每個查詢加入索引。如果需要提供使用者補全提示,可以使用ZRANGEBYLEX來進行範圍查詢。為了減少結果數量,使用LIMIT選項是高斯Redis支援的一種方法。
• 將使用者搜尋banana加入索引:
ZADD myindex 0 banana:1
• 假設使用者在搜尋表單中輸入“bit”,並且我們想要提供可能以“bit”開頭的搜尋關鍵字。
ZRANGEBYLEX myindex "[bit" "[bit\xff"
即使用ZRANGEBYLEX進行範圍查詢,查詢的區間為使用者現在輸入的字串,以及相同的字串加上一個尾隨位元組255(\xff)。我們可以使用這種方法來取得所有以使用者輸入的字串為前綴的字串。
2.2 與頻率相關的字典補全
在實際應用中,人們通常希望自動排序補全詞條,以適應出現頻率,並清除已不再流行的詞條,同時自適應未來的輸入。我們依然可以使用高斯Redis的ZSet結構來實現這一目標,只是在索引結構中,不僅需要儲存搜尋詞,還需要儲存與之關聯的頻率。
• 將使用者搜尋banana加入索引
• 判斷banana是否存在
ZRANGEBYLEX myindex "[banana:" + LIMIT 0 1
• 假設banana不存在,加上banana:1,其中1是頻率
ZADD myindex 0 banana:1
• 假設banana存在,需要遞增頻率
若ZRANGEBYLEX myindex "[banana:" LIMIT 0 1 中傳回的頻率為1
#1)刪除舊條目:
ZREM myindex 0 banana:1
2)頻率加一重新加入:
ZADD myindex 0 banana:2
請注意,由於可能存在並發更新,因此應透過Lua腳本發送上述三個命令,用Lua script自動獲得舊計數並增加分數後重新新增條目。
假如使用者在搜尋表單中輸入“banana”,我們希望提供相關的搜尋關鍵字。透過ZRANGEBYLEX獲得結果後按頻率排序。
ZRANGEBYLEX myindex "[banana:" + LIMIT 0 10 1) "banana:123" 2) "banaooo:1" 3) "banned user:49" 4) "banning:89"
• 使用流演算法清除不常用輸入。隨機選擇一個傳回的條目,並將其分數減一,然後將其與更新後的分數重新添加。但是,如果新分數為0,我們需從清單中刪除該條目。
• 若隨機挑選的條目頻率是1,如banaooo:1
ZREM myindex 0 banaooo:1
• 若隨機挑選的條目頻率大於1,如banana:123
ZREM myindex 0 banana:123 ZADD myindex 0 banana:122
從長遠來看,該索引會包含熱門搜索,如果熱門搜尋隨時間變化,它也會自動適應。
三、場景二:多維索引
高斯Redis不僅支援單一維度上的查詢,也能夠在多維資料中進行檢索。舉個例子,搜尋符合條件的人員:年齡介於50至55歲之間,且薪水在70000至85000之間。將二維資料編碼轉換為一維數據,然後利用高斯分佈的 Redis zset 存儲,是實現多維二級索引的重要方法。
從視覺化視角表示二維索引。在這個空間中,有一些資料樣本點被表示為座標(x,y),而這些座標中x和y兩個變數的最大值都為400。圖片中的藍色框代表我們的查詢。我們想要找出所有座標 x 位於50和100之間,y 位於100和300之間的點。
3.1 資料編碼
若插入資料點為x = 75和y = 200
1)填入0(資料最大為400,故填3位元)
x = 075
y = 200
2)交织数字,以x表示最左边的数字,以y表示最左边的数字,依此类推,以便创建一个编码
027050
若使用00和99替换最后两位,即027000 to 027099,map回x和y,即:
x = 70-79
y = 200-209
因此,针对x=70-79和y = 200-209的二维查询,可以通过编码map成027000 to 027099的一维查询,这可以通过高斯Redis的Zset结构轻松实现。
同理,我们可以针对后四/六/etc位数字进行相同操作,从而获得更大范围。
3)使用二进制
如果将数据表示为二进制,就可以获得更细的粒度,而在数字替换时,每次都将搜索范围扩大两倍。如果我们使用二进制表示法数字,每个变量最多需要9位(表示最多400个值),那么我们将得到:
x = 75 -> 001001011
y = 200 -> 011001000
交织后,000111000011001010
让我们看看在交错表示中用0s ad 1s替换最后的2、4、6、8,...位时我们的范围是什么:
3.2 添加新元素
若插入数据点为x = 75和y = 200
x = 75和y = 200二进制交织编码后为000111000011001010,
ZADD myindex 0 000111000011001010
3.3 查询
查询:x介于50和100之间,y介于100和300之间的所有点
从索引中替换N位会给我们边长为2^(N/2)的搜索框。因此,我们要做的是检查搜索框较小的尺寸,并检查与该数字最接近的2的幂,并不断切分剩余空间,随后用ZRANGEBYLEX进行搜索。
下面是示例代码:
def spacequery(x0,y0,x1,y1,exp) bits=exp*2 x_start = x0/(2**exp) x_end = x1/(2**exp) y_start = y0/(2**exp) y_end = y1/(2**exp) (x_start..x_end).each{|x| (y_start..y_end).each{|y| x_range_start = x*(2**exp) x_range_end = x_range_start | ((2**exp)-1) y_range_start = y*(2**exp) y_range_end = y_range_start | ((2**exp)-1) puts "#{x},#{y} x from #{x_range_start} to #{x_range_end}, y from #{y_range_start} to #{y_range_end}" # Turn it into interleaved form for ZRANGEBYLEX query. # We assume we need 9 bits for each integer, so the final # interleaved representation will be 18 bits. xbin = x_range_start.to_s(2).rjust(9,'0') ybin = y_range_start.to_s(2).rjust(9,'0') s = xbin.split("").zip(ybin.split("")).flatten.compact.join("") # Now that we have the start of the range, calculate the end # by replacing the specified number of bits from 0 to 1. e = s[0..-(bits+1)]+("1"*bits) puts "ZRANGEBYLEX myindex [#{s} [#{e}" } } end spacequery(50,100,100,300,6)
以上是怎麼使用高斯Redis實現二級索引的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。
