点击上方“java大数据修炼之道”,选择“设为星标”

优质文章, 第一时间送达

来源:toutiao.com/i6767642839267410445

本文主要和大家分享一下redis的高级特性:bit位操作。

本文redis试验代码基于如下环境:

操作系统:Mac OS 64位

版本:Redis 5.0.7 64 bit

运行模式:standalone mode

redis位操作

reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。

先来看一波基本操作示例:

SETBIT

语法:SETBIT key offset value

即:命令 key 偏移量 0/1

setbit命令用于写入位数组指定偏移量的二进制位设置值,偏移量从0开始计数,且只允许写入1或者0,如果写入非0和1的值则写入失败:

GETBIT

语法:GETBIT key offset

即:命令 key 偏移量

gitbit命令用于获取位数组指定偏移量上的二进制值:

BITCOUNT

语法:BITCOUNT key

即:命令 key

bitcount命令用于获取指定key的位数组中值为1的二进制位的数量,之前我们写入了偏移量0的值为1,偏移量10 的值为1,偏移量8的值为0:

BITOP

语法:BITOP operation destkey key [key...]

即:命令 操作 结果目标key key1 key2 ...

bitop命令可以对多个位数组的key进行and(按位与)、or(按位或)、xor(按位异或)运算,并将运算结果设置到destkey中:

底层数据结构分析

SDS是redis中的一种数据结构,叫做简单动态字符串(Simple Dynamic String),并且它是一种二进制安全的,在大多数的情况下redis中的字符串都用SDS来存储。

SDS的数据结构:

数据存储示例:

图片来源《redis设计与实现》

SDS的优点:

时间复杂度为O(1)

杜绝缓冲区溢出

减少修改字符串长度时候所需的内存重分配次数

二进制安全的API操作

兼容部分C字符串函数

redis中的位数组采用的是String字符串数据格式来存储,而字符串对象使用的正是上文说的SDS简单动态字符串数据结构。

大家都知道的是一个字节用的是8个二进制位来存储的,也就是8个0或者1,即一个字节可以存储十进制0~127的数字,也即包含了所有的数字、英文大小写字母以及标点符号。

1Byte=8bit

1KB=1024Byte

1MB=1024KB

1GB=1024MB

位数组在redis存储世界里,每一个字节也是8位,初始都是:

而位操作就是在对应的offset偏移量上设置0或者1,比如将第3位设置为1,即:

在此基础上,如果要在偏移量为13的位置设置1,即:

时间复杂度

GETBIT命令时间复杂度O(1)

STEBIT命令时间复杂度O(1)

BITCOUNT命令时间复杂度O(n)

BITOP命令时间复杂度O(n)、O(n2)

我们来看GETBIT以及SETBIT命令的时间复杂度为什么是O(1),当我们执行一个SETBIT key 10086 1的值的时候,reids的计算方式如下:

获取到要写入位数组中的哪个字节:

10086÷8=1260,需要写入到位数组的下标1260的字节

获取要写入到这个字节的第几位:

10086 mod 8 = 6,需要写入到这个字节的下标为6即第7位上去。

通过这两种计算方式大家可以清晰的看到,位操作的GETBIT和SETBIT都是常量计算,因此它的时间复杂度为O(1)。

而BITCOUNT命令需要对整个位数组的所有元素进行遍历算出值为1的有多少个,当然redis对于大数据了的bit执行bitcount命令会有一整套复杂的优化的算法,但是核心思路还是这个意思,无非是减少部分遍历查询次数。比如以128位为一次遍历,那么他的遍历次数就是所有的位数除以128。

BITTOP命令则是根据不同的操作有不同的执行方式。比如AND操作,则需要查看位值为1的即可。

存储空间计算

根据上面的介绍,相信大家已经知道了基于redis的位数组数据结构存储的数据占用内存大小是怎么计算的了。比如有100亿的数据,那么它需要的字节数组:

1000000000÷8÷1024÷1024≈119.21MB

也就是存储10亿的数据只需要119MB左右的内存空间,这对于现在动辄16G、32G集群版的redis,完全没有问题。

需要注意的是,如果你的数据量不大,那就不要把起始偏移量搞的很大,这样也是占空间的,比如我们只需要存储几百条数据,但是其中的偏移量却很大,这就会造成了很大的内存空间浪费。

应用场景

实际项目开发中有很多业务都适合采用redis的bit来实现。

用户签到场景

每天的日期字符串作为一个key,用户Id作为offset,统计每天用户的签到情况,总的用户签到数

活跃用户数统计

用户日活、月活、留存率等均可以用redis位数组来存储,还是以每天的日期作为key,用户活跃了就写入offset为用户id的位值1。

同理月活也是如此。

用户是否在线以及总在线人数统计

同样是使用一个位数组,用户的id映射偏移量,在线标识为1,下线标识为0。即可实现用户上下线查询和总在线人数的统计

