深入Redis(三)位图

位图

位图不是特殊的数据结构,其内容就是普通的字符串,即byte数组,可以使用get/set直接获取整个位图的内容,也可以通过getbit/setbit来将byte数组看成位数组来处理。

基本使用

Redis的位数组是自动拓展的,若偏移位置超出现有范围,则自动用0扩充。

get整取,set整存,getbit零取,setbit零存,对应的则是直接操作字符串还是操作位。

统计和查找

bitcount用于统计指定位置范围内1的个数,bitpos用于查找指定范围内出现的第一个0或1的位。

bitcount所设置的范围是字符的范围而不是位的范围,也就是说,这个范围是对字符的索引,其位范围是8的倍数。

魔术指令bitfield

前面设置和获取指定位的值都是单个位的,如要一次操作多个位,则必须使用管道来处理。但是从Redis3.2开始,增加了一条指令,使得不用管道也能一次操作多个位。

bitfield有三个子指令,分别是get/set/incrby,它们可以对指定位片段进行读写,但最多只能处理64个连续位,超过64个就必须使用多个子指令,bitfield支持一次执行多个子指令。

127.0.0.1:6379> set w hello
OK
127.0.0.1:6379> bitfield w get u4 0 # 从第一个位开始取4个位,结果是无符号数u
(integer) 6
127.0.0.1:6379> bitfield w get u3 2 # 从第3个位开始取3个位,结果是无符号数u
(integer) 5
127.0.0.1:6379> bitfield w get i4 0 # 从第一个位开始取4个位,结果是符号数i
1) (integer) 6
127.0.0.1:6379> bitfield w get i3 2 # 从第3个位开始取3个位,结果是符号数i
1) (integer) -3

无符号数就是取位数组全部为值,符号数就是取位数组第一位为符号,其它位为值。

127.0.0.1:6379> bitfield w get u4 0 get u3 2 get i4 0 get i3 2 # 一次执行多条子指令
1) (integer) 6
2) (integer) 5
3) (integer) 6
4) (integer) -3
127.0.0.1:6379> bitfield w set u8 8 97  # 从第八位开始,接下来的8位用无符号数97替代
1) (integer) 101
127.0.0.1:6379> get w
"hallo"

incrby指令对指定范围位进行自增操作,溢出将会折返,无符号数0-255,有符号数-128-127。

bitfield提供溢出策略子指令overflow,默认折返wrap,还可选择失败fail(报错不执行),饱和截断sat(超过范围停留在极值),overflow指令只影响一条指令,后续继续默认折返wrap

bitfield可同时混合执行多个get/set/incrby子指令。

原文地址:https://www.cnblogs.com/ikct2017/p/9499144.html

时间: 2024-10-25 18:01:07

深入Redis(三)位图的相关文章

Redis 三:存储类型之字符串

1.赋值单个: set a 100 [赋值多个:mset a 100 b 200 c 300] 2.取值单个: get a [取值多个:mget a b c] 3.数字递增 incr a 在a的基础上+1,那就是返回101 如果预先的值为0,那么返回1,如果预先的值不是整形,则返回错误“is not an integer...” 3.1 数字递减 decr 用法跟上面一样 decr 4.约定(命名方式) 对象类型:对象ID:对象属性 user:100:friends 存储用户id为100的好友列

如何优雅地使用Redis之位图操作

前言 在进入今天的主题前,先简单地解释下Redis中的位图到底是什么.Redis官方文档对于位图的介绍如下: 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB,适合于设置 2^32个不同的位.位操作分为两组:常量时间单个位的操作,像设置一个位为 1 或者 0,或者获取该位的值.对一组位的操作,例如计算指定范围位的置位数量.位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式.例如,在一个系统中,不

Redis三种特殊数据类型:HyperLogLog、BigMap、Geo

引语: Redis 是一个高性能.(key/value).分布式,基于内存运行.支持持久化的NoSQL数据库. 它也常被称为数据结构服务器,因为它存储的值(value)可以是String .hash.list(有序.可索引:实现队列.栈).set.zset(有序集合)等数据类型.这也是redis相比于其他缓存工具的一个优势:可以支持丰富的数据结构. 今天想与大家介绍的便是,redis另三种特殊的数据结构:Geo.HyperLogLog. BitMap 浅谈数据类型与数据结构的不同 数据类型定义了

redis(三)redis+Keepalived主从热备秒级切换

一 简介 安装使用centos 5.10 Master 192.168.235.135 Slave 192.168.235.152 Vip 192.168.235.200 编译环境 yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel 当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby:当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主

Linux-NoSQL之Redis(三)

一.Redis数据常用操作 1.string常用操作 set key1  aminglinux get key1 set key1  aming //一个key对应一个value,多次赋值,会覆盖前面的value setnx key2 aaa   //返回1 get key2 setnx key2 bbb  //返回0 说明:setnx 如果key存在,则返回0,不存在会直接创建这个key setex key3  10  1 //这个是用来给key设定过期时间的 mset  key1 1  ke

Jedis连接Redis三种模式

这里说的三种工作模式是指: 1.单机模式 2.分片模式 3.集群模式(since 3.0) 说明图详见以下: 使用单机模式连接: 1 private String addr="192.168.1.1"; 2 private String port="6236"; 3 private String key="key"; 4 private Jedis jedis=new Jedis(addr,port);//Jedis获取到的Redis数据在jed

redis应用--位图

在我们平时开发过程中,会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 365 天.如果使用普通的 key/value,每个用户要记录 365 个,当用户上亿的时候,需要的存储空间是惊人的. 为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据一个位,365 天就是 365 个位,46 个字节 (一个稍长一点的字符串) 就可以完全容纳下,这就大大节约了存储空间. 原文地址:https://www.cnblogs.com/yoursc

redis三主三从部署

服务器A:192.168.3.188 centos7服务器B:192.168.3.189 centos7关闭firewalld防火墙,关闭selinux:redis 版本4.0.1,至少6台做redis cluster yum -y install wget vim tcl gcc make mkdir –p /usr/local/redis cd !$ wget http://download.redis.io/releases/redis-4.0.1.tar.gz tar –xvf redi

配置redis三主三从

主从环境 centos7.6 redis4.0.1 主 从 192.168.181.139:6379 192.168.181.136:6379 192.168.181.136:6380 192.168.181.137:6380 192.168.181.137:6381 192.168.181.139:6381 集群实例配置 这里展示192.168.181.139:6379节点的,其他配置修改ip.端口号和文件名 bind 192.168.181.139 port 6379 pidfile /va

Redis三种集群模式-哨兵机制

Redis哨兵机制,一主二从 注:Redis哨兵切换,建议一主多从 一.一主二从 教程步骤:https://www.cnblogs.com/pinghengxing/p/11139997.html 二.哨兵配置(sentinel.conf) 哨兵机制也分单台以及集群,在此我们只构建哨兵集群      cd /usr/software/redis/redis-ms/ 1.创建哨兵目录 /usr/software/redis/redis-ms/sentinel/26001 /usr/software