redis 入门及 Bloom Filter去重算法---1

1 Redis是什么?

--------------------------------------------------------------------------------

Redis 是完全开源免费的,是一个高性能的key-value数据库。

 

与其他 key - value 缓存产品--特点:

1支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

2不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

3支持数据的备份,即master-slave模式的数据备份。

 

Redis 优势

  1. 性能极高
  2. 丰富的数据类型
  3. 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  4. 丰富的特性

Redis支持五种数据类型:

string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

2 Redis怎么用?

2.1 开始使用redis

安装redis

下载驱动包jedis.jar

连接到 redis 服务

实例

import redis.clients.jedis.Jedis; public class RedisJava {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

//查看服务是否运行

System.out.println("服务正在运行: "+jedis.ping()); } }

编译以上 Java 程序,确保驱动包的路径是正确的。

 

 

Redis Java String(字符串) 实例

实例

import redis.clients.jedis.Jedis;

public class RedisStringJava {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

//设置 redis 字符串数据

jedis.set("runoobkey", "www.runoob.com");

// 获取存储的数据并输出

System.out.println("redis 存储的字符串为: "+ jedis.get("runoobkey")); } }

编译以上程序。

 

 

3 去重算法

应用领域

         “去重”是日常工作中会经常用到的一项技能,在爬虫领域更是常用,并且规模一般都比较大

指标

去重需要考虑两个点:

去重的数据量

去重速度

 

为了保持较快的去重速度,一般选择在内存中进行去重。

 

去重有哪些方案?

1、数据量不大时,可以直接放在内存里面进行去重,例如python可以使用set()进行去重。

  2、当去重数据需要持久化时可以使用redis的set数据结构。

  3、当数据量再大一点时,可以用不同的加密算法先将长字符串压缩成 16/32/40 个字符,再使用上面两种方法去重;

  4、当数据量达到亿(甚至十亿、百亿)数量级时,内存有限,必须用“位”来去重,才能够满足需求。Bloomfilter就是将去重对象映射到几个内存“位”,通过几个位的 0/1值来判断一个对象是否已经存在。

  5、然而Bloomfilter运行在一台机器的内存上,不方便持久化(机器down掉就什么都没啦),也不方便分布式爬虫的统一去重。如果可以在Redis上申请内存进行Bloomfilter,以上两个问题就都能解决了。

4 Bloom Filter

4.1概念和原理

Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。

初始状态时,Bloom Filter是一个包含m位的位数组,每一位都置为0。

 

 

为了表达S={x1, x2,…,xn}这样一个n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function),它们分别将集合中的每个元素映射到{1,…,m}的范围中。对任意一个元素x,第i个哈希函数映射的位置hi(x)就会被置为1(1≤i≤k)。注意,如果一个位置多次被置为1,那么只有第一次会起作用,后面几次将没有任何效果。在下图中,k=3,且有两个哈希函数选中同一个位置(从左边数第五位)。   

 

 

在判断y是否属于这个集合时,我们对y应用k次哈希函数,如果所有hi(y)的位置都是1(1≤i≤k),那么我们就认为y是集合中的元素,否则就认为y不是集合中的元素。下图中y1就不是集合中的元素。y2或者属于这个集合,或者刚好是一个false positive。

 

 

4.2 最优的哈希函数个数

既然Bloom Filter要靠多个哈希函数将集合映射到位数组中,那么应该选择几个哈希函数才能使元素查询时的错误率降到最低呢?

 

未完待续....

 

posted @ 2018-01-08 20:45  cuiz_book  阅读(510)  评论(0编辑  收藏  举报