码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Redis --- 位图


    目录

    背景

    结构

    存取方式

    统计和查找


    背景

    开发过程中,会有布尔类型的存储,比如记录一个用户一年365天的签到情况,如果每天都要有一个布尔变量,多个用户,亦或者使用k-v形式,上亿用户的话这个存储量是惊人的。所以Redis的位图应运而生。

    一个值占一个位,365天也就是365位,46个字符,也就是一个长点的字符串,大大节省了内存空间。

    结构

    它并不是一种类似于队列等的特殊的数据结构,内容其实就是普通的字符串,按二进制位数来说,也是就byte数组,可以使用,get,set索引来直接获取或者设置整个位图的内容。

    Redis的为数组是自动扩展的,如果偏移位置超出了反胃,会自动扩容。

    直接把字符串设置为“hello”,

    hello的ASCⅡ码 :
    >>> bin(ord(' h '))
    '0b1101000'
    # 高位 -> 低位
    >>> bin(ord(' e '))
    '0b1100101'
    >>> bin(ord(' l '))
    '0b1101100'
    >>> bin(ord(' l '))
    '0b1101100'
    >>> bin(ord(' o '))
    '0b1101111'

     注意都是八位。

    设置一下一个字符串的位,只需要设置值为1 的位即可

    127.0.0.1:6379> setbit s 1 1
    (integer) 0
    127.0.0.1:6379> setbit s 2 1
    (integer) 0
    127.0.0.1:6379> setbit s 4 1
    (integer) 0
    127.0.0.1:6379> setbit s 9 1
    (integer) 0
    127.0.0.1:6379> setbit s 10 1
    (integer) 0
    127.0.0.1:6379> setbit s 13 1
    (integer) 0
    127.0.0.1:6379> setbit s 15 1
    (integer) 0
    127.0.0.1:6379> get s
    "he"

     h 只有 1 2 4位是1,e是 9 10 13 15位是1 (两个字符,16位 )直接得到便是一个“he”的字符串

    存取方式

    以上的例子可以理解为零存整取,还有零存零取,整存零取,零存就是向上面那样一位一位对位置进行设置。整存就是把字符串一次性填充所有位数组,覆盖旧值。

    看完位图的结构和存储之后,我们存下来是为了获得统计数量,完成我们所需要的需求。

    统计和查找

    Redis提供了位图指令:bitcount 和 bitpos,

    bitcount用来统计指定位置范围内1的个数,

    bitpos 用来查找指定范围内出现的第一个0 或 1 

    后面参数[start, end] 但是这两个参数都是以8字节位单位的,也就是说,0, 1是指第一个开始第二个字节结束,范围实际上是前十六位。

    127.0.0.1:6379> set w hello
    OK
    127.0.0.1:6379> bitcount w
    (integer) 21
    127.0.0.1:6379> bitcount w 0 0 # 第一个字符中 1 的位数
    (integer) 3
    127.0.0.1:6379> bitcount w 0 1 # 前两个字符中 1 的位数
    (integer) 7
       
    127.0.0.1:6379> bitpos w 0 # 第一个 0 位
    (integer) 0
    127.0.0.1:6379> bitpos w 1 # 第一个 1 位
    (integer) 1
    127.0.0.1:6379> bitpos w 1 1 1 # 从第二个字符算起,第一个 1 位
    (integer) 9
    127.0.0.1:6379> bitpos w 1 2 2 # 从第三个字符算起,第一个 1 位
    (integer) 17
  • 相关阅读:
    excel转换成pdf格式怎么操作?这3招教你Excel怎么转PDF
    java计算机毕业设计高校科研信息管理系统MyBatis+系统+LW文档+源码+调试部署
    dreamweaver网页设计作业制作 学生个人网页猫眼电影 WEB静态网页作业模板 大学生个人主页博客网页代码 dw个人网页作业成品
    【精讲】mustache表达式写法、vue常用指令、v-bind多种绑定事件、技能提升
    【Kubernetes部署】通过Kubeadm部署Kubernetes高可用集群
    讲解IaaS,PaaS,SaaS技术
    【Pytorch】Pytorch数据类型float32和float64对深度学习影响
    rabbitmq
    分布式系分发展概览
    Python21天学习挑战---day15 Python科学计算三剑客简介
  • 原文地址:https://blog.csdn.net/Yoke______/article/details/132665094
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号