如何理解redis布隆算法实现+锁

发布时间:2021-11-15 15:41:53 作者:柒染
来源:亿速云 阅读:137

今天就跟大家聊聊有关如何理解redis布隆算法实现+锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

今天七夕节了,不知道大家过的是甜甜蜜蜜还是水深火热呀,已婚老男人不配过七夕,只能默默的蹲在电脑前敲敲代码,写写文档,这不,趁着公司下午放假的功夫,我也整理了一下关于Redis的布隆过滤器和锁的相关知识。

如何理解redis布隆算法实现+锁

简单一点,对于互联网开发,我们从单机到多机一直到微服务,随着数据量的增多,对于数据库的压力也随之增大,这个时候,勤劳的程序员们,将数据分为冷数据和热点数据,然后把热点数据存储在缓存中,提升查询效率并且减轻数据库的压力,但是,这是理想环境,毕竟互联网没有想象中的那么平静

比方说下面这种情况

如何理解redis布隆算法实现+锁

黑客,一个让程序员向往但是又让安全部门感到头疼的人群,当上面的场景:有大量不同的key获取后台数据的时候该怎么处理,

在这个时候,我就不得不吹捧一波老祖宗的智慧,宁可错杀三千,绝不放过一个的纯真理念,从而产生了神奇的布隆过滤器,那布隆过滤器是怎么一个执行流程呢?继续往下看

布隆过滤器是─个使用错误率来换取空间和时间的算法错误率主要体现在:他说数据存在,那么不一定存在不存在,一定不存在

如何理解redis布隆算法实现+锁

代码只展示部分吧,因为完整展现太多了,没得办法

/**
     * 判断keys是否存在于集合where中
     */
    public boolean isExist(String where, String key) {
        long[] indexs = getIndexs(key);
        boolean result;
        //这里使用了Redis管道来降低过滤器运行当中访问Redis次数 降低Redis并发量
        Pipeline pipeline = jedis.pipelined();
        try {
            for (long index : indexs) {
                pipeline.getbit(where, index);
            }
            result = !pipeline.syncAndReturnAll().contains(false);
        } finally {
            pipeline.close();

        }
//        if (!result) {
//            put(where, key);
//        }
        return result;
    }


    /**
     * 将key存入redis bitmap
     */
    private void put(String where, String key) {
        long[] indexs = getIndexs(key);
        //这里使用了Redis管道来降低过滤器运行当中访问Redis次数 降低Redis并发量
        Pipeline pipeline = jedis.pipelined();
        try {
            for (long index : indexs) {
                pipeline.setbit(where, index, true);
            }
            pipeline.sync();
            /**
             * 把数据存储到mysql中
             */
        } finally {
            pipeline.close();
        }
    }




    /**
     *  根据key获取bitmap下标方法来自guava
     */
    public long[] getIndexs(String key) {
        long hash2 = hash(key);
        long hash3 = hash2 >>> 16;
        long[] result = new long[numHashFunctions];
        for (int i = 0; i < numHashFunctions; i++) {
            long combinedHash = hash2 + i * hash3;
            if (combinedHash < 0) {
                combinedHash = ~combinedHash;
            }
            result[i] = combinedHash % numBits;
        }
        return result;
    }

    /**
     * 获取一个hash值 方法来自guava
     */
    private long hash(String key) {
        Charset charset = Charset.forName("UTF-8");
        return Hashing.murmur3_128().hashObject(key, Funnels.stringFunnel(charset)).asLong();
    }


    private static int optimalNumOfHashFunctions(long n, long m) {
        return Math.max(1, (int) Math.round((double) m / n * Math.log(2)));
    }

当然了,出现这种情况也不是只有黑客攻击,还有一种,我想很多人都参与过,它叫做限时秒杀,比如淘宝双十一,这个时候会造成的一种情况是大量的客户端拿着相同的Key去后台获取数据,但是,这种情况,你不能通过布隆过滤器然后去不放过一个吧,那该怎么办呢?锁住他呗!

如何理解redis布隆算法实现+锁

可能这几张图这么看有那么一点点的模糊,个人还有日常工作,也就没有完整的整理形成文档,就以图片和简单的文字进行了简述。

看完上述内容,你们对如何理解redis布隆算法实现+锁有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. 怎么理解redis抉择分布式锁
  2. 如何理解php redis setnx分布式锁

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

redis

上一篇:Springboot+LDAP调研日志的方法是什么

下一篇:Centos7.0部署openstack环境创建服务时出现500错误怎么办

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》