序文
最近、作品は、プログラマはコードをコピーしませんが、過去に一行ずつコピー直します。さて、作品が所有するスクリプトは、メインのペンは常に感じて
think more, code less
、より多くの思考も、タイトルをエコーされ、できるだけを書くことだけ怠惰な製造の生産性をより少ないコードを書くことができます。最後の書き込み以下のペンは、生産性の主なリリースがあるかを示すために皆のために再度、今回のツールが優れています。
需要の背景
プロジェクトは、多くの場合、タッチアップ需要を持っているだけで大衆マイクロチャネル番号のメッセージです。また、複数のタグをユーザー間でユーザーを複製することだけではもはや発行したユーザによって発行されて再する必要がある、これらは重い行く必要があります。
ソリューション
两层循环遍历
:まさか時間複雑N側の二組を介して、最も低いループではありません。HashSet
:小さなパートナーの少しの追求は、時間の複雑さが低い、はい、HashSetのは確かに良い選択である、HashSetの重い使用することを考えるかもしれません。しかし、データの膨大な量の顔は、HashSetのはあまり適切と思われる、HashSetのは弱点があることがあり、スペースの使用率が低いが、占有スペースの要素が比較的大きいです。布隆过滤器
:大量データ重複シーンでは、ブルームフィルタは、多くのオンラインブログは非常に詳細ではと言わブルームフィルタにされて入ってきました。
ここでは、現実世界のプロジェクトに適用する方法に焦点を当て、ブルームフィルタのキーポイントについて簡単にオーサリング。
ブルームフィルタ
使用场景
:大量のデータの要素かどうかを判断するには。存储结构
:使用して比特
ストレージアレイ。添加元素
:- 各添加元素、k個のハッシュの、すなわち異なる要素。
- k個のハッシュ・アレイに対応する上記位置の結果が1に設定されています。
检查元素
:- 要素の計算k個のハッシュ値が照会されます。
- kの位置がある場合は、確かにないセットでは、0です。
- すべてのポジションが1 k個の場合、それは、コレクションであってもよいです。
なぜ、k個のハッシュが必要なのでしょうか?
主に、HashMapのために、衝突をハッシュする時間をハッシュ衝突に起因する誤差を低減するために、それはチェーンと赤黒木になり又は紛争のすべての要素が保存されています。しかし、ブルームのためにあなたがすることはできませんフィルタリングして、彼は唯一のキーが存在するかどうかを判断する必要があるので、一緒にキーの競合のリストを接続する必要があります。
ブルームフィルタが占めるスペースの大きさを計算する方法は?
あなたは計算にこのオンラインツールを使用することができます:フィルタ電卓をBLOOM
再ツールにジェスチャーを使用して
具体的な実施プロセスを導入する前に、ラインとジェスチャー重い工具の正しい使用に作家の手を見てみましょう。
1.設定ブルームフィルタ情報
大会には、上の再プロフィールにあるdeduplication.properties
次の。
bloomList=goods,wechat
tableInfo=goods:goods_deduplication,wechat:wechat_deduplication
expectedInsertions=goods:200000
复制代码
bloomList
:ブルームフィルタBean名は、サービスは、カンマで区切られた複数の値のうち、加重値に相当します。tableInfo
:ブルームフィルタデータは、テーブル名に対応するデフォルト値が設定されていません。expectedInsertions
:データのブルームフィルタの推定量は、データの精度に大きな影響を与え、実際の業務に基づいて評価する必要がある、デフォルト値は10万人。
再使用2.
上記構成情報の完了後、あなたは、以下のコードの芯線に示すようにジェスチャーを使用して、量を制御するために使用することができます。ブルームが着信Bean名をフィルタリングするリストやサービスに対応を比較するために、次の重量に進み、まだ存在しないレコードを返し、そしてレコードがストレージに置かれます、レコードが再び起こることはありません。
試験手順:
次のようにプログラムを実行する前に、既存のデータは、12,16,13が既に存在するレコードの識別子です。
プログラムの結果:
データベースの状態:
私たちは、レコード11、14、返品、成功したストレージの成功を見ることができます。
再ソースコード解析
以下ではまず、コードを解析する前に、達成するための手順を計量コアの周りに主に✨✨アドレスに再ソースコード星へようこそステッカー、喜喜喜、。以下、このパッケージの重複排除におけるツールのコアコード。
設計目標
任意の固有の識別リストを入ってくる、または一意にどのようなビジネスのために、重い識別するためにCSVファイルを指定して適用されます。
アイデアの実現
创建布隆过滤
:重いビジネスのために行く対応するブルームフィルタを必要とします。初始化布隆过滤器
:対応するデータベーステーブルから取ら各ブルームフィルタデータを初期化します。使用布隆过滤器
:使用ブルームは、ストレージが存在するか否かを判定する初期化後の要素をフィルタリングします。
手順は簡単ですが、あなたが達成したいエレガントなポイントは、簡単にそれを使用するか、考える必要があります。
ブルームフィルタを作成します。
ここで、著者によって使用されるブルームフィルタを提供グアバを達成することである、とホイールを全く作成重複がない、結局、Googleが作成しました。
主な問題ここでは2つのポイントがあります。
- ブルームフィルタは、一度作成するグローバル効果的な必要があり、一つの例であり、Springコンテナ管理にブルームフィルタ、解決この問題は、清潔で非常に、あなたの手をたたくことができます。
- 伝統的な作成グアバブルームフィルタを使用することである
BloomFilter#create()
方法を、私たちの目標は怠け者です!最後に怠惰!重いビジネスを追加する理由は、我々はそれのうち、ブルームフィルタを新しい、コードを探す必要はありません。そこでここでは、必要とするSpring 容器动态注册 bean
あなたは春が提供する使用することができ、能力がBeanDefinitionRegistryPostProcessor
この機能を実現するためのインターフェイスを。
ブルームフィルタコアコードを作成します。
上記の4つのキーポイントを示しました:
- [1]設定ファイルからすべてのBean名を削除します。
- [2]豆循環リスト、動的登録ビーン。
- [3]初期化初期化状態識別ブルームフィルタが偽である、ブルームフィルタの識別子がまだある
not ready
状態、開いて使用することができません。 - [4]春容器ブルームフィルタに登録のbeanIdと呼ばれます。
上記の手順の後、我々は、ブルームフィルタのすべてを作成しました。
初期ブルームフィルタ
このステップは、データベースからデータを照会するために主にされ、その後、ブルームフィルタに詰め。友人が一人でこのステップを実行する理由を初期化する必要があり、要求されますがあるかもしれませんか?直接豆の初期設定の作成でリストに載っていません。主に動的豆の登録時に、コンテキスト容器が準備段階ではなかったです。コンテナでは、他のBeanに取得することはできません。だから我々は唯一の行うこの段階で初期化することができます。
ここでApplicationListenerのリスニングに使用著者は、彼がSpringBootアプリケーションのライフサイクルを監視することができ、ここで著者は、実行するためにそこに置かれているブルームフィルタの初期の作品のSpringBootの完了後にイベントを起動するために耳を傾けます。
DeduplicationApplicationListenerリスナーのコアコード:
- [1]の終了後、リスナーアプリケーション起動イベントを選択します。
- [2]全てのブルームフィルタ名を削除します。
- [3]スレッドコールが開始
initBloomFilter()
各ブルームフィルタを初期化します。
initBloomFilter 方法:
- [1]着信得るBeanインスタンスブルームフィルタ名、ここでは主によって
ApplicationContextAware
動的Beanインスタンスを取得します。 - [2]、着信ブルームフィルタ名に応じて対応するデータベーステーブルを取得します。
- 現在のデータベーステーブルが存在しない場合は[3]、テーブルの構築の直後に戻ります。
- [4]別段呼
fillBloomFilter
方法。
fillBloomFilter 方法:
データがデータベースに存在する主な仕事は、典型的には、ステップデータクエリのうち非常になり、ここでセグメンテーションを照会タスクを選択し、マルチスレッドクエリ、次いでサブタスクをマージブルームフィルタに詰めされ、はい!リファレンスは、MapReduceのことを考えています。
データが詰めされた後に、ブルームフィルタは、ユーザに利用可能にすることができ、そのためブルームフィルタに対応する初期状態はtrueに設定されます。
上記の手順の後に、ブルームフィルタの初期化は、ブルームフィルタの特定のカプセル化に使用することができる以下、完了しています。
ブルームフィルタパッケージ
このステップでは、ブルームフィルタをパッケージ化する主なので、それは主支持2つの重量へのデータソースの種類、およびは、リストCSVファイルされている場合、使用する方が便利です。ここでは、バッチの重複除外され、ストレージは大容量記憶装置です。単一のレコードを加重する場合は、例えば、ろ過ブラックリストには、それはそれ自身の対応するサービスパッケージを必要とする、なぜなら結局、同じサービスの異なるユーザまたはありません。
二つの方法の外部被ばく:
外出先では、内部使用のみのために、オーバーロードされた関数です。
- [1]リストは存在しない要素を見つけます。
- [2] CSVファイル内のレコードを検索するには存在しません。
- [3]大容量記憶装置。
ここでは、findNotExistRecordFromList方法を見てください。それはブルームフィルタが存在しないと判断された場合、非常に単純な、入ってくるリストを横断、それは返される結果セットに追加されます。
最後に書かれました
重複排除機能についてここでそれを紹介するコアステップであり、実装の詳細については、興味のある友人はgithubの上のコードに行くことができるハを見るためにフォークを置く、問題は私と共有すること自由に感じなさいがあります。
まあ波広告を戦います
✨github:cranberry✨は、著者は主に、いくつかの一般的な質問とJavaのWeb開発プロセスの分析を達成するために、最近のプロジェクトに書いた、フォローアップを継続的に更新されますされ、我々は手助けをしたい、あなたもやって良い感じることができます1スターああ!