Redis-位图】的更多相关文章

项目需求,试着写了一个简单登录统计,基本功能都实现了,日志数据量小.具体性能没有进行测试~ 记录下开发过程与代码,留着以后改进! 1. 需求 1. 实现记录用户哪天进行了登录,每天只记录是否登录过,重复登录状态算已登录,不需要记录用户的操作行为,不需要记录用户上次登录时间和IP地址(这部分以后需要可以单独拿出来存储) 2. 区分用户类型 3. 查询数据需要精确到天 2. 分析 考虑到只是简单的记录用户是否登录,记录数据比较单一,查询需要精确到天.以百万用户量为前提,前期考虑了几个方案 2.1 使…
场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3……等等. 显示用户某个月的签到次数和首次签到日期. 在日历控件上展示用户每月签到情况,可以切换年月显示……等等. 设计思路 对于用户签到数据,如果每条数据都用Key/Value的方式存储,当用户量大的时候内存开销是非常大的.而位图(BitMap)是…
场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3--等等. 显示用户某个月的签到次数和首次签到时间. 在日历控件上展示用户每月签到情况,可以切换年月显示--等等. 设计思路 对于用户签到数据,如果每条数据都用K/V的方式存储,当用户量大的时候内存开销是非常大的.而位图(BitMap)是由一组bit…
Redis位图法记录在线用户的状态 位图 Redis官方文档对于位图的介绍如下: 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB,适合于设置 2^32个不同的位. 位操作分为两组:常量时间单个位的操作,像设置一个位为 1 或者 0,或者获取该位的值.对一组位的操作,例如计算指定范围位的置位数量. 位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式.例如,在一个系统中,不同用户由递增的用户 ID…
原文:巧用redis位图存储亿级数据与访问 - 简书 业务背景 现有一个业务需求,需要从一批很大的用户活跃数据(2亿+)中判断用户是否是活跃用户.由于此数据是基于用户的各种行为日志清洗才能得到,数据部门不能提供实时接口,只能提供包含用户及是否活跃的指定格式的文本由业务方使用. 存在的挑战 海量数据如何尽可能用小的空间存储 如何能快速获取指定的数据 如何能快速的写入到目标存储 解决思路 由于我的业务中只需要根据某个用户id查询是否是活跃用户,不存在复杂的查询条件,所以用redis很合适. 如此大的…
<?php function frstr($str){ return str_pad($str,8,'0',STR_PAD_LEFT); } $php=''; $p= frstr(decbin(ord('p'))); $h= frstr(decbin(ord('h'))); $php=$p.$h.$p; echo $php; echo PHP_EOL; $len=strlen($php); $index=[]; for($i=0;$i<$len;$i++){ if($php[$i]==1){…
业务背景 现有一个业务需求,需要从一批很大的用户活跃数据(2亿+)中判断用户是否是活跃用户.由于此数据是基于用户的各种行为日志清洗才能得到,数据部门不能提供实时接口,只能提供包含用户及是否活跃的指定格式的文本由业务方使用. 存在的挑战 海量数据如何尽可能用小的空间存储 如何能快速获取指定的数据 如何能快速的写入到目标存储 解决思路 由于我的业务中只需要根据某个用户id查询是否是活跃用户,不存在复杂的查询条件,所以用redis很合适. 如此大的数据如果用普通的键值对一一存储所有用户的活跃数据,即使…
最近要做一个圣诞抽奖活动,需要记录每天用户签到的记录,以前一般都是用普通的字符串数据类型,每个用户的签到用一个 key // 用户10在活动第一天的签到key为record:1:10 $key = "record:$day:$id"; if ($redis->get($key)) { echo '已签到'; } else { $redis->set($key, 1) } 那么一个用户一天的签到记录就要占一个字节,用户一多就产生非常多的 key,浪费宝贵的内存. 位图 为了解…
概述 redis 的位图就是01的数据格式,redis 主要做有写入,读取和统计.位图相关的命令 : 其中set和get就是 read 和writer , bitcount 统计相关,bitop 是对bit进行操作01的,bitpos 获取某个范围内第一个值为 bit 的位置:bitfield 则是批量操作的命令 例子 写入的过程如下,以下是一个例子(来自参考资料) 127.0.0.1:6379> setbit s 1 1 (integer) 0 127.0.0.1:6379> setbit…
描述   bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到.登录等场景 常用命令及解析 常用命令 setbit key offset value   给key在指定位索引位置上(offset)设置一个value,因为是bit所以value只能为0或1;如setbit zhangsan 2 1表示在位索引的2号位设置为1,对应的二进制位应该是0010 0000 getbit key offset   获取key在指定位索引位置上对应的二…