初识布隆过滤器BloomFilter

布隆过滤器 - Bloom Filter 布隆过滤器 - Bloom Filter 文章目录布隆过滤器 - Bloom Filter0.引言1.使用场景2.什么是布隆过滤器(1) 数据结构(2) 原理(3) 使用 参考链接: 1:JavaGuide - 布隆过滤器 2:亿级数据过滤和布隆过滤器 0.引言 P:我们平时在刷抖音时,开发人员如何保证 不会刷到同样的内容 ? 1:把算法推荐中的内容根据历史记录做一遍筛选?在用户量大,用户查看内容多的场景,性能低 2:历史记录全部计入缓存?资源量大,并且会随着时间逐渐上涨,服务器耗费up 3:布隆过 阅读详情

一、认识:

      布隆过滤器,英文叫BloomFilter,可以说是一个二进制向量和一系列随机映射函数实现。 可以用于检索一个元素是否在一个集合中。

二、原理:

数据存储示意图-->

说明:bit数组中以n个索引位(n个不同的hash算法后的产生的索引)表示一个数据

小结:

  • 布隆过滤器是用于判断一个元素是否在集合中。通过一个位数组和N个hash函数实现。
  • 注意:布隆过滤器有宁可错杀一百,也不能放过一个的特质,只会误报,不会漏报
  • 优点:
  1. 空间效率高,所占空间小。
  2. 查询时间短。
  • 缺点:
  1. 元素添加到集合中后,不能被删除。
  2. 有一定的误判率

三、使用场景:

  • 网页爬虫对URL的去重,避免爬去相同的URL地址。
  • 垃圾邮件过滤,从数十亿个垃圾邮件列表中判断某邮箱是否是杀垃圾邮箱。
  • 解决数据库缓存击穿,黑客攻击服务器时,会构建大量不存在于缓存中的key向服务器发起请求,在数据量足够大的时候,频繁的数据库查询会导致挂机。
  • 秒杀系统,查看用户是否重复购买

四、实现方式:

根据布隆过滤器的原理,其实各种语言都有相应的实现,比如java、python、scala、redis、lua等等,各自有各自的优化,目的都是为了降低误报率和空间利用率。

1)Java实现

import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.BitSet;

public class CustomBloomFilter {

    //数据个数
    private int size;

    //bit[]长度
    private int bitSize;
    //bit[]容器
    private BitSet bitMap;

    //hash函数个数
    private int hashNum;
    //误判率
    private double cap;


    /**
     *
     * @param size 数据量
     * @param cap 误判率
     */
    public CustomBloomFilter(int size, double cap) {
        this.size = size;
        this.cap = cap;
    }

    /**
     * 初始化数据至容器
     */
    public synchronized void init(){
        if(this.bitSize == 0){
            this.bitSize = (int)((-size * Math.log(this.cap)) / (Math.pow(Math.log(2),2)));
        }
        if(this.hashNum == 0){
            this.hashNum = Math.max(1,(int)Math.round(this.bitSize / this.size * Math.log(2)));
        }
        if(this.bitMap == null) {
            bitMap = new BitSet(this.bitSize);
        }
        System.out.println("this.bitSize :" + this.bitSize);
        System.out.println("this.hashNum :" + this.hashNum);

    }

    /**
     * 添加元素至容器中
     * @param ele
     */
    public void add(String ele){

        if(bitMap == null){
            init();
        }
        int[] posArr = getIndexs(ele);

        for (int t : posArr) {
            bitMap.set(t,true);
        }
    }

    /**
     * 判断元素是否存在
     * @param ele 元素
     * @return
     */
    public boolean isExist(String ele){
        int[] posArr = getIndexs(ele);
        boolean flag = true;
        for (int t : posArr) {
            flag = flag && bitMap.get(t);
        }
        return flag;
    }

    /**
     * 获取元素计算得出的下标集
     * @param ele 元素
     * @return
     */
    public int[] getIndexs(String ele){
        int[] retArr = new int[this.hashNum];
        for (int i = 0; i < this.hashNum; i++) {
            retArr[i] = HashUtil.md5Hash(ele + i) % this.bitSize;//运用算法得出下标
        }
        return retArr;
    }


    public static class HashUtil{

