亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Redis到底該如何利用(二)?

2019-11-17 02:45:17
字體:
來源:轉載
供稿:網友

Redis到底該如何利用(二)?

上一篇文章里我簡述了使用Keys作為Redis搜索的方式,確實感受到了社區的力量,寫文章好處多。首先謝謝各位前輩的指導,我知道了拿Redis作為搜索是個錯誤的方向。本來這篇文章我覺得確實沒必要發了,但是想想既然錯了,那就將錯就錯,寫出來給初學者一些思考吧。

本篇我將會講講,分詞建立key索引和redis scan命令兩種方式。

注意:這兩種方式的搜索也不一定可行,具體場景要具體測試衡量,拿Redis做搜索要深思熟慮并且測試,甚至是要直接回避的。

另外,上篇評論也建議大家看一看,前輩們給了很多經驗總結,有一些同學可能沒明白。這些點我先整理下:

1. 我采用了StactkExchange.Redis,而不是ServiceStack.Redis。對于后者我覺得是個好工具,但是4.0開始收費了,3.9功能不是特別全,一些地方存在不足。

2. 有同學建議GetAll之類的方式,我覺得對于緩存應該還是不要StringSet(list)/StringGet(list)的方式吧,畢竟數據量大了,序列化反序列化就費時。這點不知道大家怎么看?我個人覺得每條記錄應該是一個key-value,這個value應該是避免存成整個集合的,否則效率何在?

3. 上一篇中的Keys模糊匹配,請大家在實際運用的時候忽略掉。因為Keys會引發Redis鎖,并且增加Redis的CPU占用,情況是很惡劣的。

分詞索引法

這種方式是我實踐過后,結合上篇的前輩給的觀點覺得唯一比較可行且符合redis特性的方式,不過最終效率上還是比不過內存。

詳細的實現思路清看Redis作者博客(參考資料1),這里的例子還是基于UserName,英文,并且只針對詞組做了長度為3的分詞,其他場景請自行擴展。

首先基于AutoComplete的字母搜索,那么我們需要對所有的Name做一個分詞,即:

abc => (a, ab, abc)

形成一個Set的集合形式:

那么輸入a,我們就直接取set a里的內容,輸入ab就直接取ab集合的內容。那么我們開始轉換,首先我們需要對User表的姓名進行分詞:

var redis = ConnectionMultWords, id from (                                    select Row_number() over (partition by words order by name) as rn,id,words from (                                        select  id, SUBSTRING(name, 1, {0}) as words, name from User                                     ) as t                                    ) t2 where rn <= {1} and words != '' and words is not null", i, 20));    data.ForEach((key, item) =>      {         db.SetAdd("capqueen:Cache:user:" + key.ToLower(), item.Select<int, RedisValue>(j => j).ToArray());      });}

第一步:采用SQL,分組排序篩選出每個分詞的前20條數據,這里使用的是OrmLite的語法。

第二部:存入RedisSet,注意這里其實只是做了一個索引,并不保存具體的User內容,效果如下:

接著搜索的時候我們可以實現如下:

