中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用高斯Redis實現二級索引

發布時間:2022-07-13 14:23:25 來源:億速云 閱讀:175 作者:iii 欄目:開發技術

這篇“怎么使用高斯Redis實現二級索引”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么使用高斯Redis實現二級索引”文章吧。

一、背景

提起索引,第一印象就是數據庫的名詞,但是,高斯Redis也可以實現二級索引!!!高斯Redis中的二級索引一般利用zset來實現。高斯Redis相比開源Redis有著更高的穩定性、以及成本優勢,使用高斯Redis zset實現業務二級索引,可以獲得性能與成本的雙贏。

索引的本質就是利用有序結構來加速查詢,因而通過Zset結構高斯Redis可以輕松實現數值類型以及字符類型索引。

• 數值類型索引(zset按分數排序):

怎么使用高斯Redis實現二級索引

怎么使用高斯Redis實現二級索引

• 字符類型索引(分數相同時zset按字典序排序):

怎么使用高斯Redis實現二級索引

怎么使用高斯Redis實現二級索引

下面讓我們切入兩類經典業務場景,看看如何使用高斯Redis來構建穩定可靠的二級索引系統。

二、場景一:詞典補全

當在瀏覽器中鍵入查詢時,瀏覽器通常會按照可能性推薦相同前綴的搜索,這種場景可以用高斯Redis二級索引功能實現。

怎么使用高斯Redis實現二級索引

2.1 基本方案

最簡單的方法是將用戶的每個查詢添加到索引中。當需要進行用戶輸入補全推薦時,使用ZRANGEBYLEX執行范圍查詢即可。如果不希望返回太多條目,高斯Redis還支持使用LIMIT選項來減少結果數量。

• 將用戶搜索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"

• 使用流算法清除不常用輸入。從返回的條目中隨機選擇一個條目,將其分數減1,然后將其與新分數重新添加。但是,如果新分數為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是兩個變量,其最大值均為400。圖片中的藍色框代表我們的查詢。我們希望查詢x介于50和100之間,y介于100和300之間的所有點。

怎么使用高斯Redis實現二級索引

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結構輕松實現。

怎么使用高斯Redis實現二級索引

同理,我們可以針對后四/六/etc位數字進行相同操作,從而獲得更大范圍。

3)使用二進制

為獲得更細的粒度,可以將數據用二進制表示,這樣在替換數字時,每次會得到比原來大二倍的搜索范圍。假設我們每個變量僅需要9位(以表示最多400個值的數字),我們采用二進制形式的數字將是:

x = 75 -> 001001011

y = 200 -> 011001000

交織后,000111000011001010

讓我們看看在交錯表示中用0s ad 1s替換最后的2、4、6、8,...位時我們的范圍是什么:

怎么使用高斯Redis實現二級索引

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實現二級索引”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

化隆| 平乐县| 九寨沟县| 垣曲县| 社旗县| 南召县| 荥阳市| 浏阳市| 阜宁县| 牙克石市| 大同县| 容城县| 堆龙德庆县| 左权县| 和政县| 保康县| 砚山县| 扶余县| 东宁县| 黔西县| 蒙城县| 天峨县| 广南县| 新宾| 娄烦县| 香河县| 长宁区| 浦城县| 苍南县| 青浦区| 广宗县| 北京市| 克拉玛依市| 满城县| 清涧县| 泸定县| 南部县| 崇仁县| 石林| 惠东县| 昔阳县|