本篇內(nèi)容主要講解“redis該怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Redis該怎么使用”吧!
創(chuàng)新互聯(lián)建站于2013年成立,先為寧陜等服務(wù)建站,寧陜等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為寧陜企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在我的項(xiàng)目里,有一個(gè)提供給Autocomplete的功能,數(shù)據(jù)量大概在幾萬。這篇文章里我用姓名檢索的例子來說明,列表請(qǐng)戳來自Redis作者的Demo。
在這樣的列表里全是用戶名,例如我們的系統(tǒng)里有一個(gè)用戶對(duì)象:
public Class User { public string Id{get; set;} public string Name {get; set;} .... public string UserHead {get; set;} }
系統(tǒng)里需要一個(gè)用戶的下拉列表,由于數(shù)據(jù)量大不能一次顯示完,于是就加上了一個(gè)AutoComplete功能。如果是不用Redis這樣的集中式緩存,直接緩存在本機(jī)內(nèi)存里,那么結(jié)構(gòu)很簡(jiǎn)單如下:
var users = new List<User>{...};//讀到一個(gè)用戶列表MemoryCache.Set("capqueen:users", users);//放入內(nèi)存//讀取var users = MemoryCache.Get<List<User>>("capqueen:users");
因?yàn)槎际窃趦?nèi)存里,所以直接存List就可以了,搜索的時(shí)候也可以直接的如下:
var findUsers = users.Where(user => user.Name.StartWith("A")).ToList();例如輸入的字符是 “A“
相當(dāng)簡(jiǎn)單,完全不用考慮如何存儲(chǔ),存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)。但是換到了Redis這些集中式緩存服務(wù)之后,咱們?cè)賮硭伎?,該如何存?chǔ)。
方案一:類似內(nèi)存式的緩存實(shí)現(xiàn)。
本文里使用的Redis鏈接庫(kù)是StactkExchange.Redis,出自StackOverFlow的開源產(chǎn)品。
var db = redis.GetDataBase();//獲取0數(shù)據(jù)庫(kù)var usersJson = JsonConvert.SerializeObject(users)//序列化db.StringSet("capqueen:users", usersJson);//存儲(chǔ)var usersString = db.StringGet("capqueen:users");
var userList = JsonConvert.DeserializeObject<List<User>>(users);//反序列化
上面的方式邏輯上是沒有問題的,編譯也可以通過。但是仔細(xì)想一想,Redis作為獨(dú)立的緩存服務(wù)和appSever是分開來的,這樣的讀取方式對(duì)redis服務(wù)器的IO是個(gè)負(fù)擔(dān),甚至這樣的讀取比本地內(nèi)存緩存慢了太多了。
那如何解決呢?試想key-value的精髓是在于Key,那么對(duì)于List來說應(yīng)該要把item分開來存儲(chǔ)。
方案二:Keys模糊匹配。
在查看了Redis的命令文檔(見參考資料4)之后,發(fā)現(xiàn)了命令Keys,如獲至寶,立馬修改了方案。首先我們需要把要搜索的關(guān)鍵詞建立為key,這里我把key定義為 "capqueen:user:{id}:{name}",其中{}內(nèi)的是要用item對(duì)應(yīng)屬性替換的。代碼如下:
var redis = ConnectionMultiplexer.Connect("localhost");var db = redis.GetDatabase(); var users = new List<User> { new User{Id = 6, Name = "aaren", Age=10}, new User{Id = 7, Name = "issy", Age=11}, new User{Id = 8, Name = "janina", Age=13}, new User{Id = 9, Name = "karena", Age=14} }; users.ForEach(item => { var key = string.Format("capqueen:user:{0}:{1}", item.Id, item.Name); var value = JsonConvert.SerializeObject(item); db.StringSet(key, value); });
所有的user都以單獨(dú)的Key-Value方式存儲(chǔ),那么如何利用Keys搜索呢?我們來看下Redis的Keys命令:
KEYS pattern 查找所有符合給定模式 pattern 的 key 。 KEYS * 匹配數(shù)據(jù)庫(kù)中所有 key 。 KEYS h?llo 匹配 hello , hallo 和 hxllo 等。 KEYS h*llo 匹配 hllo 和 heeeeello 等。 KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。 特殊符號(hào)用 \ 隔開
也就是說Keys能夠進(jìn)行簡(jiǎn)單的模糊匹配,那么我們這里的搜索就可以換成如下的方式:
var redis = ConnectionMultiplexer.Connect("192.168.10.178");var db = redis.GetDatabase();var server = redis.GetServer("192.168.10.178", 6379);var keys = server.Keys(pattern: "capqueen:user:*:a*");var values = db.StringGet(keys.ToArray());//反序列化var jsonValues = new StringBuilder("["); values.ToList().ForEach(item => jsonValues.Append(item).Append(",")); jsonValues.Append("]");var userList = JsonConvert.DeserializeObject<List<User>>(jsonValues.ToString());
注意以上的代碼里,因?yàn)槊總€(gè)value是一個(gè)json,為了增加轉(zhuǎn)化時(shí)的效率,我先處理成json arry再進(jìn)行反序列化。
這種方案,確實(shí)是解決了我目前的問題,然而我注意到了Redis文檔里的一段話:
KEYS 的速度非??欤谝粋€(gè)大的數(shù)據(jù)庫(kù)中使用它仍然可能造成性能問題,如果你需要從一個(gè)數(shù)據(jù)集中查找特定的 key
,你最好還是用 Redis 的集合結(jié)構(gòu)(set)來代替。
到此,相信大家對(duì)“Redis該怎么使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
網(wǎng)頁(yè)標(biāo)題:Redis該怎么使用
標(biāo)題路徑:http://redsoil1982.com.cn/article40/pooeho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、企業(yè)建站、品牌網(wǎng)站制作、App設(shè)計(jì)、Google、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)