一、导入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.";
}
}
四、测试
向里面添加元素
获取元素