1. Import SpringBoot dependencies
In pom.xml
the file, introduce Spring Boot and Redis related dependencies
<!-- Google Guava 使用google的guava布隆过滤器实现-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
2. Configure Bloom filter
Create a bloom filter configuration class 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);
}
}
3. Implement caching service
Create a BloomFilterController. Use a Bloom filter to determine whether the data exists to avoid cache penetration:
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.";
}
}
4. Test
Add elements to it
Get element