婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 利用Redis如何實(shí)現(xiàn)自動(dòng)補(bǔ)全功能

利用Redis如何實(shí)現(xiàn)自動(dòng)補(bǔ)全功能

熱門(mén)標(biāo)簽:400電話辦理的口碑 南京手機(jī)外呼系統(tǒng)廠家 臺(tái)灣電銷(xiāo) 一個(gè)地圖標(biāo)注多少錢(qián) 高碑店市地圖標(biāo)注app 廊坊外呼系統(tǒng)在哪買(mǎi) b2b外呼系統(tǒng) 地圖標(biāo)注工廠入駐 四川穩(wěn)定外呼系統(tǒng)軟件

忘了redis從哪個(gè)版本開(kāi)啟,能夠根據(jù)輸入的部分命令前綴給出提示,即自動(dòng)補(bǔ)全。接下來(lái)筆者介紹基于redis實(shí)現(xiàn)這個(gè)很酷的功能。

about sorted set

假設(shè)結(jié)果中有mara,marabel,marcela。現(xiàn)在我們輸入mar,就能得到這三個(gè)名字,并且輸出結(jié)果按照字典排序。在實(shí)現(xiàn)這個(gè)需求之間,我們先簡(jiǎn)單介紹sorted set。

大家都知道sorted set是按照score排序的:

127.0.0.1:6380> zadd test 85 sida
127.0.0.1:6380> zadd test 80 xiaolang
127.0.0.1:6380> zadd test 60 afei
127.0.0.1:6380> zadd test 90 chenssy
127.0.0.1:6380> zadd test 98 yunaiv
127.0.0.1:6380> zrange test 0 -1
1) "afei"
2) "xiaolang"
3) "sida"
4) "chenssy"
5) "yunaiv"

但是如果score都一樣,sorted set是按照什么排序的呢?是按照字典排序的:

127.0.0.1:6380> zadd exam 0 sida
127.0.0.1:6380> zadd exam 0 xiaolang
127.0.0.1:6380> zadd exam 0 chenssy
127.0.0.1:6380> zadd exam 0 yunaiv
127.0.0.1:6380> zadd exam 0 afei
127.0.0.1:6380> zrange exam 0 -1
1) "afei"
2) "chenssy"
3) "sida"
4) "xiaolang"
5) "yunaiv"

這是sorted set一個(gè)非常重要的特性,也是我們自動(dòng)補(bǔ)全需求的一個(gè)要點(diǎn)。但是這還不夠,離我們的最終需求還有一段路要走。幸運(yùn)的是sorted set還有另一個(gè)很酷的命令:ZRANK。這個(gè)命令能知道你要查詢(xún)的key在sorted set中的位置:

127.0.0.1:6380> zrank exam sida
(integer) 2
127.0.0.1:6380> zrank exam yunaiv
(integer) 4
127.0.0.1:6380> zrange exam 2 4
1) "sida"
2) "xiaolang"
3) "yunaiv"

到這里感覺(jué)離我們實(shí)現(xiàn)自動(dòng)補(bǔ)全的第一個(gè)版本非常接近了,我們能得到sorted set中按照字典排序后任意一個(gè)member及其后面N個(gè)member。

簡(jiǎn)單實(shí)現(xiàn)

為了實(shí)現(xiàn)最終的自動(dòng)補(bǔ)全,我們需要付出一些代價(jià):空間。

意思是,對(duì)于某個(gè)準(zhǔn)備添加到sorted set中的member,例如afei,我們不僅要把完整的詞(afei)添加到sorted set中,而且還要添加所有可能的前綴(a, af, afe, afei)。這里為了解決某個(gè)詞是真正的member還是某個(gè)member的前綴(例如bar既是一個(gè)完整的詞,也是某個(gè)member例如bark的可能前綴),我們加了一個(gè)小把戲,即在真正member的后面增加一個(gè)特殊字符,例如"$",那么afei這個(gè)member就會(huì)添加下列這些詞:

a, af, afe, afei, afei$

現(xiàn)在假設(shè)我們需要添加三個(gè)詞:foo, bar, foobar 來(lái)進(jìn)行一些測(cè)試, 那么sorted set中就會(huì)有如下這些詞:

127.0.0.1:6380> zrange autoc 0 -1
 1) "b"
 2) "ba"
 3) "bar"
 4) "bar$"
 5) "f"
 6) "fo"
 7) "foo"
 8) "foo$"
 9) "foob"
10) "fooba"
11) "foobar"
12) "foobar$"

離我們最終的目標(biāo)又要近了很多。現(xiàn)在假設(shè)用戶(hù)輸入"fo",那么為了實(shí)現(xiàn)自動(dòng)補(bǔ)全,我們需要執(zhí)行如下命令,仔細(xì)查看結(jié)果,foo$和foobar$就是我們需要的結(jié)果,只需要將特殊后綴$去掉即可(其他沒(méi)有以$結(jié)尾的詞全部忽略):

