redis整理01——redis、mysql的安装与使用及使用布隆过滤器

2024-08-13

说明

window系统、Docker Desktop、redis 7.0、mysql 8.0、redis-stack 7.4.0

新电脑,演示并记录docker使用mysql、redis、布隆过滤器

下载Hyper-V

此步非必选,不下载Hyper-V的话,安装Docker Desktop时要勾选"使用WSL 2替代Hyper-v"选项

image-20240805163330866

下载Docker Desktop

国内不可访问:Docker Desktop: The #1 Containerization Tool for Developers | Docker

重启计算机
配置仓库镜像
拉取redis和mysql镜像
启动redis和mysql容器

image-20240805181137468

mysql8.0 my.cnf 默认内容

mysql简单使用
远程链接
docker常用命令

docker-compose参考:Linux-Docker部署.netCore程序 (logerlink.github.io)

带有布隆过滤器的redis
安装布隆过滤器

22. Redis---布隆过滤器 - v_jjling - 博客园 (cnblogs.com)

我看好多都是使用redislabs/rebloom,不过redislabs/rebloom 已不维护,推荐使用redis-stack,自带RedisInsight可视化页面——http://localhost:8001/redis-stack/browser。生产环境可以使用redis-stack-server,不包含RedisInsight,所以不需要指定8001端口

image-20240811152614971

命令提示

方便是方便,不过有点可惜的是redis-stack的redis命令没有提示,我们可以使用redis链接redis-stack,这样就有命令提示了

image-20240811162423861

布隆过滤器

使用场景:高并查询时,有效避免缓存穿透,缓解数据库压力

含义:布隆过滤器是一种redis的数据结构,由一个bit位数组组成,内部存储二进制内容,占据空间小且数据检索快

特点空间效率查询时间的高效性,而且redis比sql数据库能抗下更高的并发量

缺点:无法删除元素,小几率出现误判(误判率可设置,误判率越小,存储时使用空间越大,hash运算可能也会更多)

如何使用?

存储时,将数据进行多次hash运算取模得到多个下标(如进行五次运算分别得到五个下标2,6,15,88,125),将这些坐标都改成1

查询时,将数据进行多次hash运算取模得到多个下标(如进行五次运算分别得到五个下标2,6,15,88,125),并判断这些下标对应的值是否是1。如果有一个值一个是0,则表示不存在该数据,若这些下标的值全部是1,则表示存在该该数据

为什么出现误判率?

如有一个值 value=99999 进行多次hash运算取模得到多个下标——1,10,12,18,100,255,999,10000 并存储此时仅有99999一个元素。此时查询 value=123 ,对value=123 进行多次hash运算取模得到多个下标——10,18,255,布隆过滤器就会判断这三个下标对应的值是否为1 => 结果刚好为1,出现hash碰撞,但实际并不存在的123这个元素,这样,便出现了误判率

可以修改误判率吗?

可以,通过BF.RESERVE bloom:key 0.001 1000 可以创建并指定误判率和容量为0.001 1000。默认:0.01 100

如果自己实现应该如何降低误判率?

可以从这两方面入手:

  • 增加hash运算取模,用更多的下标表示一个数据——升级CPU应对
  • 增加bit位数长度,让下标更分散,减少hash碰撞——增加内存应对

误判率是不是越小越好?

并不是,误判率越低,误判率越小,存储时占用的内存空间会越大。存储和查询时的hash运算次数可能也会变得更多,影响效率

基本命令演示

image-20240813184031618

BF.SCANDUMP key cursor,扫描数据,返回cursor和数据,cursor返回0表示扫描结束。记得把cursor和数据保存,用于LOADCHUNK。SCANDUMP执行多少次,LOADCHUNK就要执行多少次,不然恢复数据失败。BF.LOADCHUNK key cursor "data"

参考:BF.SCANDUMP | Docs (redis.io)

image-20240813182901764

值得注意
  • 可以使用del key删除布隆过滤器,但是不支持移除成员
  • BF.ADD、BF.MADD、BF.INSERT (不指定NOCREATE参数)执行时,不存在key时自动创建布隆过滤器key,默认值:Capacity: 100; error_rate:0.01。也可以主动执行 BF.RESERVE 创建key,自定义初始容量和误判率
  • BF.RESERVE error_rate越低,需要的空间越大。当过滤器内存在的数量超过指定 Capacity,会创建子过滤器误判率会增加。所以一开始要准备好 Capacity
  • BF.INSERT 若指定NOCREATE参数,不存在key时则不创建key并报错——(error) ERR not found。若指定NONSCALING参数,当过滤器达到最大容量时,不创建子过滤器,并报错——ERR non scaling filter is full
代码使用-c#

使用参考:RedisTest/RedisTest.Share/RedisClient.cs at main · logerlink/RedisTest (github.com)
c#使用布隆过滤器