上篇文章我们对STRING数据类型中一些基本的命令进行了介绍,但是没有涉及到BIT相关的命令,本文我们就来看看几个和BIT相关的命令。

本文是Redis系列的第四篇文章,了解前面的文章有助于更好的理解本文:


1.Linux上安装Redis
2.Redis中的五种数据类型简介
3.Redis字符串(STRING)介绍


BIT相关的命令是指BITCOUNT/BITFIELD/BITOP/BITPOS/SETBIT/GETBIT 几个命令,灵活使用这几个命令,可以给我们的项目带来很多惊喜。

准备知识

在学习这几个命令之前,我们得先了解下redis中字符串的存储方式,redis中的字符串都是以二进制的方式进行存储的,比如说我执行如下命令:

127.0.0.1:6379> SET k1 a
OK

a对应的ASCII码是97,转换为二进制数据是01100001,我们BIT相关命令都是对这个二进制数据进行操作。请继续往下看。

GETBIT

GETBIT命令可以返回key对应的value在offset处的bit值,以上文提到的k1为例,a对应的二进制数据是01100001,所以当offset为0时,对应的bit值为0;offset为1时,对应的bit值为1;offset为2时,对应的bit值为1;offset为3时,对应的bit值为0,依此类推....,如下:

127.0.0.1:6379> GETBIT k1 0
(integer) 0
127.0.0.1:6379> GETBIT k1 1
(integer) 1
127.0.0.1:6379> GETBIT k1 2
(integer) 1
127.0.0.1:6379> GETBIT k1 3
(integer) 0
127.0.0.1:6379> GETBIT k1 4
(integer) 0
127.0.0.1:6379> GETBIT k1 5
(integer) 0
127.0.0.1:6379> GETBIT k1 6
(integer) 0
127.0.0.1:6379> GETBIT k1 7
(integer) 1

SETBIT

SETBIT可以用来修改二进制数据,比如a对应的ASCII码为97,c对应的ASCII码为99,97转为二进制是01100001,99转为二进制是01100011,两个的差异在于第六位一个是0一个是1,通过SETBIT命令,我们可以将k1的第六位的0改为1(第六位是从0开始算),如下:

127.0.0.1:6379> SETBIT k1 6 1
(integer) 0
127.0.0.1:6379> GET k1
"c"

此时,k1中存储的字符也就变为了c。SETBIT在执行时所返回的数字,表示该位上原本的bit值。

BITCOUNT

BITCOUNT可以用来统计这个二进制数据中1的个数,如下:

127.0.0.1:6379> BITCOUNT k1
(integer) 4

关于BITCOUNT,redis官网上有一个非常有意思的案例:用户上线次数统计。节选部分原文如下:

举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。
当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。

这种统计方式最大的好处就是节省空间并且运算速度快。每天占用一个bit,一年也就365个bit,10年也就10*365个bit,也就是456个字节,对于这么大的数据,bit的操作速度非常快。

BITOP

BITOP可以对一个或者多个二进制位串执行并(AND)、或(OR)、异或(XOR)以及非(NOT)运算,如下:a对应的ASCII码转为二进制是01100001,c对应的二进制位串是01100011。对这两个二进制位串分别执行ANDORXOR的结果如下:

127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> set k2 c
OK
127.0.0.1:6379> BITOP and k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"a"
127.0.0.1:6379> BITOP or k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"c"
127.0.0.1:6379> BITOP xor k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"\x02"

另外,BITOP也可以执行NOT运算,但是注意参数个数,如下:

127.0.0.1:6379> BITOP not k3 k4
(integer) 1

这里会对k4的二进制位串取反,将取反结果交给k3.

BITPOS

BITPOS用来获取二进制位串中第一个1或者0的位置,如下:

127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> BITPOS k1 1
(integer) 1
127.0.0.1:6379> BITPOS k1 0
(integer) 0

也可以在后面设置一个范围,不过后面的范围是字节的范围,而不是二进制位串的范围。

OK,STRING中BIT相关的命令我们就介绍这么多,更多命令小伙伴们可以参考官方文档http://www.redis.cn/commands....。小伙伴在看官方文档时,有什么问题欢迎留言讨论。