127.0.0.1:6380> zrank autoc fo
(integer) 5
127.0.0.1:6380> zrange autoc 5 -1
1) "fo"
2) "foo"
3) "foo$"
4) "foob"
5) "fooba"
6) "foobar"
7) "foobar$"

更多詞的測(cè)試

網(wǎng)址http://antirez.com/misc/female-names.txt 提供了近5000個(gè)女性名字。按照前面說(shuō)的規(guī)則,將所有名字的所有可能前綴全部添加到sorted set中。假定用戶(hù)輸入member,那么只需要通過(guò)如下兩個(gè)命令,得到字典排序后用戶(hù)輸入的member后面的50個(gè)詞,然后只取$結(jié)尾的詞:

127.0.0.1:6380> zrank autoc member
(integer) 8
127.0.0.1:6380> zrange autoc 8 50

時(shí)間空間復(fù)雜度

根據(jù)官方文檔可知,zrank和zrange的事件復(fù)雜度都是O(log(N))。因此,即使數(shù)據(jù)量比較大,這種方案也是可行的。

ZRANK key member
起始版本:2.0.0
時(shí)間復(fù)雜度:O(log(N))

ZRANGE key start stop [WITHSCORES]
起始版本:1.2.0
時(shí)間復(fù)雜度:O(log(N)+M) with N being the number of elements in the sorted set and M the number of elements returned.

那么需要多少內(nèi)存呢?

假設(shè)在最糟糕的情況下,一個(gè)長(zhǎng)度為M的詞需要添加M+1個(gè)詞到sorted set中。那么如果有N個(gè)詞,總計(jì)需要添加N*(Ma+1)個(gè)詞到sorted set中,Ma是這N個(gè)詞的平均長(zhǎng)度。

幸運(yùn)的是,實(shí)際情況遠(yuǎn)比這個(gè)要好得多,以近5000個(gè)女性名字為例,只需要添加大約15000個(gè)詞到sorted set中,因?yàn)檫@些名詞存在大量重復(fù)的前綴。以3個(gè)名字為例:marci,marcia,marcile。如果按照最糟糕的情況,需要添加3*(6+1)=21個(gè)詞到sorted set中,然而實(shí)際情況呢,只需要添加11個(gè)詞到sorted set中即可:

m, ma , mar, marc, marci, marci$, marcia, marcia$, marcil, marcile, marcile$。

而且,隨著樣本越來(lái)越大,重復(fù)的前綴會(huì)越大越多。

所以,需要的內(nèi)存也還OK。是不是覺(jué)得美滋滋?哈

查詢(xún)預(yù)測(cè)

我們這次的自動(dòng)補(bǔ)全是按照字典排序,很多時(shí)候,這是我們需要的。但是也有一些情況,我們希望按照相似度來(lái)排序。例如google搜索那樣,搜索結(jié)果按照頻率和熱度等維度進(jìn)行排序。例如,當(dāng)用戶(hù)輸入ne,用戶(hù)應(yīng)該希望看到Netflix,news,new york times等這些熱門(mén)關(guān)鍵詞。

這樣做起來(lái)就不那么容易了,如果要能達(dá)到根據(jù)頻率排序,我們需要一個(gè)特別的sorted set能以非阻塞的方式實(shí)時(shí)更新每個(gè)前綴的頻率:

當(dāng)用戶(hù)輸入一個(gè)例如"foo"這種查詢(xún),由于它的所有前綴為:"f", "fo", "foo"。那么對(duì)每個(gè)前綴都執(zhí)行命令:ZINCRBY prefix> 1 foo ;如果用戶(hù)輸入"foobar",那么對(duì)每個(gè)前綴都執(zhí)行:ZINCRBY prefix> 1 foobar;

這種方法還有一個(gè)問(wèn)題,許多自動(dòng)補(bǔ)全系統(tǒng)只需要展示TOP N個(gè)關(guān)鍵詞,假設(shè)N為10。但是我們這種方法,如果要計(jì)算TOP 10,我們需要取得關(guān)鍵詞遠(yuǎn)不止10個(gè),理論上我們要這個(gè)前綴作為key的sorted set中所有member都取出來(lái)。

幸運(yùn)的是,從統(tǒng)計(jì)學(xué)上來(lái)講,每個(gè)對(duì)于sorted set中有300個(gè)member的前綴,就能得到TOP 5關(guān)鍵詞。如果查詢(xún)?cè)筋l繁,它的得分越高,它最終被選中的概率也就越高。因此,我們要做的就是對(duì)搜索字符串的每個(gè)前綴:

  • 如果前綴作為key的sorted set中member數(shù)量還沒(méi)有達(dá)到300,那么只需要簡(jiǎn)單的對(duì)其zincrby即可;
  • 如果前綴作為key的sorted set中member數(shù)量已經(jīng)達(dá)到了300,我們將那些得分比較低的member刪除,增加新的member進(jìn)來(lái),從而達(dá)到關(guān)鍵詞頻率不斷迭代的效果。