        public static int md5Hash(String ele){
            try {
                // 生成一个MD5加密计算摘要
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 计算md5函数
                md.update(ele.getBytes());
                // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
                // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
                //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
                String s = new BigInteger(1, md.digest()).toString(16);
                return Arrays.hashCode(s.getBytes()) & Integer.MAX_VALUE;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
    }


    public static void main(String[] args) {

        CustomBloomFilter bloomFilter = new CustomBloomFilter(10000,0.003);

        for (int i = 0; i < 10000; i++) {
            bloomFilter.add("abc" + i);
        }

        int count = 0;
        for (int i = 0; i < 20000; i++) {
            if(bloomFilter.isExist("abc" + i)){
                count++;
            }
        }
        System.out.println("count:" + count);
    }

}

2)Redis实现

RedisBloom模块不仅仅实现了布隆过滤器,还实现了 CuckooFilter(布谷鸟过滤器),以及 TopK 功能。CuckooFilter 是在 BloomFilter 的基础上主要解决了BloomFilter不能删除的缺点。

#安装RedisBloom模块
git clone https://github.com/RedisBloom/RedisBloom.git
cd RedisBloom
make #编译 会生成一个rebloom.so文件
redis-server --loadmodule /path/to/rebloom.so
redis-cli -h 127.0.0.1 -p 6379
复制代码
127.0.0.1:8001>  bf.reserve bloom_filter_test 0.0000001 1000000
OK
127.0.0.1:8001>  bf.reserve bloom_filter_test 0.0000001 1000000
(error) ERR item exists
127.0.0.1:8001>
127.0.0.1:8001>
127.0.0.1:8001> bf.add bloom_filter_test key1
(integer) 1
127.0.0.1:8001> bf.add bloom_filter_test key2
(integer) 1
127.0.0.1:8001>
127.0.0.1:8001> bf.madd bloom_filter_test key2 key3 key4 key5
1) (integer) 0
2) (integer) 1
3) (integer) 1
4) (integer) 1
127.0.0.1:8001> bf.exists bloom_filter_test key2
(integer) 1
127.0.0.1:8001> bf.exists bloom_filter_test key3
(integer) 1
127.0.0.1:8001> bf.mexists bloom_filter_test key3 key4 key5
1) (integer) 1
2) (integer) 1
3) (integer) 1
127.0.0.1:8001>

 注释:

  • bloom filter定义

BF.RESERVE {key} {error_rate} {capacity}
     使用给定的期望错误率和初始容量创建空的Bloom过滤器(如果不存在的话)。如果打算向Bloom过滤器中添加许多项,则此命令非常有用,否则只能使用BF.ADD 添加项。
初始容量和错误率将决定过滤器的性能和内存使用情况。一般来说,错误率越小(即对误差的容忍度越低),每个过滤器条目的空间消耗就越大。

  • BF.ADD {key} {item}

单条添加元素
向Bloom filter添加一个元素,如果该key不存在,则创建该key(过滤器)。如果项是新插入的,则为“1”;如果项以前可能存在,则为“0”。

  • BF.MADD {key} {item} [item...]

批量添加元素
布尔数(整数)的数组。返回值为0或1的范围的数据,这取决于是否将相应的输入元素新添加到过滤器中,或者是否已经存在。

  • BF.EXISTS {key} {item}

判断单个元素是否存在
如果存在,返回1,否则返回0

  • BF.MEXISTS {key} {item} [item...]

判断多个元素是否存在
布尔数(整数)的数组。返回值为0或1的范围的数据,这取决于是否将相应的元是否已经存在于key中。

  • bf.insert

bf.insert{key} [CAPACITY {cap}] [ERROR {ERROR}] [NOCREATE] ITEMS {item…}
该命令将向bloom过滤器添加一个或多个项,如果它还不存在,则默认情况下创建它。有几个参数可用于修改此行为。
key:过滤器的名称
capacity:如果指定了,应该在后面加上要创建的过滤器的所需容量。如果过滤器已经存在,则忽略此参数。如果自动创建了过滤器,并且没有此参数,则使用默认容量(在模块级指定)。见bf.reserve。
error:如果指定了,后面应该跟随着新创建的过滤器的错误率(如果它还不存在)。如果自动创建过滤器而没有指定错误,则使用默认的模块级错误率。见bf.reserve。
nocreate:如果指定,表示如果过滤器不存在,就不应该创建它。如果过滤器还不存在,则返回一个错误,而不是自动创建它。如果需要在创建过滤器和添加过滤器之间进行严格的分离,可以使用这种方法。将NOCREATE与容量或错误一起指定是一个错误。
item:指示要添加到筛选器的项的开头。必须指定此参数。

  • bf持久化操作

BF.SCANDUMP {key} {iter}

