• 面试redis主题一“什么是缓存穿透”


    条件

    缓存穿透是因为查询redis时发现其中没有要查询的数据,大量请求DB导致DB压力过大崩溃。这种情况大部分是因为恶意攻击。

    解决方法

    使用布隆过滤器

    它是一种基于概率的数据结构,主要用来判断某个元素是否在集合内,它具有运行速度快(时间效率),占用内存小的优点(空间效率),但是有一定的误识别率和删除困难的问题。它能够告诉你某个元素一定不在集合内可能在集合内

    原理总结


    1.一个很长的二进制数组 (位数组,就是这个数组里只有0和1)
    2.若干个哈希函数
    3.空间效率和查询效率高
    4.不存在漏报(False Negative),即某个元素在某个集合中,肯定能报出来。
    5.可能存在误报(False Positive),即某个元素不在某个集合中,可能也被爆出来。
    5.删除困难

    代码实现布隆过滤器

    1. public class SimpleBloomFilter {
    2. private static final int DEFAULT_SIZE = 2 << 24; // 布隆过滤器的比特长度
    3. private static final int[] seeds = new int[] {7, 11, 13, 31,37, 61}; // 这里要选取质数,能很好的降低错误率
    4. private BitSet bits = new BitSet(DEFAULT_SIZE);
    5. private SimpleHash[] func = new SimpleHash[seeds.length];
    6. public static void main(String[] args) {
    7. String value = "crankzcool@gmail.com";
    8. SimpleBloomFilter filter = new SimpleBloomFilter();
    9. System.out.println(filter.contains(value));
    10. filter.add(value);
    11. System.out.println(filter.contains(value));
    12. }
    13. public SimpleBloomFilter() {
    14. for (int i = 0; i < seeds.length; i++) {
    15. func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
    16. }
    17. }
    18. public void add(String value) {
    19. for (SimpleHash f: func) {
    20. bits.set(f.hash(value), true);
    21. }
    22. }
    23. public boolean contains(String value) {
    24. if (value == null) {
    25. return false;
    26. }
    27. boolean ret = true;
    28. for (SimpleHash f : func) {
    29. ret = ret && bits.get(f.hash(value));
    30. }
    31. return ret;
    32. }
    33. public static class SimpleHash {
    34. private int cap;
    35. private int seed;
    36. public SimpleHash(int cap, int seed) {
    37. this.cap = cap;
    38. this.seed = seed;
    39. }
    40. public int hash(String value) {
    41. int result = 0;
    42. int len = value.length();
    43. for (int i = 0; i < len; i++) {
    44. result = seed * result + value.charAt(i);
    45. }
    46. return (cap - 1) & result;
    47. }
    48. }

    pom引入依赖实现布隆过滤器

    pom依赖
    1. <dependency>
    2. <groupId>com.google.guavagroupId>
    3. <artifactId>guavaartifactId>
    4. <version>27.0.1-jreversion>
    5. dependency>
     代码实现
    1. public static void main(String[] args) {
    2. // 1.创建符合条件的布隆过滤器
    3. // 预期数据量10000,错误率0.0001
    4. BloomFilter bloomFilter =
    5. BloomFilter.create(Funnels.stringFunnel(
    6. Charset.forName("utf-8")),10000, 0.0001);
    7. // 2.将一部分数据添加进去
    8. for (int i = 0; i < 5000; i++) {
    9. bloomFilter.put("" + i);
    10. }
    11. System.out.println("数据写入完毕");
    12. // 3.测试结果
    13. for (int i = 0; i < 10000; i++) {
    14. if (bloomFilter.mightContain("" + i)) {
    15. System.out.println(i + "存在");
    16. } else {
    17. System.out.println(i + "不存在");
    18. }
    19. }
    20. }


     

  • 相关阅读:
    哪些 GPTs 应用让我眼前一亮?你又该如何找到它们?
    Linux计划任务at和cron命令的使用
    java字符串压缩和字符串解压
    C++ STL之string类模拟实现
    Mac上如何修复损坏的音频?试试iZotope RX 10,对音频进行处理,提高音频质量!
    vivo积分任务体系的架构演进-平台产品系列05
    漫游计算机系统
    淘宝/天猫获取卖出的商品订单列表 API 返回值说明
    Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14
    vue3 导出Excel TypeScript
  • 原文地址:https://blog.csdn.net/2301_77181435/article/details/133048044