当前位置: 首页 > news >正文

做网站需要那些技术/网站排名查询站长之家

做网站需要那些技术,网站排名查询站长之家,梅花网,网站建设名片设计首先我们看一个场景:一个网站,需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。如果用传统的数据库如Mysql来实现的话,很难做到。但如果用Redis来做的话,就很简便。Redis的集合类型和Bitmap类型都可以很容易的…

首先我们看一个场景:一个网站,需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。

如果用传统的数据库如Mysql来实现的话,很难做到。但如果用Redis来做的话,就很简便。Redis的集合类型和Bitmap类型都可以很容易的做到。今天,我们主要来谈谈如何用Bitmaps来实现统计活跃用户的功能。

Bitmaps

在计算机系统中,最小的信息单位是字节,1个字节等于8位,每一位都只可能是0或1(计算机只认识这两个数)。使用Bitmaps可以直接对位进行操作。

可以把bigmaps看做一个数组,数组里每一位只可能是0或者1,数组的下标在这里看做偏移量。

下面我们来介绍几个和Bitmaps相关的命令:

setbit

setbit key offset value:给对应的位设置值

比如今天有用户3、8、23、32访问了网站,则setbit user:view:2020-5-17 3 1

setbit user:view:2020-5-17 8 1

setbit user:view:2020-5-17 23 1

setbit user:view:2020-5-17 32 1

开发提示:很多应用id都不是从1开始,有许多是从指定数字开始的,比如1001、10001开始。对于这些,我们在设置的时候可以先减去初始值,防止浪费空间

getbit

getbit key offset 获取指定位的值

如果我想知道今天8号用户和45号用户是否登录过,则127.0.0.1:6379> getbit user:view:2020-5-17 8

(integer) 1

127.0.0.1:6379> getbit user:view:2020-5-17 45

(integer) 0

可以看到8号用户今天登录过,但是45号用户今天还没有登录。

bitcount

bitcount key [start] [end] 获取指定范围为1的个数

我想知道今天有多少用户登陆过了,则127.0.0.1:6379> bitcount user:view:2020-5-17

(integer) 4

Bitmaps间的操作

bitop op destkey key [key ...]

bitop命令可以对多个bitmaps做交集(and)、并集(or)、非(not)、异或(xor),并将操作结果存放在destkey中。

如果想知道连续三天都登陆过的用户,即5月17日、18日、19日都登陆的用户数量。

这三天登陆情况如下:5月17日3、8、23、32用户登陆过

5月18日3、23、43、54号用户登陆过

5月19日3、5、23、 32、56、78号用户登陆过127.0.0.1:6379> bitop and three:and user:view:2020-5-17 user:view:2020-5-18 user:view:2020-5-19

127.0.0.1:6379> bitcount three:and

(integer) 2

如果想知道,这三天有多少用户登陆过。127.0.0.1:6379> bitop or three:or user:view:2020-5-17 user:view:2020-5-18 user:view:2020-5-19

(integer) 10

127.0.0.1:6379> bitcount three:or

(integer) 9

可以看到,这三天共有9位用户登陆过。

实战

讲完上面所讲知识后,我们就可以来完成想要的需求:需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。

首先模拟用户30天内登陆情况,伪代码如下:for ($i = 0; $i < 20000; $i++) {

$userId = mt_rand(1, 10000);

$date = time() - 86400 * mt_rand(0, 30);

$key = 'userlogin_'.date('Ymd', $date);

$redis->setBit($key, $userId, 1);

}

获取一周内都登陆的用户,当然我们不会一次性全部取,而是想分页那样,一次取一定数量的,伪代码如下:for ($i = 1; $i <= 7; $i ++) {

$key = "userlogin_".date('Ymd', time() - (86400*$i));

if ($i == 1) {

$redis->bitOp('and', 'week_logined', $key);

} else {

$redis->bitOp('and', 'week_logined', 'week_logined', $key);

}

}

// 获取前50个用户

$userIds = [];

for ($i=1; $i<=10000; $i++) {

$ret = $redis->getBit('week_logined', $i);

$ret && $userIds[] = $i;

if (count($userIds) >=50) break;

}

这里面有一个注意点,也是易错点,在bitop时候,第一次的时候,因为week_logined还不存在,所以进行op的键只有一个。当从第二次开始时候,进行op的键就为2个了。

获取一个月内登陆的用户,思路基本和上面一样,只是将and改为orfor ($i = 1; $i <= 3; $i ++) {

$key = "userlogin_".date('Ymd', time() - (86400*$i));

$redis->bitOp('or', 'month_loginOnce', 'month_loginOnce', $key);

}

// 获取一个月内登陆过的用户

$userIds = [];

for ($i=1; $i<=10000; $i++) {

$ret = $redis->getBit('month_loginOnce', $i);

$ret && $userIds[] = $i;

}

可以看到,在进行or的时候和and还是有些区别的。or的时候,无需对第一次进行判断。个中缘由,大家自己体会体会。

http://www.lbrq.cn/news/799579.html

相关文章:

  • ubuntu做php网站/杭州网站优化咨询
  • 在哪里可以接网站开发的外包/网络推广公司哪里好
  • 做网站策划营销推广/seo站外优化平台
  • 设计网站建设常州/培训机构咨询
  • 网站推广优化外包/磁力搜索器在线
  • 建设部网站造价注册/北京官方seo搜索引擎优化推荐
  • 绍兴seo整站优化/百度关键词优化工具
  • 福建住房和建设网站密码忘记/百度站长平台注册
  • 企业网站模板建站怎么用/厦门seo外包公司
  • 网站备案流程公安/福州网络推广运营
  • 江西网站建设技术/刘连康seo培训哪家强
  • 哈尔滨网站制作招聘/青岛关键词优化报价
  • 如何修改英文WordPress主题首页/开鲁网站seo转接
  • 无icp备案的网站合法吗/排名优化网站建设
  • 在淘宝上的毕设网站代做/小红书推广策略
  • 美术馆网站建设/网络软文营销的案例
  • 租房子做民宿在哪个网站/7个湖北seo网站推广策略
  • 宠物医院网站建设/做seo是什么意思
  • 南通做外贸网站/营销培训方案
  • wordpress 禁止草稿/北京网站优化指导
  • 电脑做视频的网站/利尔化学股票股吧
  • html 网站 模板/收录查询
  • 网站建设标准/搜索引擎大全网址
  • 网站录入/关键词完整版
  • 株洲做网站 省心磐石网络/域名查询ip138
  • 解析到网站怎样做/灰色seo关键词排名
  • python 做网站合适吗/全网网站快速排名推广软件
  • 安徽省建设干部学校网站/长春seo关键词排名
  • 网站技术介绍/百度智能云
  • 陕西交通建设集团网站体检/企业建站流程
  • kotlin小记(1)
  • C语言(长期更新)第7讲:VS实用调试技巧
  • WaitForSingleObject 函数参数影响及信号处理分析
  • Spring之【循环引用】
  • 在SQL SERVER 中,用SSMS 实现存储过程的每日自动调用
  • 数据赋能(371)——数据挖掘——概述