更多资料请关注公众号:

原文地址:https://segmentfault.com/a/1190000017030424

Redis字符串(STRING)中BIT相关命令的更多相关文章

  1. redis对string进行的相关操作

    redis对string类型操作的相关命令以及如何在python使用这些命令 redis对string类型操作的命令: 命令 语法 概述 返回值 Redis SET 命令  set key value ...

  2. Python操作redis字符串(String)详解 (三)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...

  3. redis 字符串(string)函数

    字符串(string)函数 get 命令/方法/函数 Description Get the value related to the specified key 取得与指定的键值相关联的值 Para ...

  4. Redis 字符串(String)

      Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 12 ...

  5. redis(六):Redis 字符串(String)

    Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 127. ...

  6. Redis的String、Hash类型命令

    String是最简单的类型,一个Key对应一个Value,string类型是二进制安全的.Redis的string可以包含任何数据,比如jpg图片或者序列化的对象.最大上限是1G字节.    Hash ...

  7. 『学了就忘』vim编辑器基础 — 96、末行模式中的相关命令

    目录 1.在文档中显示行号 2.是否显示文档内容相关颜色 3.是否将查找的字符串高亮显示 4.是否显示右下角的状态栏 5.是否在左下角显示如"--INSERT--"之类的状态栏 6 ...

  8. Redis中String类型的相关命令操作

    String append 如果key已存在,则直接在value追加值,如果key不存在,则会插件一个新的value为空的key,然后在追加 127.0.0.1:6379> set name l ...

  9. redis -字符串string

    字符串类型是Redis 中最为基础的数据存储类型,它在Redis 中是二进制安全的,该类型可以接收任何格式的数据,  字符串 Value 最多可以容纳的数据长度是521M. 保存: 设置键值. set ...

随机推荐

  1. [HEOI2013]Eden 的新背包问题

    数据极水,不加优化的多重背包都能过...早知道考试的时候不加奇奇怪怪的卡常优化,卡了45分... 就是从前往后做一个多重背包,从后往前再做一个,问的时候就暴力求一下跳过这个的最佳方案... #incl ...

  2. yii2-dingtalk 钉钉群机器人

    说明 群机器人是钉钉群的高级扩展功能.群机器人可以将第三方服务的信息聚合到群聊中,实现自动化的信息同步.目前,大部分机器人在添加后,还需要进行Webhook配置,才可正常使用(配置说明详见操作流程中的 ...

  3. VS2015使用C++编写DLL,并在C#环境中调用【转】

    说明:本文是本人在学习封装DLL时看到的,觉得说得很清楚,为了防止忘记,特意复制下来学习用,原文链接:https://blog.csdn.net/songyi160/article/details/5 ...

  4. 阻止a标签跳页,使用单击事件函数处理该请求

    阻止a标签跳页href="javascript:void(0)" 单击该标签时 页面不跳页   使用单击事件函数来处理该单击请求  返回上一层页面 ---------------- ...

  5. mysql修改配置文件

    在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同 ...

  6. telnet允许root用户登录

    默认情况下,linux不允许root用户以telnet方式登录linux主机,若要允许root用户登录,可采取以下3种方法之一:    1.修改login文件 redhat中对于远程登录的限制体现在/ ...

  7. gem update --system

    gem update --system 修改完gem sources之后,进行gem update: gem update --system 之后的输出: C:\Sites\test01>gem ...

  8. rails new app的时候设置skip-bundle

    rails new app的时候设置skip-bundle rails new app --skip-bundle 这样可以越过bundle install阶段:

  9. android AChartEnginee解说之源代码框架解读

    从上周把android ACHartEnginee的源代码check out出来后就一直在看这个东西是怎样使用的,以及底层是怎样实现的,把近期一周对这个东西的了解先发上来,即是给自己做一个总结,也希望 ...

  10. java 顺序 读写 Properties 配置文件 支持中文 不乱码

    java 顺序 读写 Properties 配置文件 ,java默认提供的Properties API 继承hashmap ,不是顺序读写的. 特从网上查资料,顺序读写的代码,如下, import j ...