如何使用Redis進行排序操作

2021-09-24 00:06:43 字數 1780 閱讀 4537

本篇文章來介紹如何借助redis的zset集合有序特性來幫助我們進行資料排序。

我們在實際的開發過程中經常會遇到這樣乙個問題,需要高頻次德對某個業務資料集進行某種規則的排序,如果是普通的排序,一般的方法就可以實現,我們這裡強調的是海量資料、高頻次的更新排序場景,如對上千萬、上億的資料進行排序操作。這時候需要我們花大量的時間和精力去尋找一種高效的排序演算法,但往往需要各種因素的取捨,搞不好就要記憶體溢位,cpu爆棚等等負面影響,我們需要一種更好的演算法,來解決這些問題。

redis支援多種資料型別,有string、list、hash、set、sorted set等等。

其中sorted set有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯乙個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

有序集合的成員是唯一的,但分數(score)卻可以重複。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是o(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。

通過對sortedset特性分析:元素是string型別的集合、成員不重複、排序因子可以重複、hash表資料結構降低了操作複雜度、成員數量龐大

看完這些優良的特性,是不是感覺如果不用來進行海量資料的排序都浪費了。

生成1000w條資料,並對這些資料進行排序,拿出前30條

這是簡單的資料結構,所以1000w條耶只用了2.7秒就插入了

對前面的10條資料的score進行修改

public void sorteduserlist(int size) ", starttime);

while (size > 0)

long numsize = redistemplate.opsforzset().size("userset");

set set = redistemplate.opsforzset().range("userset", 0, 30);

logger.info("first 30 :[{}]", set);

logger.info("end program:{}[{}ms]", numsize, system.currenttimemillis() - starttime);

}

再取出30條

由上可以看出,把元素的score修改之後,其對應的順序會自動排序。

在實際業務場景中可以靈活應用score的選擇來達到對應的排序目的。

使用jedis對redis進行操作

操作redis的工具類 jedis redis 資料庫的名字 jedis 工具類的名字 使用jedis操作redis時,需要匯入jar包 建立jedis物件 jedis jedis newjedis localhost 6379 呼叫方法執行redis指令 每一條指令,都有乙個方法 jedis.se...

如何使用REDIS進行微服務間通訊

如何使用redis進行微服務間通訊 盡可能避免service to service通訊。為此,需要在服務之間推乙個訊息佇列。回顧一下微服務的概念 小型的,非常集中的程序彼此獨立執行並且易於維護,輕鬆的溝通,簡單的水平擴充套件,能夠在不影響平台其餘部分的情況下工作和更改單個服務。redis提供了生產 ...

使用Redis進行限流

通過使用註解 提供介面形式與引數形式2種方式 針對性的對介面進行限流,底層使用redis配合lua指令碼實現令牌桶。public class redisratelimiter public boolean tryacquire string flag,int maxpermits,int addra...