明天七夕节了,不晓得大家过的是甜甜蜜蜜还是生灵涂炭呀,已婚老男人不配过七夕,只能默默的蹲在电脑前敲敲代码,写写文档,这不,趁着公司下午放假的功夫,我也整顿了一下对于 Redis 的布隆过滤器和锁的相干常识,这里分享给大家,心愿能让大家更好的学习。
简略一点,对于互联网开发,咱们从单机到多机始终到微服务,随着数据量的增多,对于数据库的压力也随之增大,这个时候,勤奋的程序员们,将数据分为冷数据和热点数据,而后把热点数据存储在缓存中,晋升查问效率并且加重数据库的压力,然而,这是现实环境,毕竟互联网没有设想中的那么平静
比方说上面这种状况
黑客,一个让程序员向往然而又让安全部门感到头疼的人群,当下面的场景:有大量不同的 key 获取后盾数据的时候该怎么解决,
在这个时候,我就不得不吹捧一波老祖宗的智慧,宁肯错杀三千,绝不放过一个的纯洁理念,从而产生了神奇的布隆过滤器,那布隆过滤器是怎么一个执行流程呢?持续往下看
布隆过滤器是─个应用错误率来换取空间和工夫的算法错误率次要体现在: 他说数据存在,那么不肯定存在不存在,肯定不存在
代码只展现局部吧,因为残缺展示太多了,没得方法
/**
\* 判断 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 hash1 = hash(key);
long hash2 = hash1 >>> 16;
long\[\] result = new long\[numHashFunctions\];
for (int i = 0; i < numHashFunctions; i++) {
long combinedHash = hash1 + i \* hash2;
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 去后盾获取数据,然而,这种状况,你不能通过布隆过滤器而后去不放过一个吧,那该怎么办呢?锁住他呗!
可能这几张图这么看有那么一点点的含糊,集体还有日常工作,也就没有残缺的整顿造成文档,就以图片和简略的文字进行了简述,
想要残缺学习视频的相应的源码还有视频以及文档资料,曾经整顿好了
相应的文章曾经整顿造成文档,须要的敌人,git 扫码获取材料看这里
https://gitee.com/biwangsheng/personal.git