引流推广怎么做广州百度推广优化排名
2026/4/18 3:03:43 网站建设 项目流程
引流推广怎么做,广州百度推广优化排名,西安网站有哪些,全屋装修公司前言在当今互联网软件开发的高并发、海量数据场景下#xff0c;如何高效处理数据、提升系统性能成为了开发者们持续关注的焦点。缓存作为提升系统性能的重要手段#xff0c;在常规机制中却面临着缓存穿透的难题。当大量无效请求#xff08;请求的 key 既不存在于缓存#x…前言在当今互联网软件开发的高并发、海量数据场景下如何高效处理数据、提升系统性能成为了开发者们持续关注的焦点。缓存作为提升系统性能的重要手段在常规机制中却面临着缓存穿透的难题。当大量无效请求请求的 key 既不存在于缓存也不存在于数据库蜂拥而至时数据库压力剧增系统性能急剧下降。而布隆过滤器Bloom Filter作为一种高效的解决方案在 Spring Boot3 开发中愈发凸显其价值今天就让我们深入探索 Spring Boot3 中如何使用布隆过滤器。布隆过滤器是什么布隆过滤器是一种空间效率极高的概率性数据结构主要用于快速判断某个元素是否在集合中。它具有以下显著特点内存占用小相较于传统的集合结构布隆过滤器在存储相同数量元素时内存使用量要少得多。这一特性使得它在处理海量数据时优势明显。可能存在误判需要注意的是布隆过滤器只能判断某个元素 “可能存在” 或 “绝对不存在”。也就是说当它判断元素存在时该元素有可能是误判但当它判断元素不存在时那么该元素一定不存在。不支持删除布隆过滤器内部机制决定了它不支持删除已添加的元素。一旦执行删除操作会导致误判率大幅增加。布隆过滤器的工作原理基于多个哈希函数和一个位数组。当向布隆过滤器添加一个元素时会通过多个不同的哈希函数对该元素进行计算得到多个哈希值。这些哈希值对应到位数组的不同索引位置然后将这些位置的比特位设置为 1。在查询元素时同样对元素进行哈希计算若所有对应索引位置的比特位都为 1则认为该元素可能存在于集合中若有任意一位为 0则可确定该元素一定不存在。布隆过滤器的适用场景一防止缓存穿透这是布隆过滤器最为常见的应用场景之一。在高并发系统中将数据库中不存在的 key 预先存储在布隆过滤器中。当有查询请求到来时先通过布隆过滤器判断该 key 是否可能存在。如果布隆过滤器判断该 key 不存在那么直接返回避免了无效请求穿透缓存直接查询数据库从而大大降低了数据库的压力。二防止重复数据在大规模数据处理过程中例如数据清洗、日志处理等场景使用布隆过滤器可以快速判断数据是否已经被处理过避免对相同数据进行重复处理提高数据处理的效率和准确性。三爬虫 URL 过滤在网络爬虫开发中需要避免重复抓取同一 URL。通过布隆过滤器可以快速判断一个 URL 是否已经被抓取过从而提高爬虫的效率避免对同一资源的重复访问。四安全黑名单在安全防护领域比如防止恶意 IP 访问、垃圾邮件过滤等场景布隆过滤器可以将已知的恶意 IP、垃圾邮件发送者等信息存储在其中。当有新的访问请求或邮件到来时先通过布隆过滤器进行判断快速拦截黑名单中的对象。在 Spring Boot3 中使用布隆过滤器的实现方式一基于 Redis 的实现Redis 作为一款高性能的内存数据库提供了开箱即用的布隆过滤器功能通过 Redis 的插件 RedisBloom我们可以方便地使用布隆过滤器来存储和管理 key。引入相关依赖在 Spring Boot3 项目的 pom.xml 文件中添加 Redis 以及 Spring Data Redis 相关依赖以实现与 Redis 的交互。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency此外如果使用 RedisBloom 插件还需根据实际情况添加对应的依赖。配置 Redis 连接信息在 application.yml 文件中配置 Redis 的连接地址、端口、密码等信息。spring: data: redis: host: localhost port: 6379 password: 123456 timeout: 60000 database: 0 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1ms创建布隆过滤器服务利用 Redisson 提供的 API我们可以轻松实现布隆过滤器服务。Redisson 是一个基于 Redis 的 Java 客户端提供了丰富的分布式数据结构和服务的实现。import org.redisson.api.RBloomFilter; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; Service public class BloomFilterService { Autowired private RedissonClient redissonClient; public void initBloomFilter() { // 创建布隆过滤器预计元素数量为1000000误判率为0.01 RBloomFilterString bloomFilter redissonClient.getBloomFilter(productBloomFilter); bloomFilter.tryInit(1000000, 0.01); // 假设从数据库中获取所有商品ID并添加到布隆过滤器中 // 这里简单模拟添加一些商品ID String[] productIds {1, 2, 3, 4, 5}; for (String productId : productIds) { bloomFilter.add(productId); } } public boolean mightContain(String productId) { RBloomFilterString bloomFilter redissonClient.getBloomFilter(productBloomFilter); return bloomFilter.contains(productId); } }在上述代码中initBloomFilter 方法用于初始化布隆过滤器设置预计插入的元素数量和误判率并将模拟的商品 ID 添加到布隆过滤器中。mightContain 方法用于判断某个商品 ID 是否可能存在于布隆过滤器中。在业务中使用布隆过滤器在查询商品的业务方法中我们可以先通过布隆过滤器判断商品 ID 是否可能存在若不存在则直接返回避免查询数据库。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; Service public class ProductService { Autowired private BloomFilterService bloomFilterService; Autowired private RedisTemplateString, Object redisTemplate; public Object queryProduct(String productId) { if (!bloomFilterService.mightContain(productId)) { return null; } Object product redisTemplate.opsForValue().get(product: productId); if (product null) { // 从数据库查询商品 product queryProductFromDatabase(productId); if (product null) { // 缓存空值 redisTemplate.opsForValue().set(product: productId, null, 5, TimeUnit.MINUTES); } else { // 缓存商品信息 redisTemplate.opsForValue().set(product: productId, product); } } return product; } private Object queryProductFromDatabase(String productId) { // 实际的数据库查询逻辑 // 这里简单返回null模拟数据库中不存在该商品 return null; } }在上述代码中queryProduct 方法首先调用 BloomFilterService 的 mightContain 方法判断商品 ID 是否可能存在于布隆过滤器中。如果不存在则直接返回 null避免了无效的数据库查询。如果可能存在则继续从缓存中查询商品信息。若缓存未命中则查询数据库并根据查询结果进行相应的缓存操作。二基于 Guava 库的实现除了基于 Redis 的实现方式我们还可以使用 Google 的 Guava 库来在 Spring Boot3 项目中实现布隆过滤器。Guava 库提供了简单易用且性能可靠的布隆过滤器实现。添加依赖在项目的 pom.xml 文件中添加 Guava 库的依赖。dependency groupIdcom.google.guava/groupId artifactIdguava/artifactId version32.1.2-jre/version /dependency配置布隆过滤器创建一个配置类 BloomFilterConfig用于初始化布隆过滤器。import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class BloomFilterConfig { private static final int EXPECTED_INSERTIONS 1000000; private static final double FPP 0.01; Bean public BloomFilterString bloomFilter() { return BloomFilter.create(Funnels.stringFunnel(), EXPECTED_INSERTIONS, FPP); } }在上述代码中我们指定了预期插入的元素数量 EXPECTED_INSERTIONS 和可接受的误判率 FPPGuava 会根据这些参数自动优化布隆过滤器内部的位数组大小和哈希函数个数。使用布隆过滤器创建一个服务类 BloomFilterService用于封装与布隆过滤器交互的业务逻辑。import com.google.common.hash.BloomFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; Service public class BloomFilterService { private final BloomFilterString bloomFilter; Autowired public BloomFilterService(BloomFilterString bloomFilter) { this.bloomFilter bloomFilter; } public boolean mightContain(String value) { return bloomFilter.mightContain(value); } public void put(String value) { bloomFilter.put(value); } }这个服务类提供了两个方法mightContain 用于判断元素是否可能存在put 用于向布隆过滤器中添加元素。编写测试接口为了验证布隆过滤器的功能我们可以创建一个简单的 TestController 来进行测试。import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController public class TestController { Autowired private BloomFilterService bloomFilterService; GetMapping(/bloom/add) public String addToBloomFilter(RequestParam String value) { bloomFilterService.put(value); return Element added to Bloom Filter; } GetMapping(/bloom/check) public boolean checkInBloomFilter(RequestParam String value) { return bloomFilterService.mightContain(value); } }通过这两个接口我们可以方便地向布隆过滤器添加元素并检查元素是否可能已存在。启动 Spring Boot 应用程序后使用工具如 Postman来访问接口进行测试。先添加几个元素例如访问http://localhost:8080/bloom/add?valueelement1然后检查这些元素是否存在访问http://localhost:8080/bloom/check?valueelement1应返回 true若访问http://localhost:8080/bloom/check?valuenonexistent假设从未添加过该值根据误判率有一定概率返回 false多次测试可观察到布隆过滤器的特性。使用布隆过滤器的注意事项一误判率的设置误判率是布隆过滤器的一个重要参数。在初始化布隆过滤器时需要根据实际业务场景合理设置误判率。如果误判率设置过低会导致布隆过滤器的位数组过大占用过多的内存空间如果误判率设置过高则可能会导致较多的误判影响系统的准确性。例如在防止缓存穿透场景中如果误判率过高可能会导致部分正常请求被误判为无效请求从而影响用户体验。二数据动态变化的处理由于布隆过滤器本身不支持删除操作对于数据动态变化的场景需要额外的处理机制。例如在一些数据频繁更新或删除的业务场景中可以考虑定期重建布隆过滤器将最新的数据重新添加到布隆过滤器中以保证布隆过滤器的准确性。或者结合其他数据结构如 Counting Bloom Filter计数布隆过滤器它支持对元素的删除操作但会增加一定的空间复杂度。三与其他技术的结合在实际项目中布隆过滤器通常需要与其他技术结合使用以达到更好的效果。例如在防止缓存穿透场景中除了使用布隆过滤器还可以结合缓存空值、熔断机制等技术。缓存空值可以在布隆过滤器误判时进一步防止无效请求查询数据库熔断机制可以在系统出现异常高负载时快速切断无效请求保护系统的稳定性。总结通过本文的介绍我们深入了解了布隆过滤器的原理、适用场景以及在 Spring Boot3 项目中如何使用布隆过滤器。无论是基于 Redis 的实现方式还是基于 Guava 库的实现方式都为我们在实际开发中应对缓存穿透、数据去重等问题提供了有效的解决方案。在使用布隆过滤器时需要注意合理设置误判率、妥善处理数据动态变化的情况并结合其他技术以构建高效、稳定的系统。希望本文能为广大互联网软件开发人员在 Spring Boot3 开发中运用布隆过滤器提供有益的参考助力大家开发出性能更优、体验更佳的软件产品。在不断变化的技术领域中持续探索和实践新的技术方案是我们提升开发能力、满足业务需求的关键。让我们一起在技术的海洋中乘风破浪创造更多价值。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询