从今天开始看《Redis深度历险》--位图

摘要:
web上的Redis不支持bitfield命令位图概念,这让我想起了一个算法问题。我可以判断N亿个数字中是否存在某个数字。如果你感兴趣,你可以查一下。Bitfield也是一个非常复杂的指令,但它避免了在需要多次获取/设置位图时必须使用管道的问题。建议检查官方文件。简而言之,在一行中多次出现incrby溢出的情况下,此指令可以执行get、set、incrby和其他操作。偏移量:#加在偏移量之前,表示偏移量需要乘以类型的位数。该应用程序的关键点在于对位图的理解和位域的使用。

网页版redis并不支持bitfield这个指令

位图这一概念让我想起来一个算法问题,在N亿个数字中判断某个数是否存在,感兴趣的可以去看一下。

看过上面的问题之后我相信对书中的零存整取、整存零取概念就会理解了,书中的例子是将hello字符串转换为ASCII码进行零存整取整存零取

 

相关指令

  setbit key value 按位存

  getbit key 按位取

  set key value 整存

  get key 整取

统计和查找

  bitcount key [start end] 查找key内指定范围中的1的个数,值得注意的是start和end由于内存的物理结构限制,只能使8的整数倍。

  bitpos key 0/1 [start end] 在key的指定范围内查找第一个0/1的位置

  文中作者举例是用于统计用户在某个时间段内的签到次数。

  bitfield 这个指令的也是非常复杂,但是避免了在需要对位图多次get/set操作时必须使用管道的问题,建议查看官方文档(所以我上次蹩脚英语翻译是为了啥呢)简而言之,该指令可以在一行中执行多次get、set、incrby以及在对incrby溢出时的操作。其中的几个我觉得值得注意的点包括:

    type:u8、i16分别指的是8位无符号整型(unsigned int简写u),16位有符号整型(int间写i)

    get:使用get指令对超出字符串长度(或者key不存在)的位进行寻址时,会自动为缺失的位赋值为0;用SETINCRBY指令对超出当前字符串长度的位(含key不存在的情况)进行寻址,将会扩展字符串并对扩展部分进行补0,扩展方式包括:按需扩展、按最小长度扩展和按最大寻址能力扩展。

    offset:偏移量前加上 # ,表示偏移量需要乘以type的位数

该种应用的关键点就在于对位图的理解和bitfield这个指令的使用。


最后才关注到这一章的名字叫做节衣缩食,不得不说,很贴切,在存储只有两种状况的key时使用位图能够大大节省空间开销。

免责声明:文章转载自《从今天开始看《Redis深度历险》--位图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)Ntp服务器的搭建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux下常用redis指令

set get 取值赋值,key值区分大小写 mset mget多个的取值和赋值 del 删除一个或多个key 查看key值是否存在,有就返回1,没有就是0 设置一个有存活时间的key值,设置成功返回1 显示key值剩余存活时间 keys显示符合指定条件的key 创建相关数据类型,并使用keys显示对应的数据类型 创建hash类型的数据...

miaosha

1:跨域请求配置 后端Controller 添加注解 @CrossOrigin(origins = {"*"},allowCredentials = "true")前端ajax 请求添加xhrFields: { withCredentials: true } 2:跨域解决方案 1:jsonp2:cors3:node 转发4:nginx 反向代理  3:命...

Redis主从配置及主从切换

环境及部署图 本次配置在同一台主机配置文件及端口号不一样 6379配置文件/etc/redis/6379.conf bind 0.0.0.0 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised n...

七、企业级的redis数据备份和各种灾难下的数据恢复,是怎么做得呢?

1、企业级的持久化的配置策略 在企业中,RDB的生成策略,用默认的也差不多 save 60 10000:如果你希望尽可能确保说,RDB最多丢1分钟的数据,那么尽量就是每隔1分钟都生成一个快照,低峰期,数据量很少,也没必要 10000->生成RDB,1000->RDB,这个根据你自己的应用和业务的数据量,你自己去决定 AOF一定要打开,fsync...

Redis数据类型,持久化,回收策略

       缓存:第一种是内存缓存 比如Map(简单的数据结构),以及EH Cache(Java第三方库),第二种是缓存组件比如Memached,Redis;Redis(remote dictionary server)是一个基于KEY-VALUE的高性能的存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。        Redis官网...

分布式任务队列--Celery的学习笔记

一、Celery简介   Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。它是一个任务队列,专注于实时处理,同时还支持任务调度。   所谓任务队列,是一个逻辑上的概念,可以将抽象中的任务发送到指定的执行任务的组件,任务队列可以跨线程或机器运行。   Celery是基于Python开发的分布式异步消息任...