這個(gè)方法一下子可能理解不過(guò)來(lái),沒(méi)關(guān)系,舉個(gè)栗子。假設(shè)現(xiàn)在用戶(hù)輸入了next,其前綴n為key的sorted set中已經(jīng)有netflix(100), news(120), new york(80), near(23), nequ(1)。由于這個(gè)前綴對(duì)應(yīng)的sorted set中的member數(shù)量還沒(méi)有300,所以,執(zhí)行:zincrby n 1 next。其中n是前綴,next是用戶(hù)輸入的關(guān)鍵詞。假設(shè)現(xiàn)在用戶(hù)輸入了next,其前綴n為key的sorted set中已經(jīng)有netflix(100), news(120), new york(80), near(23), 省略295個(gè)score大于1的關(guān)鍵詞, nequ(1)。由于這個(gè)前綴對(duì)應(yīng)的sorted set中的member數(shù)量達(dá)到了300,所以,先刪除得分比較低的nequ,再執(zhí)行:zincrby n 1 next。

這個(gè)方法跟用戶(hù)輸入關(guān)鍵詞分布有很大的關(guān)聯(lián)性,如果用戶(hù)輸入的所有關(guān)鍵詞頻率比較接近,那么這個(gè)方法得到的數(shù)據(jù)并不是很可靠。但是我們知道這不是問(wèn)題,因?yàn)樗阉骶褪墙^大部分人在搜索那一小部分關(guān)鍵詞集合。

清理階段

由于上面提到的搜索長(zhǎng)尾效應(yīng),我們可以講那些得分為1的member清理掉,因?yàn)橛脩?hù)對(duì)這些關(guān)鍵詞幾乎沒(méi)有任何關(guān)注度。清理操作還能夠減少使用內(nèi)存,從而讓redis保存更多更有用的數(shù)據(jù)。

知識(shí)總結(jié)

  • sorted set數(shù)據(jù)結(jié)構(gòu)中,如果member的score一樣,那么按照字典排序。
  • zrank命令能得到指定member在結(jié)果中的位置,并可以取排在它后面N個(gè)member。
  • zincrby能給指定的sorted set中的member加分。

參考:http://oldblog.antirez.com/post/autocomplete-with-redis.html

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

