公司部門同事有個需求,就是須要把當前另外一個部門a中存儲的數據所有導出來,本身當前業務b的數據所有導出來,兩個要取一下差集,把a中存在,b中不存在的記下來,要去調用某接口把對應的文件刪除。這個我感受可使用redis的集合來進行操做,可是考慮到數據量特別大,文件有200G,內存估計不夠用,暫時還不知道咋整。redis
redis中集合的操做方法
sADD 添加一個或多個成員到集合裏面
sCard, sSize 獲取一下集合中成員的個數
sDiff 在N個集合中比較出差集
sDiffStore 和sDiff差很少,可是把差集結果存儲在第一個key裏面
sInter 返回多個集合的交集
sInterStore 和sInter相似,把結果存儲在第一個key裏面
sIsMember, sContains檢查參數中的成員是不是集合中的一員
sMembers, sGetMembers 得到集合中的全部成員
sMove 把集合中的成員從一個集合移動到另外一個集合
sPop 在集合中隨機刪除一個並獲取到這個成員
sRandMember 在集合中隨機獲取一個成員,並不刪除它
sRem, sRemove 在集合中刪除指定成員
sUnion 返回多個集合的並集
sUnionStore 把多個集合的並集存儲在第一個參數key裏面緩存
由於redis的集合是使用的哈希表實現的,所以是無序的,而且對單個元素的處理和判斷都是高效的。也能夠看獲得在進行多個成員的處理時,時間複雜度都是O(N),對單個成員進行查找刪除判斷是否存在等處理時,時間複雜度都是O(1)對象
sPop sRandMember,這種能夠在集合中取出隨機值的能夠用在抽獎場景下
並集交集差集,能夠用在實時性比較高的大量數據的取集合操做接口
當須要對大量的數據進行集合的操做,好比判斷是否存在的需求時,可使用布隆過濾器
布隆過濾器能夠理解爲一個不怎麼精確的 set 結構,當你使用它的 contains 方法判斷某個對象是否存在時,它可能會誤判。可是布隆過濾器也不是特別不精確,只要參數設置的合理,它的精確度能夠控制的相對足夠精確,只會有小小的誤判機率。內存
當布隆過濾器說某個值存在時,這個值可能不存在;當它說不存在時,那就確定不存在
主要是解決大規模數據下不須要精確過濾的場景,如檢查垃圾郵件地址,爬蟲URL地址去重,解決緩存穿透問題等。io
看網上的文章有說在內存超過指定值時,redis會刪除失效數據,而且這個時候進行sADD會報超時,這種狀況由於我還沒遇到過這種場景,也沒見過。cli
查看redis佔用的內存大小:
redis-cli
info memorynio