在實(shí)際業(yè)務(wù)中我們會將一些熱數(shù)據(jù)緩存到redis里面粘驰,這時(shí)候數(shù)據(jù)量比較大的話坊罢,我們就要對這些熱數(shù)據(jù)進(jìn)行分頁娩脾,分頁的方式有2種:
第一:從redis拿出所有數(shù)據(jù)后漠吻,再做內(nèi)存分頁(不推薦)量瓜,熱點(diǎn)數(shù)據(jù)小的時(shí)候可以這樣做,性能相差不是很大途乃,但是當(dāng)數(shù)據(jù)量大的時(shí)候绍傲,分頁期間就會占用大量內(nèi)存,或撐爆耍共;
第二:基于redis的數(shù)據(jù)結(jié)構(gòu)做緩存分頁烫饼,這里又分2種
①:基于redis的list數(shù)據(jù)結(jié)構(gòu),直接通過list的數(shù)據(jù)結(jié)構(gòu)试读,用range方法可以進(jìn)行分頁枫弟,在數(shù)據(jù)量大的時(shí)候,性能也很可觀鹏往,但是當(dāng)存在接口高并發(fā)訪問時(shí)淡诗,這個(gè)list可能會無限延長,且里面的數(shù)據(jù)會存在很多重復(fù)伊履,這就會影響到正常的業(yè)務(wù)(不是很推薦)韩容;
②:基于redis的ZSet數(shù)據(jù)結(jié)構(gòu),通過Zset這個(gè)有序集合我們也可以做分頁唐瀑,同樣也是用range方法群凶,但是這里比較麻煩的是在初始化數(shù)據(jù)的時(shí)候Zset必須存放TypedTuple類型的數(shù)據(jù),這個(gè)類型是一個(gè)value和score的鍵值對哄辣,具體可以查百度请梢,這個(gè)score的生成比較麻煩我這邊測試時(shí)用的是當(dāng)前數(shù)據(jù)在這個(gè)list的位置,然后Zset是根據(jù)這個(gè)score值來排序的力穗,默認(rèn)是從小到大毅弧;用這個(gè)的好處是,即使在高并發(fā)情況下Zset中也不會存在重復(fù)數(shù)據(jù)從而影響正常的業(yè)務(wù)当窗;而且分頁效率也和list結(jié)構(gòu)差不多够坐;
③:用hash和Zset來一起實(shí)現(xiàn);這個(gè)是問了一個(gè)朋友和得知的崖面,Zset中存儲有序的id字段元咙,通過分頁后拿到id,然后再用id去hash中取巫员,感覺應(yīng)該效率相差不大的庶香,只是中間多了層從hash結(jié)構(gòu)取,還需要維護(hù)又一個(gè)hash简识;(為何這樣做我也不清楚)赶掖;
貼一張我測試list和ZSet的結(jié)果圖