使用Redisson的布隆过滤器解决缓存穿透问题

时间:2024-10-24 12:11:31
import org.redisson.api.RBloomFilter; import org.redisson.api.RedissonClient; import org.redisson.Redisson; import org.redisson.config.Config; import java.util.concurrent.ConcurrentHashMap; public class BloomFilterExample { private static RedissonClient redisson; private static RBloomFilter<String> bloomFilter; // 模拟数据库 private static ConcurrentHashMap<String, String> database = new ConcurrentHashMap<>(); static { // 初始化Redisson Config config = new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); redisson = Redisson.create(config); // 创建布隆过滤器 bloomFilter = redisson.getBloomFilter("myBloomFilter"); bloomFilter.tryInit(1000000, 0.03); // 初始化布隆过滤器:预计插入100万条数据,误判率0.03% // 模拟数据库数据 database.put("user:1", "John"); database.put("user:2", "Jane"); // 将存在的用户ID加入布隆过滤器 bloomFilter.add("user:1"); bloomFilter.add("user:2"); } public static void main(String[] args) { System.out.println(getUserData("user:1")); // 从数据库获取 System.out.println(getUserData("user:3")); // 触发布隆过滤器 } public static String getUserData(String userId) { // 检查布隆过滤器 if (!bloomFilter.contains(userId)) { return "Invalid Request (User does not exist)"; } // 模拟数据库查询 String userData = database.get(userId); if (userData != null) { return "User Data: " + userData; } else { return "User Data Not Found"; } } }