APP内用户的全局消息提示小红点

现在大多数的APP里都有站内信的功能,当有消息的时候,则提示一个小红点,代表用户有新的消息。

1亿数据 redis 内存_Redis10亿数据量只需要100MB内存,为什么这么牛?相关推荐

  1. 这么设计,Redis 10亿数据量只需要100MB内存

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:www.toutiao.com/i676764283 ...

  2. Redis 10亿数据量只需要100MB内存,为什么这么牛?

    作者:java架构设计   来源:toutiao.com/i6767642839267410445 本文主要和大家分享一下redis的高级特性:bit位操作. 力求让大家彻底学会使用redis的bit ...

  3. 19.2、Javaweb案例_Servlet代码抽取优化分页数据redis缓存优化分页数据展示

    优化Servlet 目的 减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方 ...

  4. linux内存显示3.54g,为什么WDCP/linux服务器内存一直显示几乎用完了

    1.在WDCP的首页显示系统信息处,可以看到4G内存使用几乎用完了. 2.进入到内存管理中,看下实际的内存使用情况.同样显示内存几乎被占完. 3.接下来我们点下"强制释放内存",可 ...

  5. 基于自研分布式内存及流数据库技术的柏睿数据宣布获2亿元C轮融资

    大数据产业创新服务媒体 --聚焦数据 · 改变商业 数据猿报道 6月19日,大数据与人工智能公司柏睿数据正式对外宣布完成2亿元C轮融资,由海通证券旗下南方融合基金与盛石资本旗下长三角产业创新基金联合领 ...

  6. redis 上亿数据_票房上亿,稳居第一?肖战《诛仙》日本上映,真实数据到底怎样...

    文/马庆云 8月9日,有不少具备粉丝倾向的娱乐账号发动态消息称,肖战等人主演的电影<诛仙>,日本上映,票房已经超过数亿(给出多少亿数字的都有),稳居日本票房冠军位置等等.这些账号发布的这类 ...

  7. 亿级工具类APP头条数据聚合优化实践

    亿级工具类APP头条数据聚合优化实践 业务介绍 中华万年历的头条数据是根据推荐算法聚合而成的数据,包括ALS算法数据.用户画像数据.时效数据.非时效数据.定投数据.惊喜数据.频道数据.热榜数据.用户相 ...

  8. 每天近百亿条用户数据,携程大数据高并发应用架构涅槃

    互联网二次革命的移动互联网时代,如何吸引用户.留住用户并深入挖掘用户价值,在激烈的竞争中脱颖而出,是各大电商的重要课题.通过各类大数据对用户进行研究,以数据驱动产品是解决这个课题的主要手段,携程的大数 ...

  9. mysql select count 5万条数据很慢_mysql亿级数据数据库优化方案测试银行交易流水记录的查询...

    点击上方△蓝字关注我们 带你征服编程和泡妞两座大山 对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以 ...

最新文章

  1. 为什么CSS使用假元素?
  2. 关于STM中SPI运用的NSS引脚解读
  3. pymavlink 源码剖析(二)之生成代码
  4. 2017.4.19 细胞分裂 思考记录
  5. 前端跨域,nginx反向代理的解决方案
  6. MySQL-快速入门(10)触发器
  7. 【路径规划】基于matlab一种带交叉因子的双向寻优粒子群栅格地图路径规划【含Matlab源码 117期】
  8. MySQL数据库入门学习(多图预警+新手向~)
  9. uniapp文件体积超过 500KB报错
  10. XCTF练习题---MISC---simple_transfer
  11. ContextCapture | 无人机倾斜摄影技术在农村不动产确权中的应用
  12. JQ ajax 请求事件处理
  13. php的惰性加载,惰性加载
  14. ubuntu安装软件包命令_从Ubuntu命令行搜索安装软件包
  15. Poto Editor for Mac(mac照片编辑器)
  16. 基于matab GUI的图形处理火焰检测系统
  17. 示例 在 ABAP 中使用自己的 RSA 实现 RSA Encryption in ABAP
  18. 使用基于Boost的预处理器元编程实现变长类型列表的参数化
  19. 东华大学概率论第三次作业
  20. php文件上传限制后缀,input file上传文件扩展名限制

热门文章

  1. zigbee 报警联动方案原理
  2. matlab取矩阵满足条件,[MATLAB]矩阵中寻找满足条件的元素
  3. 第 7 章 Database design E-R diagram
  4. html - 移动标签 marquee 属性
  5. 软考初级程序员下午题题库
  6. Flink on Yarn三部曲之一:准备工作
  7. java学习——JDK安装
  8. LWIP-工业以太网交换机 SNMP功能与SStool功能完成笔记
  9. Unraid 安装百度网盘
  10. 使用STM32CUBEMX HAL库读写SD卡