对bloom过滤器进行增量保存。这对于不能适应常规save和restore模型的大型bloom filter非常有用。
第一次调用这个命令时,iter的值应该是0。这个命令将返回连续的(iter, data)对,直到(0,NULL),以表示完成

  • blool filter数据类型的属性

   bf.debug

127.0.0.1:8001> bf.debug bloom_filter_test
1) "size:5"
2) "bytes:4194304 bits:33554432 hashes:24 hashwidth:64 capacity:1000200 size:5 ratio:1e-07"

3)Google guava实现:

 对于Google布隆过滤器来说,在不做任何设置的情况下,默认的误判率为0.03

 引入jar包

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>22.0</version>
</dependency>

 测试

         BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 10000,0.003);
         for (int i = 0; i < 10000; i++) {
            bloomFilter.put("abc" + i);
        }

        int count = 0;
        for (int i = 0; i < 20000; i++) {
            if(bloomFilter.mightContain("abc" + i)){
                count++;
            }
        }
        System.out.println("count:" + count);

 拓展:

该文章 对比了布隆过滤器和布谷鸟过滤器,相比布谷鸟过滤器,布隆过滤器有以下不足:

  • 查询性能弱 查询性能弱是因为布隆过滤器需要使用N个 hash函数计算位数组中N个不同的点,这些点在内存上跨度较大,会导致CPU缓存命中率低。
  • 空间利用效率低 在相同的误判率下,布谷鸟的空间利用率要高于布隆过滤器,能节省40%左右。
  • 不支持删除操作 这是布谷鸟过滤器相对布隆过滤器最大的优化,支持反向操作,删除功能。
  • 不支持计数

五、公式推导:

redis 布隆过滤器 BloomFilter 文章目录1、什么是布隆过滤器?1.1工作原理1.2布隆过滤器的优点1.3缺点2、布隆过滤器的使用场景3、布隆过滤器的原理3.1布隆过滤器的数据结构3.2初始化阶3.3插入元素过程3.4查询元素是否存在3.5元素删除3.6扩容4、SpringBoot整合布隆过滤器4.1技术选型4.2依赖4.3配置布隆过滤器相关参数4.4布隆过滤器工具类4.5业务操作。 阅读详情

相关推荐

(Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六

前言 该篇为redis使用系列的第六篇,在springboot整合redis基础上使用BloomFilter 布隆过滤器。 至于布隆过滤器的作用和实现的简单原理,该篇不做讲述,还不了解的可以先看我这篇 《JAVA 你应该有所了解的布隆过滤器》https://blog.csdn.net/qq_35387940/article/details/105217347 OK,再啰嗦一下,相信...

默默不代表沉默 9126

布隆过滤器解决缓存击穿问题

布隆过滤器

hauchun的博客 8263

Flink 结合 布隆过滤器(BloomFilter) 实现去重

Flink学习笔记(二十七):1.实时系统去重方案 使用Redis,将实时系统每条数据都去和 Redis 进行判断; 使用 HashSet,因为 HashSet 本身就是无序不重复的;         但是以上两个方案,都是存在缺陷的。如果使用 Redis,每次都需要通过网络连接 Redis 服务,这两个原因:1.网络速度明显比缓存速度慢 2...

扛麻袋的少年的博客 9300

大数据量下的集合过滤—Bloom Filter

原文地址:https://www.cnblogs.com/z941030/p/9218356.html算法背景如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路,存储位置要么是磁盘,要么是内存。很多时候要么是以时间换空间,要么是以空间换时间。在响应时间要求比较严格的情况下,如果我...

跋跋寒的博客 9289

AGM Supra软件从零到一:国产CPLD工程创建全流程实战解析

本文详细解析了AGM Supra软件在国产CPLD开发中的全流程实战操作,从工程创建到代码开发、编译调试,再到高级技巧与疑难排解。特别对比了Supra与Quartus的差异,提供了工程路径管理、Quartus项目转换、HDL代码规范等实用技巧,帮助开发者高效完成CPLD项目开发。

weixin_29193259的博客 502

DFRobot MGC3130电容式手势传感器库深度解析

电容式近场感应(Electric Near Field Sensing)是一种非接触、抗干扰的三维空间感知技术,其原理基于人体介电特性对高频电场的扰动响应,具备低功耗、高鲁棒性与零物理接触等核心优势。该技术广泛应用于医疗人机交互、工业HMI、智能家电等对可靠性与环境适应性要求严苛的嵌入式场景。DFRobot_MGC3130库正是面向Microchip MGC3130芯片的工程化实现,封装了I²C驱动、ASU硬件加速调度及多层抽象API,支持手势识别、触控检测与接近唤醒等功能动态切换。结合电容式近场感应与嵌入

weixin_34620658的博客 550

redis redisson 布隆过滤器(RBloomFilter)

redisredisson布隆过滤器 作用:在缓存层前添加布隆过滤器,可以在高并发场景下应对缓存穿透问题 **************************** 相关接口 RBloomFilter public interface RBloomFilter<T> extends RExpirable { boolean tryInit(lo...

weixin_43931625的博客 8121

单晶塑性abaqus-umat自学

单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量

Niklas4088的博客 1万+

布隆过滤器BloomFilter

通常我们会遇到要判断一个元素是否在某个集合中的业务场景,一般想到的是将集合中所有元素保存起来,然后通过比较确定。 链表、树、散列表(又叫哈希表,HashTable)等等数据结构都是这种思路。 但是随着集合中元素的增加,我们需要的存储空间也会呈现线性增长,最终达到瓶颈。同时检索速度也越来越慢,上述三种结构的检索时间复杂度分别为O(n),O(long),O(1)。 这个时候布隆过滤器(Bloom Filter)就应云而生。 布隆过滤器介绍:布隆过滤器BloomFilter实际上是一个很长的二进制数组+一系列.

奈&何. 776

OpenClaw实战系列04:Jira/Confluence深度集成实战指南

汇总 Confluence 空间 TEAM 下所有关于“性能优化”的文档,输出要点自然语言创建和查询 Jira 任务,无需离开聊天工具基于 Confluence 的私有知识库问答,让 AI 真正理解团队文档Jira 与 Confluence 联动,打通项目管理与知识管理定时同步与通知,自动化团队信息流转至此,你的 OpenClaw AI 助理已经不仅是一个聊天机器人,而是真正融入团队工作流的“智能项目管理助手”。下一期我们将带来OpenClaw 自定义技能开发实战。

PeterPan的博客 572

2025 提高电力交易价格预测的疾风大模型方法综述

电力现货市场价格预测正转向大模型驱动的新范式。传统方法在极端波动、政策突变等场景下表现不佳,而Transformer、预训练时序模型(如Chronos-Bolt)和LLM混合框架展现出显著优势。关键技术包括多模态数据融合、两段式预训练微调、MoE架构和LLM-RAG增强解释性。案例显示,澳大利亚NSW市场误差降低43%,但混合模型路由仍必要。未来趋势涵盖数字孪生电网和多智能体竞价,需平衡模型创新与行业合规要求。大模型通过跨域学习与业务耦合提升预测,但需持续优化数据隐私、算力消耗和极端事件应对能力。

专注AI大模型,软件混淆,授权 1055

初识BloomFilter--布隆过滤器以及Python简单代码实现

用法及优缺点 BloomFilter可以解决的问题: 1.字处理软件中,需要检查一个英语单词是否拼写正确 2.在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 3.在网络爬虫里,一个网址是否被访问过 4.yahoo, gmail等邮箱垃圾邮件过滤功能 5.可以用来防止缓存击穿 算法优缺点 算法优点: 数据空间小,不用存储数据本身。 算法本身缺点: 匹配失败能确定“绝对不在集合中”,并不能...

aul3332的博客 262

Ubuntu-22.04安装VMware虚拟机并安装Windows10

最近在研究虚拟机,主要集中在KVM、Virtualbox和VMware这三种虚拟机上。前面我已经研究了前两种虚拟机的安装和使用方式,这篇文章介绍3兄弟中最后一个虚拟机安装和使用方式。Virtualbox虚拟机安装和使用KVM虚拟机安装和使用相比于前两种,VMware的安装方式最麻烦,但是综合体验下来我感觉流畅度最好。如果你确实有在Linux上使用VMware虚拟机的需求,那不妨跟着我看下去吧。1、gcc版本和内核版本一定要匹配上,否则会出各种错误。

jiexijihe945的博客 4118

java过滤器python是啥_初识BloomFilter--布隆过滤器以及Python简单代码实现

用法及优缺点BloomFilter可以解决的问题:1.字处理软件中,需要检查一个英语单词是否拼写正确2.在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上3.在网络爬虫里,一个网址是否被访问过4.yahoo, gmail等邮箱垃圾邮件过滤功能5.可以用来防止缓存击穿算法优缺点算法优点:数据空间小,不用存储数据本身。算法本身缺点:匹配失败能确定“绝对不在集合中”,并不能保证匹配成功的值已经在集合中。元...

weixin_39807541的博客 149

Unity WebView 插件⭐️(十八)3D WebView 原生2D模式 — Native 2D Mode

Unity中的 浏览器插件:3D WebView,利用好该插件我们可以自己使用Unity打造出一个自定义的多样化浏览器。可以用于2D显示,也可以用于3D空间场景中使用,在PC端、手机端和VR设备等都可以有一个非常好的效果。一起来浏览器插件:3D WebView的专栏学习使用吧!

努力前行,总会成为自己心中的那道光 7640

基于STM32设计的自动追光系统(项目资料ID:2)

基于STM32设计的自动追光系统主要由光敏采集电路、单片机核心板电路和步进电机控制电路构成。通过光敏电阻采集环境光强信息,经 STM32 单片机处理后,控制步进电机转动,实现对光源的自动追踪。该系统具有响应速度快、追踪精度较高等优点,可应用于太阳能发电、智能照明等领域,为相关场景提供高效的光资源利用方案。

以培养嵌入式工程师为己任 1万+

springboot中使用布隆过滤器BloomFilter

环境:springboot2.3.8.RELEASE+Redis bloomfilter相关知识参考 布隆过滤器(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量(位向量)和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实.

asoklove的专栏 3749

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter

文章目录布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter1、布隆过滤器的起源,用途2、布隆过滤器的概念3、布隆过滤器的优缺点1、优点2、缺点4、应用场景5、布隆过滤器的工作原理6、布隆过滤器的设计 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter 1、布隆过滤器的起源,用途 布隆过滤器(Bloom Filter)是197...

简简单单Onlinezuozuo 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Hutool - BloomFilter:便捷的布隆过滤器实现

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否存在于一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,但缺点是有一定的误判率,即判断元素存在时,元素可能实际上并不存在,但判断元素不存在时,元素一定不存在。布隆过滤器在很多场景下都有广泛的应用,比如缓存穿透的防止、URL 去重等。

十年磨一剑,java开发各种业务系统 1071

HBase的BloomFilter布隆过滤器

布隆过滤器通过使用一个位数组和多个哈希函数,将集合中的元素映射到位数组中的多个位置上。当要判断某个元素是否在集合中时,将该元素通过多个哈希函数映射到位数组的多个位置上,如果所有位置上的值都为。之间的小数,表示当判断某个元素在集合中时,实际上该元素不在集合中的概率。误判率越低,但位数组的长度也会增加,占用的空间也会增加,默认值为。布隆过滤器具有一定的误判率,即可能存在判断某元素在集合中,但实际上该元素不在集合中的情况。)占用空间小,可以通过调整位数组的长度和哈希函数的个数来控制误判率和空间占用。

互联网知识分享 925

【C++】BloomFilter——布隆过滤器

【C++】BloomFilter——布隆过滤器

weixin_60478154的博客 1659

布隆过滤器讲解及基于Guava BloomFilter案例

布隆过滤器讲解及基于Guava BloomFilter案例

睡竹的博客 2453

Redis的缓存穿透及解决方法——布隆过滤器BloomFilter

目录 1. Redis概述: 2. Redis的主要应用场景: 3. 缓存穿透及布隆过滤器 (1)缓存穿透(大量查询一个不存在的key)定义 (2)解决方法 ps:布隆过滤器原理 ps:布隆过滤器另一个用途——推荐去重 1. Redis概述: Redis是一个开源的Key-Value存储系统,其中Value支持String、list、set、hash、zset五种数据结构,这些数...

攻城狮Kevin 3万+

Spark 布隆过滤器(BloomFilter)的应用

@羲凡——只为了更好的活着 Spark 布隆过滤器(BloomFilter)的应用 object BloomFilterDemo { case class General(name:String,age:Int) def main(args: Array[String]): Unit = { val spark = SparkSession.builder() .app...

@羲凡—只为更好的活着 2541

布隆过滤器bloomFilter

布隆过滤器是一个很长的二进制向量和一系列随机映射函数,用于检索一个元素是否在一个集合中。它的空间效率和查询时间都远远超过一般的算法,但是有一定的误判率 (函数返回 true , 意味着元素可能存在,函数返回 false ,元素必定不存在)。布隆过滤器的四个核心属性:k : 哈希函数个数m : 位数组长度n : 插入的元素个数p : 误判率Java 世界里 ,通过 Guava 和 Redisson 创建和使用布隆过滤器非常简单。布隆过滤器无法删除元素,但我们可以通过计数布隆过滤器和。

weixin_41481152的博客 1287
上一篇: Keepalived + Nginx 实现高可用 Web 负载均衡
下一篇: 一文初识Rust多线程,超详细
Code_Flyer
博客等级 码龄9年 0粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值