最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用高斯Redis實現(xiàn)二級索引的方法

 更新時間:2022年07月08日 11:40:56   作者:華為云開發(fā)者聯(lián)盟  
本文介紹了如何通過高斯Redis搭建二級索引,二級索引在電商、圖(hexastore)、游戲等領域具有廣泛的應用場景,高斯redis現(xiàn)網(wǎng)亦有很多類似應用,需要的朋友跟隨小編一起看看吧

一、背景

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

索引的本質(zhì)就是利用有序結(jié)構(gòu)來加速查詢,因而通過Zset結(jié)構(gòu)高斯Redis可以輕松實現(xiàn)數(shù)值類型以及字符類型索引。

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

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

下面讓我們切入兩類經(jīng)典業(yè)務場景,看看如何使用高斯Redis來構(gòu)建穩(wěn)定可靠的二級索引系統(tǒng)。

二、場景一:詞典補全

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

2.1 基本方案

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

• 將用戶搜索banana添加進索引:

ZADD myindex 0 banana:1

• 假設用戶在搜索表單中輸入“bit”,并且我們想提供可能以“bit”開頭的搜索關鍵字。

ZRANGEBYLEX myindex "[bit" "[bit\xff"

即使用ZRANGEBYLEX進行范圍查詢,查詢的區(qū)間為用戶現(xiàn)在輸入的字符串,以及相同的字符串加上一個尾隨字節(jié)255(\xff)。通過這種方式,我們可以獲得以用戶鍵入字符串為前綴的所有字符串。

2.2 與頻率相關的詞典補全

實際應用中通常希望按照出現(xiàn)頻率自動排序補全詞條,同時可以清除不再流行的詞條,并自動適應未來的輸入。我們依然可以使用高斯Redis的ZSet結(jié)構(gòu)實現(xiàn)這一目標,只是在索引結(jié)構(gòu)中,不僅需要存儲搜索詞,還需要存儲與之關聯(lián)的頻率。

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

請注意,由于可能存在并發(fā)更新,因此應通過Lua腳本發(fā)送上述三個命令,用Lua script自動獲得舊計數(shù)并增加分數(shù)后重新添加條目。

• 假設用戶在搜索表單中輸入“banana”,并且我們想提供相似的搜索關鍵字。通過ZRANGEBYLEX獲得結(jié)果后按頻率排序。

ZRANGEBYLEX myindex "[banana:" + LIMIT 0 10
1) "banana:123"
2) "banaooo:1"
3) "banned user:49"
4) "banning:89"

• 使用流算法清除不常用輸入。從返回的條目中隨機選擇一個條目,將其分數(shù)減1,然后將其與新分數(shù)重新添加。但是,如果新分數(shù)為0,我們需從列表中刪除該條目。

• 若隨機挑選的條目頻率是1,如banaooo:1

ZREM myindex 0 banaooo:1

• 若隨機挑選的條目頻率大于1,如banana:123

ZREM myindex 0 banana:123
ZADD myindex 0 banana:122

從長遠來看,該索引會包含熱門搜索,如果熱門搜索隨時間變化,它還會自動適應。

三、場景二:多維索引

除了單一維度上的查詢,高斯Redis同樣支持在多維數(shù)據(jù)中的檢索。例如,檢索所有年齡在50至55歲之間,同時薪水在70000至85000之間的人。實現(xiàn)多維二級索引的關鍵是通過編碼將二維的數(shù)據(jù)轉(zhuǎn)化為一維數(shù)據(jù),再基于高斯Redis zset存儲。

從可視化視角表示二維索引。下圖空間中有一些點,它們代表我們的數(shù)據(jù)樣本,其中x和y是兩個變量,其最大值均為400。圖片中的藍色框代表我們的查詢。我們希望查詢x介于50和100之間,y介于100和300之間的所有點。

3.1 數(shù)據(jù)編碼

若插入數(shù)據(jù)點為x = 75和y = 200

1)填充0(數(shù)據(jù)最大為400,故填充3位)

x = 075

y = 200

2)交織數(shù)字,以x表示最左邊的數(shù)字,以y表示最左邊的數(shù)字,依此類推,以便創(chuàng)建一個編碼

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結(jié)構(gòu)輕松實現(xiàn)。

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

3)使用二進制

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

x = 75 -> 001001011

y = 200 -> 011001000

交織后,000111000011001010

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

3.2 添加新元素

若插入數(shù)據(jù)點為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)的搜索框。因此,我們要做的是檢查搜索框較小的尺寸,并檢查與該數(shù)字最接近的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)

四、總結(jié)

本文介紹了如何通過高斯Redis搭建二級索引,二級索引在電商、圖(hexastore)、游戲等領域具有廣泛的應用場景,高斯redis現(xiàn)網(wǎng)亦有很多類似應用。高斯Redis基于存算分離架構(gòu),依托分布式存儲池確保數(shù)據(jù)強一致,可方便的支持二級索引功能,為企業(yè)客戶提供穩(wěn)定可靠、超高并發(fā),且能夠極速彈性擴容的核心數(shù)據(jù)存儲服務。

