当前位置: 首页 > Linux

七夕节是送给程序员的礼物,单身程序员详解redisBloom算法+锁源码

时间:2023-04-07 01:33:04 Linux

今天是七夕节,不知道大家过得是甜甜的还是水深火热的,已婚的老人不配过七夕节,只能默默的蹲在电脑前敲代码,写文档,这不,趁着公司下午放假的功夫,我也整理了一下Redis的布隆过滤器和锁的相关知识。在这里分享给大家,希望大家能够更好的学习。简单来说,对于互联网的发展,我们从单机到多机再到微服务。随着数据量的增加,数据库的压力也越来越大。这时候辛勤的程序员把数据分成了冷数据。和热点数据,然后将热点数据存储在缓存中,以提高查询效率,减轻数据库压力。然而,这是一个理想的环境。毕竟,网络并没有想象中那么平静。但是对于让安全部门感到头疼的人来说,当出现上面的场景:有大量不同的密钥获取后台数据时,该怎么办呢?这时候不得不吹捧一波老祖宗的智慧了。宁可杀三千,也绝不放过一个纯粹的idea,产生了一个神奇的Bloomfilter,那么一个Bloomfilter的执行流程是怎样的呢?继续往下看,Bloomfilter是一种用错误率来换取空间和时间的算法。错误率主要体现在:他说数据存在,那么不一定存在或者不存在。它一定不存在。代码只展示了一部分,因为完整展示的太多了,没办法/**\*判断集合中是否存在keywhere\*/publicbooleanisExist(Stringwhere,Stringkey){long\[\]索引=getIndexs(键);布尔结果;//这里使用Redis管道,减少过滤操作时访问Redis的次数,降低Redis管道的并发度pipeline=jedis.pipelined();try{for(longindex:indexes){pipeline.getbit(where,index);}结果=!pipeline.syncAndReturnAll().contains(false);}最后{pipeline.close();}//if(!result){//put(where,key);//}returnresult;}/\*\*\*在redis位图中存储key\*/privatevoidput(Stringwhere,Stringkey){long\[\]indexes=getIndexs(key);//这里使用Redispipeline安装,减少过滤操作时访问Redis的次数,降低Redis的并发度。流水线pipeline=jedis.pipelined();try{for(longindex:indexes){pipeline.setbit(where,index,true);}pipeline.sync();/\*\*\*将数据存入mysql\*/}finally{pipeline.close();}}/\*\*\*根据key从guava获取位图下标方法\*/publiclong\[\]getIndexs(Stringkey){longhash1=hash(key);longhash2=hash1>>>16;long\[\]result=newlong\[numHashFunctions\];for(inti=0;i