序文
最近、Huawei Cloud Yaoyun Server L インスタンスがリリースされ、私も構築して遊んでみましたが、その過程でさまざまな問題に遭遇し、問題を解決する過程での運用保守について多くのことを学びました。
このブログでは、Redis Docker コンテナに BloomFilter をインストールし、Spring と組み合わせる方法を紹介します。
その他の関連する Huawei Cloud Yaoyun Server L インスタンスの評価記事のリストは次のとおりです。
-
Java8 環境のインストール & 環境変数の設定 & Spring プロジェクトのデプロイ & [!] 未解決の問題があります
-
Spring プロジェクトのデプロイ ポート開放問題の解決策とサーバー プロジェクト環境のセットアップ MySQL、Redis、Minio... ガイド
-
Redis の不正アクセスの脆弱性と脆弱性の部分的な再発を理解し、接続パスワードを設定し、他の Redis コマンドを学習する
-
Canal イメージ設定関連のパラメータを取得して作成し、MySQL データベースに接続するために Canal を構築し、Spring プロジェクト アプリケーションの Canal を準備します
-
Minio の Docker バージョンのインストールと Springboot プロジェクトでの使用、およびイメージ アクセス用の vue との組み合わせ
記事ディレクトリ
導き出す
1. Redis Docker コンテナに BloomFilter をインストールします;
2. Spring で Bloom フィルターの Redis プラグイン バージョンを使用します。
1. Redis に BloomFilter をインストールする
1.公式サイト参考資料
https://redis.io/resources/modules/
https://redis.io/docs/data-types/probabilistic/bloom-filter/
https://github.com/RedisBloom/RedisBloom
2.公式ウェブサイトのコードをクローンする
apt-get install -y git
git clone --recursive https://github.com/RedisBloom/RedisBloom.git
3.cmakeをインストールする
sudo apt install cmake
エラーが報告されました。cmake をインストールする必要があります
sudo apt install cmake
4. 全体としてコンパイルする
コンパイルするmakeコマンド
コンパイルされたsoファイル
5.soファイルをコピーして設定します。
docker cp redisbloom.so redis_6379:/usr/local/etc/redis
loadmodule /root/Redis/RedisBloom/bin/linux-x64-release/redisbloom.so
ビュー・ログ
6. 予備使用
docker exec -it redis_6379 bash
root@706d04b2ea4d:/data# redis-cli
127.0.0.1:6379> auth XXX
OK
127.0.0.1:6379> BF.ADD bmFilter tom123
(integer) 1
127.0.0.1:6379> BF.exists bmFilter tom123
(integer) 1
127.0.0.1:6379> BF.exists bmFilter tom124
(integer) 0
127.0.0.1:6379>
その他のコマンド
指示 | 説明 |
---|---|
BF.追加 | ブルームフィルターに要素を追加する |
BF.EXISTS | 要素がブルーム フィルターに含まれるかどうかを決定します。 |
BF.INFO | ブルームフィルターに関する情報を返します。 |
BF.インサート | 複数の要素をフィルターに追加します。キーが存在しない場合は、新しいフィルターが作成されます。 |
BF.マッド | ブルームフィルターに複数の要素を追加する |
BF.メキシコ人 | ブルームフィルターに複数の要素が含まれるかどうかを決定します。 |
BF.リザーブ | ブルームフィルターを作成します。誤検知率と容量を設定する |
BF.スキャンダンプ | ブルーム フィルターの段階的な保存を開始します。 |
BF.ロードチャンク | BF.SCANDUMP を使用して以前に保存したブルーム フィルターを復元します。 |
2. luaスクリプトと組み合わせてSpringで利用
1. Luaスクリプトの書き方
127.0.0.1:6379> BF.ADD bmFilter tom123
-- lua脚本
local key1 = KEYS[1] --key是从1开始
local argv1 = ARGV[1] --第一个值
-- 使用redis的命令 BF.ADD
local retVal = redis.call('BF.ADD',key1,argv1)
-- 将结果返回
return retVal
@Bean
public RedisScript<Long> bloomFilter(){
DefaultRedisScript redisScript = new DefaultRedisScript<>();
redisScript.setResultType(Long.class);
// lua脚本的位置
redisScript.setLocation(
new ClassPathResource("/lua/bloom-demo.lua") // 关联lua脚本
);
return redisScript;
}
package com.tianju.fresh.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class BloomFilterTest {
@Resource
private RedisScript bloomFilter;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testLuaBloom(){
List<String> keys = new ArrayList<>();
keys.add("testFilter"); // redis的bloom的key
Object result = stringRedisTemplate.opsForValue().getOperations()
.execute(bloomFilter, keys, "pet365");
System.out.println("Lua脚本返回结果:"+result);
}
}
2. lua スクリプトを使用しない方法
package com.tianju.fresh.service;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class BloomFilterTest {
@Resource
private RedisScript bloomFilter;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testLuaBloom2(){
List<String> keys = new ArrayList<>();
keys.add("helloFilter"); // redis的key
String script = "return redis.call('BF.ADD',KEYS[1],ARGV[1])";
Long result = stringRedisTemplate.opsForValue()
.getOperations()
.execute(
new DefaultRedisScript<>(script, Long.class),
keys,
"apple"
);
System.out.println("无lua脚本:"+result);
}
public static void main(String[] args) {
System.out.println(Stream.of("abcd").collect(toList()));
}
}
要約する
1. Redis Docker コンテナに BloomFilter をインストールします;
2. Spring で Bloom フィルターの Redis プラグイン バージョンを使用します。