到此這篇關于使用高斯Redis實現(xiàn)二級索引的文章就介紹到這了,更多相關Redis二級索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • redis群集簡單部署過程

    redis群集簡單部署過程

    文章介紹了Redis,一個高性能的鍵值存儲系統(tǒng),其支持多種數(shù)據(jù)結(jié)構(gòu)和命令,它還討論了Redis的服務器端架構(gòu)、數(shù)據(jù)存儲和獲取、協(xié)議和命令、高可用性方案、緩存機制以及監(jiān)控和日志功能,文章還提供了一個部署Redis群集的簡要指南,感興趣的朋友一起看看吧
    2025-02-02
  • Centos7.3安裝Redis4.0.6詳細圖文教程

    Centos7.3安裝Redis4.0.6詳細圖文教程

    這篇文章主要介紹了Centos7.3安裝Redis4.0.6詳細教程圖解,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • 詳解Redis中的BigKey如何發(fā)現(xiàn)和處理

    詳解Redis中的BigKey如何發(fā)現(xiàn)和處理

    這篇文章主要為大家詳細介紹了Redis中的BigKey如何發(fā)現(xiàn)和處理,文中給大家詳細講解了BigKey危害和如何解決這些問題,文章通過代碼示例和圖文介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • Redisson分布式限流器RRateLimiter的使用及原理小結(jié)

    Redisson分布式限流器RRateLimiter的使用及原理小結(jié)

    本文主要介紹了Redisson分布式限流器RRateLimiter的使用及原理小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • 詳解如何利用Redis實現(xiàn)生成唯一ID

    詳解如何利用Redis實現(xiàn)生成唯一ID

    隨著下單流量逐漸上升,為了降低數(shù)據(jù)庫的訪問壓力,需要通過請求唯一ID+redis分布式鎖來防止接口重復提交。今天我們就一起來看探討一下,如何通過服務端來完成請求唯一?ID?的生成
    2022-11-11
  • Redis持久化解讀

    Redis持久化解讀

    Redis是一種內(nèi)存級數(shù)據(jù)庫,提供高速讀寫性能,但數(shù)據(jù)易失,它支持三種持久化方式:RDB(快照持久化)、AOF(追加文件持久化)和混合持久化,RDB通過快照將數(shù)據(jù)保存到磁盤,AOF記錄所有寫操作命令,混合持久化結(jié)合兩者優(yōu)點
    2025-01-01
  • redis通過pipeline提升吞吐量的方法

    redis通過pipeline提升吞吐量的方法

    下面小編就為大家分享一篇redis通過pipeline提升吞吐量的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Window下Redis的安裝和部署詳細圖文教程

    Window下Redis的安裝和部署詳細圖文教程

    Windows?版本的?Redis?是?Microsoft?的開源部門提供的?Redis.?這個版本的?Redis?適合開發(fā)人員學習使用,生產(chǎn)環(huán)境中使用?Linux?系統(tǒng)上的?Redis,?這里講解了這兩種的安裝和下載,按照你們需要的liunx?或window步驟來?就可以了
    2024-05-05
  • 讓Redis在你的系統(tǒng)中發(fā)揮更大作用的幾點建議

    讓Redis在你的系統(tǒng)中發(fā)揮更大作用的幾點建議

    Redis在很多方面與其他數(shù)據(jù)庫解決方案不同:它使用內(nèi)存提供主存儲支持,而僅使用硬盤做持久性的存儲;它的數(shù)據(jù)模型非常獨特,用的是單線程。另一個大區(qū)別在于,你可以在開發(fā)環(huán)境中使用Redis的功能,但卻不需要轉(zhuǎn)到Redis
    2014-06-06
  • redis過期回調(diào)功能實現(xiàn)示例

    redis過期回調(diào)功能實現(xiàn)示例

    Redis提供了一種過期回調(diào)的機制,可以在某個鍵過期時觸發(fā)一個回調(diào)函數(shù),本文就來介紹一下redis過期回調(diào)功能實現(xiàn)示例,感興趣的可以了解一下
    2023-09-09

最新評論

孝感市| 文登市| 拜城县| 新邵县| 芜湖市| 九台市| 荆门市| 喀喇| 墨脱县| 贺州市| 会昌县| 大同县| 延安市| 云霄县| 德江县| 昂仁县| 梅河口市| 洪江市| 泗水县| 通江县| 苍梧县| 宁乡县| 定安县| 政和县| 朝阳市| 大城县| 武威市| 延边| 丹江口市| 铅山县| 射阳县| 闵行区| 葵青区| 南开区| 工布江达县| 呼和浩特市| 新乐市| 宁都县| 青龙| 韶关市| 山阳县|