Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

  • 计算机网络

  • 数据结构和算法

  • MySQL

  • Redis

    • Redis持久化和数据数据恢复
    • Redis发布订阅
    • Redis管道技术
    • Redis事务机制
    • Redis数据过期和淘汰策略
    • Redis中BitMap使用
      • BitMap介绍
      • Redis中bitmap
        • 相关命令
      • 使用场景
      • 参考文档
    • Redis中lua脚本使用
    • Redis通信协议(RESP)入门
    • Redis性能测试Redis-benchmark
    • Redis主从模式搭建及应用
    • Redis集群及高可用实现
    • Redis和Memcache对比
    • Redis缓存穿透、缓存击穿、缓存雪崩
    • Redis万字总结
    • 如此简单:Redis安装
    • Memcached安装部署
  • Nginx

  • MongoDB

  • 其他

  • 计算机基础
  • Redis
Ravior
2018-10-07
目录

Redis中BitMap使用

# BitMap介绍

bitset

Bitmap是一串连续的2进制数字(0或1),用1个bit位来表示一个数据是否出现过,0为没有出现过,1表示出现过,使用的时候可以根据某一个位是否为0表示此数是否出现过。8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。

# Redis中bitmap

Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令,虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。

# 相关命令

  • setbit

    • 指令 SETBIT key offset value
    • 复杂度: O(1)
  • getbit

    • 指令 GETBIT key
    • 复杂度: O(1)
  • bitcount

    • 指令 BITCOUNT key
    • 复杂度: O(1)

# 使用场景

基于bitmap极低的时间和空间复杂度,在大数据标记等类似布隆过滤的场景有广泛的用武之地。以在线用户统计为例,设置用户ID为offset,如果在线就设置为1,不在线就设置为0,使用bitmap,1000W用户只需要1.2MB的空间。

require 'vendor/autoload.php';

$redis = new Predis\Client([
	'host' => '127.0.0.1',
	'port' => 6379
]);

// 连接redis
$redis->connect();


// 上线
function online($uid) 
{
	global $redis;
	$redis->setbit('online', $uid, 1);
}

// 下线
function offline($uid) 
{
	global $redis;
	$redis->setbit('online', $uid, 0);
}

// 判断是否在线
function isonline($uid) 
{
	global $redis;
	$redis->getbit('online', $uid);
}

// 在线统计
function total() 
{
	global $redis;
	return $redis->bitcount('online');
}

// 批量设置在线状态
$uids = range(1, 10000);
foreach ($uids as $uid) {
	online($uid);
}

// 批量设置下线状态
$i = 0;
$max = mt_rand(1000, 3000);
while ($i < $max) {
	offline(mt_rand(1, 10000));
	$i++;
}


echo '当前在线人数: ', total(), PHP_EOL;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 参考文档

  • redis的bitset实战 (opens new window)
  • Redis中BitMap是如何储存的,以及PHP如何处理 (opens new window)
  • Redis中bitmap的妙用 (opens new window)
#Redis
上次更新: 2022/12/01, 11:09:34
Redis数据过期和淘汰策略
Redis中lua脚本使用

← Redis数据过期和淘汰策略 Redis中lua脚本使用→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式