標(biāo)簽:定州 甘南 河源 拉薩 伊春 畢節(jié) 南寧 泰州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《利用Redis如何實(shí)現(xiàn)自動(dòng)補(bǔ)全功能》,本文關(guān)鍵詞  利用,Redis,如何,實(shí)現(xiàn),自動(dòng),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《利用Redis如何實(shí)現(xiàn)自動(dòng)補(bǔ)全功能》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于利用Redis如何實(shí)現(xiàn)自動(dòng)補(bǔ)全功能的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    免费成人结看片| www国产精品av| 亚洲在线视频网站| 麻豆免费精品视频| 国产在线精品免费av| 色婷婷一区二区三区四区| 国产成人av影院| 精品欧美久久久| 一区二区三区小说| 国产成人av电影| 色天使久久综合网天天| 国产视频一区二区在线| 久久丁香综合五月国产三级网站| 欧美又粗又大又爽| 综合自拍亚洲综合图不卡区| 国产在线播放一区| 久久影院电视剧免费观看| 日本午夜一本久久久综合| 精品一区二区在线看| 56国语精品自产拍在线观看| 亚洲成a天堂v人片| 欧美日韩视频在线观看一区二区三区 | 亚洲亚洲人成综合网络| 日本欧美大码aⅴ在线播放| 91免费观看视频| 亚洲视频在线观看三级| www.视频一区| 综合自拍亚洲综合图不卡区| 91丨九色丨黑人外教| 日本一区二区免费在线观看视频| 亚洲精品水蜜桃| 欧美在线观看一区二区| 亚洲网友自拍偷拍| 欧美日韩高清不卡| 一区二区不卡在线播放| 欧美性生交片4| 蜜臀a∨国产成人精品| 欧美α欧美αv大片| 婷婷开心激情综合| 精品国产乱码久久久久久久久| 国产伦精一区二区三区| 中文字幕成人在线观看| 91久久精品日日躁夜夜躁欧美| 亚洲成人一二三| 久久先锋影音av鲁色资源网| av在线播放成人| 日韩黄色一级片| 亚洲国产岛国毛片在线| 91色porny| 中文字幕亚洲一区二区av在线 | 日韩国产欧美在线播放| 欧美不卡视频一区| 成人av免费网站| 亚洲高清免费视频| 精品国产免费视频| 国产成人精品网址| 亚洲电影第三页| 久久精品夜色噜噜亚洲aⅴ| 99精品国产一区二区三区不卡| 亚洲国产乱码最新视频 | 国产综合成人久久大片91| 亚洲国产精品黑人久久久| 成人蜜臀av电影| 日韩av二区在线播放| 欧美激情一区二区| 欧美一级一区二区| 色婷婷精品大视频在线蜜桃视频 | 国产精品亚洲人在线观看| 一区二区成人在线视频| 国产日韩欧美制服另类| 在线不卡a资源高清| 91丝袜高跟美女视频| 久久91精品国产91久久小草| 亚洲最新在线观看| 国产亚洲欧美中文| 日韩欧美黄色影院| 欧美视频日韩视频| 一本大道av一区二区在线播放| 国产一区二区不卡| 乱一区二区av| 亚洲一二三四区不卡| 欧美国产成人在线| 久久午夜老司机| 精品久久久久av影院 | 日韩欧美国产电影| 欧美日韩美女一区二区| 精品在线你懂的| 一区二区三区国产豹纹内裤在线| 日韩精品资源二区在线| 久久国产精品一区二区| 成人av综合在线| 久久丝袜美腿综合| 中文av一区特黄| 国产精品久久久久久一区二区三区 | 国产一区啦啦啦在线观看| 一区二区免费在线播放| 日韩av电影免费观看高清完整版| 国产成人免费在线| 中日韩av电影| 91小视频免费观看| 婷婷国产v国产偷v亚洲高清| 色视频成人在线观看免| 日韩二区三区在线观看| 国产精品每日更新| 欧美在线观看禁18| 国产成人免费在线| 天天操天天干天天综合网| 日本一区二区成人| 亚洲国产精品二十页| 欧美日韩黄色一区二区| 经典三级一区二区| 性做久久久久久免费观看| 国产日产精品1区| 日韩精品一区二区三区四区视频| 国产剧情一区二区| 美国十次了思思久久精品导航| voyeur盗摄精品| 国产一区二区三区蝌蚪| 日本不卡在线视频| 最新国产精品久久精品| 久久精品夜色噜噜亚洲aⅴ| 欧美mv日韩mv国产网站app| 4438成人网| 日韩精品在线看片z| 欧美刺激脚交jootjob| 日韩亚洲欧美综合| 国产亚洲短视频| 亚洲天堂成人网| 亚洲国产人成综合网站| 日韩精品一卡二卡三卡四卡无卡| 日韩精品五月天| 成人丝袜视频网| 91麻豆精品视频| 在线不卡一区二区| 久久蜜桃av一区二区天堂| 国产日产精品一区| 午夜成人在线视频| 国产成人精品影视| 欧美裸体bbwbbwbbw| 久久美女高清视频| 亚洲午夜久久久久久久久电影网| 日韩精品91亚洲二区在线观看| 久久精品999| 中文字幕一区日韩精品欧美| 日本一区中文字幕| 成人av免费观看| 久久人人爽人人爽| 亚洲欧美偷拍另类a∨色屁股| 老司机精品视频线观看86| 91成人免费电影| 欧美经典三级视频一区二区三区| 欧美a级理论片| 欧美色精品在线视频| 久久精品视频在线免费观看| 美女高潮久久久| 欧美色电影在线| 亚洲激情自拍偷拍| 99久免费精品视频在线观看 | 久久午夜色播影院免费高清| 亚洲品质自拍视频| 不卡的av在线播放| 国产精品毛片久久久久久| 国产米奇在线777精品观看| 日韩美女一区二区三区四区| 亚洲最大色网站| 91欧美一区二区| 国产精品毛片久久久久久久| 99精品国产91久久久久久| 亚洲成av人片一区二区三区| 欧美三级电影在线看| 免费一区二区视频| 久久午夜电影网| 国产精品久久久久久久久久久免费看 | 成人激情av网| 轻轻草成人在线| 日本一区二区不卡视频| 欧美日韩精品一区视频| 丝袜美腿高跟呻吟高潮一区| 精品国产免费人成在线观看| 99久久精品99国产精品| 国产一区在线观看视频| 亚洲一区中文在线| 亚洲欧洲av色图| 欧美激情资源网| 亚洲国产日韩一区二区| 日韩欧美视频在线| 国产一区高清在线| 日本人妖一区二区| 图片区小说区国产精品视频| 欧美大片一区二区三区| 色婷婷综合激情| av动漫一区二区| 99久久伊人精品| heyzo一本久久综合| 99久久夜色精品国产网站| 国产乱人伦偷精品视频免下载 | 亚洲成人免费观看| 亚洲欧美日韩一区| 成人手机电影网| 国产黑丝在线一区二区三区|