public List<User> SearchWords(string keywords){            var redis = ConnectionMultiplexer.Connect("localhost");            var db = redis.GetDatabase();            var result = db.SetMembers("capqueen:Cache:user:" + keywords.ToLower());            var users = new List<User>();            if (result.Any())            {                //轉換成ids                                var ids = result.ToList().Select<RedisValue, RedisKey>(i => i.ToString());                //按照keys獲取value ,事先已經存好了Users                var values = db.StringGet(ids.ToArray());                //構造List Json以加速解析                var portsJson = new StringBuilder("[");                values.ToList().ForEach(item =>                {                    if (!string.IsNullOrWhiteSpace(item))                    {                        portsJson.Append(item).Append(",");                    }                });                portsJson.Append("]");                users = JsonConvert.DeserializeObject<List<User>>(portsJson.ToString());            }}

經過實際的測試,這樣的寫法比前面的Keys確實好了不少,但是性能還是差強人意的。

Scan搜索法

這種方法是我在查閱了Redis的文檔之后,發現的,但是也就是試驗一下,估計也不能用做生產環境大規模查詢。

Scan根據數據結構的不同分為了SCAN/HSCAN/SSCAN/ZSCAN,具體的信息請看文檔。我們這里采用了ZSCAN:

ZSCAN key cursor [MATCH pattern] [COUNT count]

這里cursor是搜索的迭代的一個游標,具體還沒弄明白,pattern就是匹配規則 count就是記錄條數

由于我使用的是StackExchange.Redis,它提供的zscan方法是:

IEnumerable SortedSetScan(RedisKey key, RedisValue pattern = null, int pageSize = 10, long cursor = 0, int pageOffset = 0, CommandFlags flags = CommandFlags.None);

用過之后,我發現了這里的pageSize/pageOffset貌似沒有效果,為此我還特地上github為作者留了言,他給我一些解釋:

https://github.com/StackExchang, 我的英語比較差,請湊合看。

public void CreateTerminalCache(List<User> users){            if (users == null) return;            var db = ConnectionMultiplexer.GetDatabase();                        var sourceData = new List<KeyValuePair<RedisKey, RedisValue>>();            //構造集合數據            var list = users.Select(item =>            {                var value = JsonConvert.SerializeObject(item);                //構造原始數據                sourceData.Add(new KeyValuePair<RedisKey, RedisValue>("capqueen:users:" + item.Id, value));                //構造數據                    return new SortedSetEntry(item.Name, item.Id);            });            //添加進有序集合,采用name - id             db.SortedSetAdd("capqueen:users:index", list.ToArray());            //添加港口數據key-value            db.StringSet(sourceData.ToArray(), When.Always, CommandFlags.None);}

然后搜索的時候如下:

public List<User> GetUserByWord(string words){            var db = ConnectionMultiplexer.GetDatabase();                        //搜索            var result = db.SortedSetScan("capqueen:users:index", words + "*", 10, 1, 30, CommandFlags.None).Take(30).ToList();                       var users = new List<User>();            if (result.Any())            {                //轉換成ids                                var ids = result.ToList().Select<SortedSetEntry, RedisKey>(i => i.ToString());                //按照keys獲取value                var values = db.StringGet(ids.ToArray());                //構造List Json以加速解析                var portsJson = new StringBuilder("[");                values.ToList().ForEach(item =>                {                    if (!string.IsNullOrWhiteSpace(item))                    {                        portsJson.Append(item).Append(",");                    }                });                portsJson.Append("]");                users = JsonConvert.DeserializeObject<List<User>>(portsJson.ToString());            }            return users;}        

總結

總的來說,通過這么一些列的研究和前輩們的指導,我對Redis有了一些了解。AutoComplete的場景是真的不適合使用Redis,可以說目前Redis用來做一些搜索可能還早,期待以后會有相關功能吧。上一篇文章里,有些前輩給的 意見很好,希望大家也可以學習一下。

  1. 分級緩存,該到內存的還是應該保存到appServer的內存,redis只是集中式緩存的一步。
  2. 多增加一個數據服務器,幾種提供數據服務,這樣可以把一些緩存直接統一到這個機器來做。鏈接
  3. 感謝前輩們的留言,尤其感謝@雷獸 前輩等

參考資料

  1. Redis作者博客,這是其中一篇講如何基于Redis實現AutoComplete的文章:http://oldblog.antirez.com/post/autocomplete-with-redis.html
  2. Redis 第三方管理工具 For Windows:http://redisdesktop.com/
  3. Redis .NET鏈接工具的Top20:http://nugetmusthaves.com/Tag/Redis
  4. Redis命令中文文檔:http://redisdoc.com/
  5. 知乎上的一個討論:http://www.zhihu.com/question/19764056

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美不卡视频一区发布| 亚洲女人被黑人巨大进入al| 亚洲精品中文字幕女同| 成人自拍性视频| 色综合色综合网色综合| 岛国av在线不卡| 国产成人免费av电影| 国内揄拍国内精品少妇国语| 亚洲女人天堂av| 精品久久久久久久大神国产| 国产视频999| 国产精品电影观看| 欧美高清激情视频| 久久视频在线看| 国产精品高清在线观看| 亚洲人精品午夜在线观看| 免费97视频在线精品国自产拍| 久久久久久亚洲精品不卡| 在线视频亚洲欧美| 亚洲va久久久噜噜噜久久天堂| 欧美激情中文字幕乱码免费| 亚洲a一级视频| 亚洲天堂第二页| 国产精品久久久久影院日本| 色99之美女主播在线视频| 久久影视免费观看| 欧美极品少妇xxxxⅹ喷水| 91精品国产乱码久久久久久久久| 国产精品美女www爽爽爽视频| 亚洲欧美国产视频| 日韩中文字幕在线观看| 国模视频一区二区三区| 91sao在线观看国产| 欧美亚洲激情视频| 国产91精品久久久| 清纯唯美日韩制服另类| 日韩电视剧在线观看免费网站| 国产精品久久久久久久久久尿| 中文字幕日韩在线播放| 国产精品视频色| 91在线高清视频| 亚洲欧美综合精品久久成人| 日韩中文字幕在线观看| 永久免费精品影视网站| 欧美日韩国产一中文字不卡| 国产成人免费av电影| 欧美性xxxx在线播放| 97av在线播放| 久久理论片午夜琪琪电影网| 亚洲色图第一页| 国产成人精品av在线| 欧洲亚洲免费视频| 91久久精品日日躁夜夜躁国产| 中文字幕综合在线| 久久国内精品一国内精品| 亚洲国产精品大全| 国产精品高潮呻吟久久av无限| 精品国产成人av| 欧美精品xxx| 国产第一区电影| 亚洲第一网站免费视频| 热草久综合在线| 久久精品国产欧美激情| 欧美在线一级va免费观看| 亚洲国产中文字幕久久网| 97视频在线播放| 91在线免费观看网站| 亚洲a一级视频| 国产精品欧美日韩一区二区| 亚洲综合在线做性| 亚洲深夜福利在线| 欧美成人精品一区| 国产精品成人免费视频| 成人激情在线观看| 亚洲人精品午夜在线观看| 亚洲一级一级97网| 国产精品露脸av在线| 韩日精品中文字幕| 九九热这里只有精品免费看| 亚洲xxxx18| 欧美日韩国产精品| 久久久999精品免费| 国产一区二区三区在线看| 亚洲成色777777女色窝| 久久韩剧网电视剧| 国产91精品不卡视频| 欧美激情啊啊啊| 亚洲精品视频在线播放| 欧美老少配视频| 欧美激情在线观看视频| 一本大道久久加勒比香蕉| 亚洲欧美中文另类| 欧美性色视频在线| 国产精品视频网址| 国产91色在线|| 国色天香2019中文字幕在线观看| 国产精品中文久久久久久久| 欧美大荫蒂xxx| 成人福利免费观看| 91精品国产高清久久久久久久久| 性欧美xxxx| 大桥未久av一区二区三区| 欧美成人午夜剧场免费观看| 91亚洲一区精品| 奇门遁甲1982国语版免费观看高清| 中文字幕在线看视频国产欧美| 亚洲跨种族黑人xxx| 欧美又大粗又爽又黄大片视频| 久久久久久久久国产| 国产精品99蜜臀久久不卡二区| 91精品在线观看视频| 插插插亚洲综合网| 亚洲国产日韩欧美综合久久| 国产成人精品免高潮费视频| 91免费视频网站| 亚洲成人网av| 亚洲精品成人久久| 78m国产成人精品视频| 综合网日日天干夜夜久久| 理论片在线不卡免费观看| 国产主播欧美精品| 日韩在线观看免费网站| 岛国av一区二区在线在线观看| 欧美精品videossex性护士| 黑人巨大精品欧美一区免费视频| 国产亚洲欧洲高清| 日本一区二区三区四区视频| 亚洲色图狂野欧美| 国产成一区二区| 日韩av网址在线观看| 91免费观看网站| 日韩大片免费观看视频播放| 亚洲视频精品在线| 97在线日本国产| 国产狼人综合免费视频| 欧美综合第一页| 国内免费久久久久久久久久久| 日韩欧美在线播放| 精品国产依人香蕉在线精品| 精品国产一区二区三区在线观看| 97视频在线观看免费高清完整版在线观看| 日韩成人在线观看| 热门国产精品亚洲第一区在线| 国产亚洲aⅴaaaaaa毛片| 国产精品91视频| 伊人激情综合网| 久久99精品久久久久久青青91| 欧美日韩国产精品一区二区不卡中文| 中文字幕国产亚洲2019| 青青久久av北条麻妃海外网| 亚洲欧美激情四射在线日| 日韩av第一页| 成人伊人精品色xxxx视频| 成人国产在线激情| 日韩av电影国产| 色婷婷综合久久久久| 91免费欧美精品| 成人伊人精品色xxxx视频| 91欧美日韩一区| 97国产成人精品视频| 欧美精品videosex性欧美| 色琪琪综合男人的天堂aⅴ视频| 欧美精品一区二区免费| 亚洲精品videossex少妇|