前言
最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。
本篇博客介绍如何在Redis的docker容器中安装BloomFilter,并且结合spring的使用方式。
其他相关的华为云云耀云服务器L实例评测文章列表如下:
-
初始化配置SSH连接 & 安装MySQL的docker镜像 & 安装redis以及主从搭建 & 7.2版本redis.conf配置文件
-
安装Java8环境 & 配置环境变量 & spring项目部署 &【!】存在问题未解决
-
部署spring项目端口开放问题的解决 & 服务器项目环境搭建MySQL,Redis,Minio…指南
-
由于自己原因导致MySQL数据库被攻击 & MySQL的binlog日志文件的理解
-
认识redis未授权访问漏洞 & 漏洞的部分复现 & 设置连接密码 & redis其他命令学习
-
拉取创建canal镜像配置相关参数 & 搭建canal连接MySQL数据库 & spring项目应用canal初步
-
Docker版的Minio安装 & Springboot项目中的使用 & 结合vue进行图片的存取
文章目录
- 前言
- 引出
- 一、Redis里面安装BloomFilter
- 1.官网参考文档
- 2.clone官网的代码
- 3.安装一下cmake
- 4.进行整体编译
- 5.拷贝so文件,进行配置
- 6.使用初步
- 二、结合lua脚本在spring中使用
- 1.编写lua脚本的方式
- 2.不使用lua脚本的方式
- 总结
引出
1.在Redis的Docker容器中安装BloomFilter;
2.在Spring中使用Redis插件版的布隆过滤器;
一、Redis里面安装BloomFilter
1.官网参考文档
https://redis.io/resources/modules/
https://redis.io/docs/data-types/probabilistic/bloom-filter/
https://github.com/RedisBloom/RedisBloom
2.clone官网的代码
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>
其他命令
Command | Description |
---|---|
BF.ADD | 添加一个元素到布隆过滤器 |
BF.EXISTS | 判断元素会不会在布隆过滤器 |
BF.INFO | 返回有关布隆过滤器的信息 |
BF.INSERT | 将多个元素添加到过滤器。如果键不存在,它会创建一个新的过滤器。 |
BF.MADD | 添加多个元素到布隆过滤器 |
BF.MEXISTS | 判断多个元素会不会在布隆过滤器 |
BF.RESERVE | 创建一个布隆过滤器。设置误判率和容量 |
BF.SCANDUMP | 开始增量保存 Bloom 过滤器。 |
BF.LOADCHUNK | 恢复之前使用BF.SCANDUMP保存的布隆过滤器。 |
二、结合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中使用Redis插件版的布隆过滤器;