Redis整理(3)之bitmap的应用

场景分析:如果叫你设计一个表,存放了userID和性别或者是账户存在状态。

userID  sex  status

1            0      1

2            1      1

3            1      1

.......

一般思路用数据库关系表的话,也还OK,但是如果这个表很大,上亿级别?

这时候可以考虑用redis中的bitmap来轻易解决

分别设置两张bitmap。

sexmap  statusmap

例如对第一条记录进行存储

$userid=1

$redis->setbit('sexmap',$userid,0);//设置下标为1,代表女性,此时女生数为1,位数上值默认为0

$redis->setbit('statusmap',$userid,1);

$redis->getbit('sexmap',$userid);//获取userID=1的用户的性别

综上,bitmap适用于那些记录性别或者状态值,枚举于0、1的字段!


 <?php
   /*
   $redis->setbit(key,offset,value);value =0|1
   思考,我们这个bitmap可以存多少位?
   一个字节占8位
   set('bitmap',a);
   a的用二进制位表示01100001 这个即为97,也就是ASCII编码值
   redis可达到512M/per key
   512M=512*1024KB=512*1024*1000B=512*1024*1000*8bit=40亿+
   化整为零40亿,也就是说一位代表一个用户,40亿可以代表40亿个用户!
   但是int 有符号整型取值范围 20亿+,所以bitmap位数只能到20亿个
   */
   //应用场景,我们有一张表,用来记录用户的性别,男位数值0,女为数值1
  //假设userid=1的用户为女,那么可以如下设置
   $userid = 1;
   $redis->setbit('sexmap',$userid,1);//设置下标为1,代表女性,此时女生数为1
   echo "<hr>";
   echo "userid=20亿性别:";
   print $redis->getbit('sexmap',2000000000);//最多可存储20亿,位数上的值如果没设置默认为0,且设置只能0,1选择
   echo "<hr>";
   echo "女生总数:";
   print $redis->bitcount('sexmap');//对女生的统计 




   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值