Springboot 在 redis 中使用 Guava 布隆过滤器机制

一、导入SpringBoot依赖

pom.xml文件中,引入Spring Boot和Redis相关依赖

<!-- Google Guava 使用google的guava布隆过滤器实现-->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>30.1-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 {

    @Bean
    public BloomFilter<String> bloomFilter() {
        return BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000000, 0.01);
    }
}

三、实现缓存服务

创建一个BloomFilterController。使用布隆过滤器判断数据是否存在,从而避免缓存穿透:

package com.springboot3.test;

import com.google.common.hash.BloomFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Controller
public class BloomFilterController {
    @Autowired
    private BloomFilter bloomFilter;
    @Autowired
    private RedisTemplate redisTemplate;
    @GetMapping("/cache/{key}")
    public String getCacheValue(@PathVariable String key) {
        boolean result = bloomFilter.mightContain(key);
        if(result==true){
            Object obj = redisTemplate.opsForValue().get(key);
            return obj.toString();
        }
        return "Cache miss, and the key does not exist in database.";
    }

    @GetMapping("/cache/{key}/{value}")
    public String setCacheValue(@PathVariable String key, @PathVariable String value) {
        bloomFilter.put(key);
        return "Cache set successfully.";
    }

}

四、测试

向里面添加元素

 获取元素

猜你喜欢

转载自blog.csdn.net/weixin_55127182/article/details/132281957