redis的setbit这个bit怎么理解,配合bitcount使用?

这个是SETBIT使用方法的简单说明
<img src="https://pic4.zhimg.com/8650852c348cf08ff711e44ca13aaf47_b.png" data-rawwidth="958" data-rawheight="93" class="origin_image zh-lightbox-thumb" width="958" data-original="https://pic4.zhimg.com/8650852c348cf08ff711e44ca13aaf47_r.png">

在redis中,存储的字符串都是以二级制的进行存在的。

举例:
设置一个 key-value ,键的名字叫“andy” 值为字符'a'
<img src="https://pic3.zhimg.com/85f9a07a4cfb815029f4ce266daa78a2_b.png" data-rawwidth="524" data-rawheight="99" class="origin_image zh-lightbox-thumb" width="524" data-original="https://pic3.zhimg.com/85f9a07a4cfb815029f4ce266daa78a2_r.png">
我们知道 'a' 的ASCII码是 97。转换为二进制是:01100001。offset的学名叫做“偏移” 。二进制中的每一位就是offset值啦,比如在这里 offset 0 等于 ‘0’ ,offset 1等于'1' ,offset2等于'1',offset 6 等于'1' ,没错,offset是从左往右计数的,也就是从高位往低位。

我们通过SETBIT 命令将 andy中的 'a' 变成 'b' 应该怎么变呢?

也就是将 01100001 变成 01100010 (b的ASCII码是98),这个很简单啦,也就是将'a'中的offset 6从0变成1,将offset 7 从1变成0 。

<img src="https://pic1.zhimg.com/4a65befc057124bb36c880758b26b7fc_b.png" data-rawwidth="521" data-rawheight="96" class="origin_image zh-lightbox-thumb" width="521" data-original="https://pic1.zhimg.com/4a65befc057124bb36c880758b26b7fc_r.png">
大家可能也发现了,每次SETBIT完毕之后,有一个(integer) 0或者(integer)1的返回值,这个是在你进行SETBIT 之前,该offset位的比特值。

这个时候,我们再get andy 一下,看看结果:
<img src="https://pic2.zhimg.com/9591d4a73f3471847bbc6ade20d7f94d_b.png" data-rawwidth="340" data-rawheight="50" class="content_image" width="340">
果然,就从'a' 变成 'b'了。 

这就是redis 中 “SETBIT” 的基本用法。

BITCOUNT 就是统计字符串的二级制码中,有多少个'1'。 所以在这里,

BITCOUNT andy 得到的结果就是 3 啦。

以上。

 
转自 https://www.zhihu.com/question/27672245/answer/123641959

redis的setbit命令的更多相关文章

  1. redis SETBIT命令原理

    redis SETBIT命令原理 /* SETBIT key offset bitvalue */ bitset的使用位来替代传统的整形数字,标识某个数字对应的值是否存在 底层有一个byte[]来实现 ...

  2. redis中setbit bitcount命令详解

    bitmap,位图,即是使用bit. redis字符串是一个字节序列. 1 Byte = 8 bit SETBIT key offset value 设置或者清空key的value(字符串)在offs ...

  3. redis中setbit的用法

    原文地址:http://www.zhihu.com/question/27672245 在redis中,存储的字符串都是以二级制的进行存在的.举例:设置一个 key-value ,键的名字叫“andy ...

  4. redis常用的命令总结

    redis常用的命令大全 1.基于内存的key-value数据库 2.基于c语言编写的,可以支持多种语言的api //set每秒11万次,取get 81000次 3.支持数据持久化 4.value可以 ...

  5. redis 使用 get 命令读取 bitmap 类型的数据

    在签到统计场景中,可以使用 bitmap 数据类型高效的存储签到数据,但 getbit 命令只能获取某一位值,就无法最优的满足部分业务场景了. 比如我们按年去存储一个用户的签到情况,365 天,只需要 ...

  6. redis 基本类型和命令(一)

    一.Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). (1) string类型是Redis最基本的数 ...

  7. redis常用的命令行以及操作

    redis常用的命令行以及操作 转载酱紫人的理直气壮 最后发布于2018-07-30 17:00:41 阅读数 805  收藏 转载地址:https://blog.csdn.net/li_lening ...

  8. NoSQL之Redis高级实用命令详解--安全和主从复制

    Android IOS JavaScript HTML5 CSS jQuery Python PHP NodeJS Java Spring MySQL MongoDB Redis NOSQL Vim ...

  9. 2016022611 - redis订阅发布命令集合

    redis消息订阅发布命令 参考地址:http://www.yiibai.com/redis/redis_pub_sub.html 消息发送者发送消息,通过redis的channal,消息接收者获取消 ...

随机推荐

  1. IAR for stm8 memory窗口的功能

    进入debug模式后点击菜单view-Memory 可以在线查看,RAM,FLASH,OPTION等

  2. (面试)写出下面switch语句的输出结果

    (1) public static void main(String[] as) { int a = 0;  switch (a)  { case 1:   System.out.println(&q ...

  3. pthread编译时报错的解决方法

    最近在学习POSIX thread编程,今天编译一个程序报如下错误: /tmp/ccXH8mJy.o:在函数‘main’中:deadlock.c:(.text+0xbb):对‘pthread_crea ...

  4. ACM会议列表与介绍(2014/05/06)

    Conferences ACM SEACM Southeast Regional Conference ACM Southeast Regional Conference the oldest, co ...

  5. rocketmq 学习记录-2

    产品选型 我们在进行中间件选型时,一般都是通过下面几点来进行产品选型的: 1.性能 2.功能支持程度 3.开发语言(团队中是否有成员熟悉此中间件的开发语言,市场上此种语言的开发人员是否好招) 4.有多 ...

  6. Vue(四):实例化第一个Vue应用

    实例化语法 var vm = new Vue({ // 选项 }) Vue 构造器中的内容 <!DOCTYPE html> <html> <head> <me ...

  7. 如何使用好android的可访问性服务(Accessibility Services)

    原文:http://android.eoe.cn/topic/android_sdk * 主题* Manifest声明和权限 可访问性服务声明 可访问性服务配置 AccessibilityServic ...

  8. [hihoCoder] 第四十九周: 欧拉路·一

    题目1 : 欧拉路·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最 ...

  9. 精通Docker的50个必备教程、工具、资源

    Docker 已经震惊了软件开发界.它提供了一种根据 DevOps 方法打包和输送应用程序的便捷方法. 最近我们发布了 51 个必备的 Docker 工具列表①,但工具不是完全精通容器化所需的唯一东西 ...

  10. Java 里如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...