9 新数据类型-Hyperloglog
9.1 简介
在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view)。
什么是基数?
数据集{1,2,5,7,5,7,9},那么这个数据集的基数集为{1,2,5,7,9},基数(不重复元素)为5,基数估计就是在误差可接受范围内,快速计算基数。
如果是通过Redis来处理,我们可以使用String类型然后自增计数即可达到统计PV,统计UV可以使用Set,每个用户id是唯一的可以放到这个集合里。
以上方案虽然结果准确,但随着数据不断增加,导致占用的内存空间越来越大,对于非常大的数据集是不合适的。
Hyperloglog 是一种基数估算统计,在输入元素的数量特别巨大时,计算基数所需的空间是固定的,并且很小。
在Redis中,每个Hyperloglog 只占用12KB内存,就可以计算接近 个不同元素的基数。
因为HyperLogLog 只会更具输入元素来计算基数,而不会存储输入元素本身,所以Hyperloglog 不能像集合那样,返回输入的各个元素。
9.2 常用命令
1. pfadd key element1 element2……将所有元素参数添加到 Hyperloglog 数据结构中。
如果至少有个元素被添加返回 1, 否则返回 0。
pfadd book1 java c++ 添加两个元素,当前book1数量为2 pfadd book1 java php 添加一个元素,当前book1数量为3
2. pfcount key1 key2……计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总
数。
pfcount book1 计算book1的基数,结果为3 pfadd book2 chinese math 添加两个元素到book2中 pfcount book1 book2 统计两个key的基数总数,结果为5
3. pfmerge destkey sourcekey1 sourcekey2……将一个或多个Hyperloglog(sourcekey1) 合并成一个Hyperloglog (destkey )。
比如每月活跃用户可用每天活跃用户合并后计算。
pfmerge book book1 book2 将book1和book2合并成book,结果为5
10 Redis配置文件详解
10.1 units单位
配置大小单位,开头定义基本度量单位,只支持bytes,大小写不敏感。
10.2 #### INCLUDES
Redis只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,这时候多个配置文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个总闸。
10.3 #### NETWORK
1. bind:绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的连接。
2. protected-mode:本机保护模式,值为yes时只能本机访问不能远程访问。
3. port:指定redis运行的端口,默认是6379。
4. timeout:设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。默认值为0,表示不关闭。
10.4 #### GENERAL
1. daemonize:设置为yes表示指定Redis以守护进程的方式启动(后台启动)。
2. pidfile:配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到
/var/redis/run/redis_6379.pid 文件里面。
3. loglevel :定义日志级别。默认值为notice,有如下4种取值:
debug(记录大量日志信息,适用于开发、测试阶段)。
verbose(较多日志信息)。
notice(适量日志信息,使用于生产环境)。
warning(仅有部分重要、关键信息才会被记录)。
4. logfile :配置log文件地址,默认打印在命令行终端的窗口上。
5. databases:设置数据库的数目。
10.5 #### SECURITY
1. requirepass:设置redis连接密码。
比如: requirepass 123 表示redis的连接密码为123。
10.6 其他配置
1. maxclients :设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为
Redis进程可以打开的最大数量。 如果设置 maxclients为0 ,表示不作限制。当客户端连接数到达
限制时,Redis会关闭新的连接并向客户端返回错误信息。
2. maxmemory:设置Redis的最大内存,如果设置为0 。表示不作限制。通常是配合maxmemory-policy参数一起使用。
3. maxmemory-policy :当内存使用达到maxmemory设置的最大值时,redis使用的内存清除策
略。
清除策略包括:
- volatile-lru:利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
- allkeys-lru:利用LRU算法移除任何key
- volatile-random:移除设置过过期时间的随机key
- allkeys-random:移除随机key
- volatile-ttl:移除即将过期的key(minor TTL)
- noeviction:不移除任何key,只是返回一个写错误 ,默认选项
11 发布与订阅
11.1 什么是发布与订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
11.2 Redis的发布与订阅
1. 客户端订阅频道
2. 当给这个频道发送消息后,消息就会发送给订阅的客户端
3. Redis中发布与订阅命令
订阅:subscribe channel 订阅频道channel。
发布:publish channel msg向频道channel 发送一条msg消息。
11.3 发布与订阅命令行实现
1. 打开一个客户端订阅channel 1频道。
2. 打开另一个客户端给channel 1频道发送一条hello消息。
返回1代表订阅者数量。
3. 打开第一个客户端可以看到发送的消息