在實際業務中咱們會將一些熱數據緩存到redis裏面,這時候數據量比較大的話,咱們就要對這些熱數據進行分頁,分頁的方式有2種:redis
第一:從redis拿出全部數據後,再作內存分頁(不推薦),熱點數據小的時候能夠這樣作,性能相差不是很大,可是當數據量大的時候,分頁期間就會佔用大量內存,或撐爆;緩存
第二:基於redis的數據結構作緩存分頁,這裏又分2種數據結構
①:基於redis的list數據結構,直接經過list的數據結構,用range方法能夠進行分頁,在數據量大的時候,性能也很可觀,可是當存在接口高併發訪問時,這個list可能會無限延長,且裏面的數據會存在不少重複,這就會影響到正常的業務(不是很推薦);併發
②:基於redis的ZSet數據結構,經過Zset這個有序集合咱們也能夠作分頁,一樣也是用range方法,可是這裏比較麻煩的是在初始化數據的時候Zset必須存放TypedTuple類型的數據,這個類型是一個value和score的鍵值對,具體能夠查百度,這個score的生成比較麻煩我這邊測試時用的是當前數據在這個list的位置,而後Zset是根據這個score值來排序的,默認是從小到大;用這個的好處是,即便在高併發狀況下Zset中也不會存在重複數據從而影響正常的業務;並且分頁效率也和list結構差很少;高併發
③:用hash和Zset來一塊兒實現;這個是問了一個朋友和得知的,Zset中存儲有序的id字段,經過分頁後拿到id,而後再用id去hash中取,感受應該效率相差不大的,只是中間多了層從hash結構取,還須要維護又一個hash;(爲什麼這樣作我也不清楚);性能
貼一張我測試list和ZSet的結果圖測試