redis数据类型常用命令
String 字符串
若字符串中有空格注意用引号。
set -- 创建key
# 若键不存在则创建,若存在则更新其值,在设置操作成功完成时返回 OK
set key value
# 设置key时同时指定过期时间,等价于setex命令,time单位/秒
set key value ex time
# 若存在则不创建,等价于setnx命令。设置成功返回OK,若指定key已存在则返回nil。
set key value nx
setnx -- 创建key,存在则不变
- 指定的 key 不存在时则创建并返回 1,若存在则不操作返回 0。
setnx key value
setex -- 创建key并设置超时时间,单位/秒
- 若键不存在则创建,若存在则更新其值,在设置操作成功完成时返回 OK 。
setex key time value
get -- 获取指定key的值
- 返回 key 的值,如果 key 不存在时,返回为空。
get key
mset与msetnx -- 同时设置多个key
- mset:若key不存在则创建,若存在则更新其值,在设置操作成功完成时返回 OK 。
- msetnx:只会在所有给定 key 都不存在的情况下进行设置操作,如其中有一个key存在则全部失败并返回 0,设置成功则返回 1。
mset key1 value1 key2 value2 key3 value3
msetnx key1 value1 key2 value2 key3 value3
mget -- 返回所有(一个或多个)给定 key 的值
- 如果给定的 key 里面,有某个 key 不存在或不字符串则返回为空。
mget key1 key2 key3
append -- 追加值
- 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
- 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
- 追加指定值之后,返回 key 中字符串的长度。
append key new-value
strlen -- 返回 key 所储存的字符串值的长度
- 当 key 不存在时,返回 0。
strlen key
getrange -- 返回 key 中字符串值的子字符串
- 字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内。
- 偏移量就是字符串的下标数字,从 0 开始。
- end 必须要比 start 大。
- 支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。
getrange key start end
# 示例,截取指定key其value的最后3个值:getrange test -3 -1
setrange -- 用给定字符串替换key所储存的字符串值
- 从偏移量 offset 开始,原字符串从offset后开始全部替换为给定值,offset就是字符串下表。
- 当 offset 值大于 str 长度时,中间使用零字节\x00 填充,即 0000 0000 字节填充。
- 不存在的key当作空串处理,就是直接创建个新的key,用给定的value。
- 返回替换后的字符串整体长度。
setrange key offset value
# 示例
127.0.0.1:6379> set test 123456
OK
127.0.0.1:6379> setrange test 3 321
(integer) 6
127.0.0.1:6379> get test
"123321"
127.0.0.1:6379> setrange test 10 hello
(integer) 15
127.0.0.1:6379> get test
"123321\x00\x00\x00\x00hello"
incr与decr -- 计数器命令
# incr命令,为指定key的value值+1。
# 如果key不存在,那key的值会先被初始化为 0,然后再执行incr操作。即key不存在通过incr命令创建后实际value值为1。
# 如果值包含错误的类型,或字符串类型的值不能表示为整数,则返回一个错误。操作成功返回+1后的实际数字。
incr key
# 示例
127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> incr test1
(integer) 2
127.0.0.1:6379> incr test1
(integer) 3
# decr命令,为指定key的value值-1。和incr命令相反。
# 如果key不存在,那key的值会先被初始化为 0,然后再执行decr操作。即key不存在通过incr命令创建后实际value值为-1。
# 如果值包含错误的类型,或字符串类型的值不能表示为整数,则返回一个错误。操作成功返回-1后的实际数字。
decr key
# 示例
127.0.0.1:6379> decr test
(integer) -1
127.0.0.1:6379> decr test
(integer) -2
127.0.0.1:6379> decr test
(integer) -3
# incrby和decrby命令,将key中存储的数字增加或减少指定的数值(整数)。
# 其余和incr、decr命令差不多,只是前两个是固定加减1,这两个是加减指定数值(整数)。
# 示例
127.0.0.1:6379> incrby test1 3
(integer) 3
127.0.0.1:6379> incrby test1 2
(integer) 5
127.0.0.1:6379> decrby test1 5
(integer) 0
# incrbyfloat命令, 操作key中存储的数字指定的浮点数加减操作,操作成功返回字符串实际数值。
# 其操作的value可以是整数和浮点数,但是经由incrbyfloat操作过的值不能再由以上整数命令操作,会返回错误。
# 操作其数值减少,在浮点数前加上-号即可。
# 示例
127.0.0.1:6379> incrbyfloat test1 1
"1"
127.0.0.1:6379> incrbyfloat test1 1.5
"2.5"
127.0.0.1:6379> incrbyfloat test1 1.7
"4.2"
127.0.0.1:6379> incrbyfloat test1 -1.9
"2.3"
Hash 散列表
hset -- 创建hashkey
- 其中field和value类似字典关系。
- 当field不存在时则直接创建并返回 1,当field存在时则覆盖其value并返回 0。
hset key field value
hget -- 获取一个field字段的value值
- 如果hashkey含有给定field,返回value 。
- 如果hashkey不含有给定field,或 key 不存在,返回为空 。
- 如果指定key不为hash,则报错。
hget key field
hmset -- 同时将多个field-value对设置到hashkey中
- 当field不存在时则直接创建,当field存在时则覆盖其value,操作成功后返回 OK。
hmset key field1 value1 field2 value2 field3 value3
hmget -- 获取多个field字段的value值
- 如果hashkey含有给定field,返回value 。
- 如果hashkey不含有给定field,或 key 不存在,返回为空 。
hmget key field1 field2
hgetall -- 获取在hash中指定key的所有field字段和value值
- 若指定key存在则返回其field和value,若指定key不存在则返回为空。
hgetall key
hsetnx -- 为hashkey不存在的的field字段赋值
- 如果该hashkey不存在,则直接创建并返回 1。
- 如果该hashkey存在,指定的field不存在,则新增该field并返回 1。
- 如果该hashkey已存在,操作无效,并返回 0。
hsetnx key field value
hdel -- 删除hashkey中的一个或多个指定field字段
- 不存在的字段将被忽略,返回被成功删除字段的数量,不包括被忽略的字段,当key中不存在field时,则hash也就不存在了。
hdel key field1 field2
hexists -- 查看hashkey中指定的field字段是否存在
- 如果hashkey中含有给定字段,返回 1 。
- 如果哈希表不含有给定字段,或 key不存在,返回 0 。
hexists key field
hincrby与hincrbyfloat -- 为哈希表key中的域field的值加上增量 increment
- hincrby 命令只能增加整数值,而 hincrbyfloat 可以增加小数值。
- 增量也可以为负数,相当于对给定域进行减法操作。
- 如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
- 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。即创建后value的值为给定的increment数值。
- 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
- 返回加减后的value数值。
hincrby key field increment
# 示例:hincrby name zhangsan 1
hincrbyfloat key field increment
# 示例:hincrbyfloat name lisi -1.5
hkeys与hvals -- 获取指定key的所有field或value
# 获取指定key的所有field字段
hkeys key
# 获取指定key的所有value值
hvals key
hlen -- 获取指定hashkey中field字段的数量
- 如果指定key存在则返回其field数量,若key不存在则返回0 。
hlen key
hstrlen -- 获取key中与给定域field相关联的值的字符串长度
- 如果给定的键或者域不存在,那么命令返回0 。
hstrlen key field
List 链表(列表)
lpush -- 将一个或多个值插入到list头部(左侧)
- 如果key不存在,将会直接创建并插入值。
- 执行成功时返回列表的长度。
lpush key value [value ...]
rpush -- 将一个或多个值插入list尾部(右侧)
- 如果key不存在,将会直接创建并插入值。
- 执行成功时返回列表的长度。
rpush key value [value ...]
lpushx与rpushx -- 当列表存在才将值 value 插入到列表 key 的表头/表尾
- 当 key 不存在时,命令什么也不做,并发返回0
- 若执行成功,则输出表的长度。
lpushx key value [value ...]
或
rpushx key value [value ...]
lrange -- 获取list指定范围内的元素
- 返回列表 key 中指定区间[start, stop]内的元素,即包含两个端点。
- 0 表示列表的第一个元素,-1 最后一个元素, -2 倒数第二个元素。
- 如果 start 下标比列表的最大下标 还要大,那么 LRANGE 返回一个空列表。如果 stop 下标比最大下标还要大,Redis 将 stop 的值设置为最大下标。
lrange key start stop
lindex -- 获取list指定index索引上的值
- 返回列表 key 中,下标为 index 的元素。
- 列表从 0 开始计数。
- 当index不存在时返回为空。
lindex key index
llen -- 获取列表长度
- key不存则返回 0。
llen key
linsert -- 将值value插入到list指定元素的前后
- 当 pivot 元素不存在于列表中时,不执行任何操作,返回-1。
- 当 key 不存在时,key 被视为空列表,不执行任何操作,返回 0。
- 如果命令执行成功,返回插入操作完成之后,列表的长度。
linsert key before|after pivot value
lpop -- 删除并返回list第一个(左侧)元素
- 当列表key不存在时,返回为空。
lpop key
rpop -- 删除并返回list最后一个(右侧)元素
- 当列表key不存在时,返回为空。
rpop key
blpop与brpop -- 列表的阻塞式(blocking)弹出(删除)命令
- LPOP/RPOP命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被BLPOP/BRPOP命令阻塞,直到等待timeout超时或发现可弹出元素为止。
- 当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
- 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
blpop key [key ...] timeout
或
brpop key [key ...] timeout
rpoplpush -- 用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回
在一个原子时间内,执行以下两个动作:
- 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
- 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
- 如果 source 不存在,值 nil 被返回,并且不执行其他动作。
rpoplpush source destination
brpoplpush
- brpoplpush 是 rpoplpush 的阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。
- 当列表 source 为空时, brpoplpush 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。
- timeout 为阻塞时长,单位为秒,其值若为 0,则表示只要没有可弹出元素,则一直阻塞。
- 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
brpoplpush source destination timeout
lrem -- 移除列表指定元素
- 返回被移除元素的数量。
- 列表不存在时返回 0 。
lrem key count value
- count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
- count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
- count = 0 : 移除表中所有与 VALUE 相等的值。
这个count的作用是为了当列表中有重复值时,count为0则删除指定的value(该重复值全部被删除),count为正数则从列表左侧开始删除count数量的value,反之负数就是从右侧。
ltrim -- 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
- 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
- 如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表,因为 LTRIM 已经将整个列表清空。
- 如果 stop 下标比 end 下标还要大,Redis 将 stop 的值设置为 end 。
- 执行成功返回OK。
ltrim key start stop
Set 集合
sadd -- 往集合里面添加元素
- key不存在则创建。
- set不能有重复值,重复值添加将被忽略。
- 返回添加元素个数。
sadd key member [member ...]
smembers -- 获取集合所有的元素
- 返回集合 key 中的所有成员。
- key不存在返回empty array(空数组)。
- 若 key 中包含大量元素,则该命令可能会阻塞 Redis服务。所以生产环境中一般不使用该命令,而使用 sscan 命令代替。
smembers key
sismember -- 判断集合是否有某个值
- 如果 member 元素是集合的成员,返回 1 。
- 如果 member 元素不是集合的成员,或 key 不存在,返回 0 。
sismember key member
scard -- 返回集合元素的个数
- key 不存在时,返回 0 。
scard key
srem -- 删除集合指定元素
- 不存在的 member 元素会被忽略。
- 返回成功移除的元素个数。
srem key member [member ...]
srandmember -- 随机获取集合内N个元素
- 返回集合中的 count 个随机元素,count 默认值为 1。
- 集合不存在返回为空。
- 若count 为正数且小于集合长度,则返回一个包含count 个元素的数组,数组中的元素各不相同;如果count 大于等于集合长度,则返回整个集合。
- 若count 为负数,那么返回一个包含 count 绝对值个元素的数组,但数组中的元素可能会出现重复。
srandmember key [count]
spop -- 随机删除并返回集合中的N个元素
- count 必须为正数,默认值为 1。
- 如果count 大于等于集合长度,则移除并返回整个集合。
- 集合不存在时,count 缺省或指定为1返回nil,count 指定为大于1的正数则返回empty array(空数组)。
spop key [count]
smove -- 将set1中的指定值移动到set2
- 类似于剪切粘贴,操作成功返回 1。
- 如果 source 集合不存在或不包含指定的 member 元素,则smove命令不执行任何操作,仅返回 0 。
- 当 destination 集合已经包含 member 元素时,smove命令只是简单地将 source 集合中的 member 元素删除。
- 当 source 或 destination 不是集合类型时,返回一个错误。
smove source destination member
sdiff与sdiffstore -- 返回给定所有集合的差集
- sdiff:返回key1拥有key2没有的值,如需返回key2拥有key1没有的值则交换key的位置即可。
- sdiffstore:不仅能够显示差集,还能将差集存储到指定的集合 destination 中。如果 destination 集合已经存在,则将其覆盖。
sdiff key [key ...]
或
sdiffstore destination key [key ...]
sinter与sinterstore -- 返回给定所有集合的交集
- sinter:返回key1和key2的重复项。
- sinterstore:不仅能够显示交集,还能将交集存储到指定的集合 destination 中。如果 destination 集合已经存在,则将其覆盖。
sinter key [key ...]
或
sinterstore destination key [key ...]
sunion或sunionstore -- 返回给定所有集合的并集
- sunion:返回key1、key2的所有值,重复项会去重。
- sunionstore:不仅能够显示并集,还能将并集存储到指定的集合 destination 中。如果 destination 集合已经存在,则将其覆盖。
sunion key [key ...]
或
sunionstore destination key [key ...]
SortedSet 有序集合
zadd -- 向有序集合添加一个或多个成员,或者更新已存在成员的score分数(double 类型)
- score就是排序编号(可重复),值越小越靠前,可使用整数或浮点数。
- 返回插入value数量,重复value将被忽略(但是会更新score分数)。
zadd key score member [[score member] [score member] ...]
# 示例
zadd test 1 v1 2 v2 3 v3
zcard -- 获取有序集合的全部value数量
- 当 key 不存在时,返回 0 。
zcard key
zcount -- 获取指定score分数区间的成员数量
- 指定key不存在或score分数区间没有元素则返回为0。
zcount key min max
zrange与zrevrange -- 通过索引区间获取元素
- 0 表示列表的第一个元素,-1 最后一个元素, -2 倒数第二个元素。
- 当start 的值比有序集的最大下标还要大,或是 start > stop 时,zrange 命令只是简单地返回一个空列表。
- 当stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
- zrange命令会按 score 值递增排序,zrevrange命令会按score 值递减排序。
- 具有相同 score 值的成员按字典序/逆字典序排列。
- 如加上withscores参数则连同score分数一起输出。
- 若 key 中指定范围内包含大量元素,则该命令可能会阻塞 Redis 服务。所以生产环境中如果要查询有序集合中的所有元素,一般不使用该命令,而使用 zscan 命令代替。
# 增序
zrange key start stop [withscores]
# 降序
zrevrange key start stop [WITHSCORES]
zrangebyscore与zrevrangebyscore -- 返回指定score值在min和max之间的成员
- 有序集成员按 score 值递增/递减次序排列,zrangebyscore增序,zrevrangebyscore降序。
- 具有相同 score 值的成员按字典序/逆字典序排列。
- 如加上withscores参数则连同score分数一起输出。
- 可选的 LIMIT 参数指定返回结果的数量及区间(就像 SQL 中的SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程效率可能会较低。
# 升序
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
# 降序
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
zrank与zrevrank -- 返回指定元素的索引值
- zrank 命令会按 score 值递增排序(索引从左至右,第一个成员的索引为 0,第二个成员为 1)。
- zrevrank 命令会按 score 递减排序(索引从右至左,最后一个成员的索引为 0,倒数第二个成员为 1)。
- 元素不存在则返回nil。
zrank key member
zscore -- 返回指定元素的score值
- 指定元素不存在则返回nil。
zscore key value
zincrby -- 为指定元素增加/减少score值
- 为有序集 key 的成员 member 的 score 值加上增量 increment 。
- increment 值可以是整数值或双精度浮点数。
- 可以通过传递一个负数值 increment ,让 score 减去相应的值。
- 当 key 不存在,或 member 不是 key 的成员时, zincrby key increment member 等同于zadd key increment member 。
- 执行成功,则返回 member 成员的新 score 值。
zincrby key increment member
# 示例
127.0.0.1:6379> zrange test 0 -1 withscores
1) "v1"
2) "1"
3) "v2"
4) "2"
127.0.0.1:6379> zincrby test 5 v1
"6"
127.0.0.1:6379> zrange test 0 -1 withscores
1) "v2"
2) "2"
3) "v1"
4) "6"
zrem -- 删除指定元素
- 不存在的成员将被忽略。
- 返回删除元素的个数,不包括被忽略的成员。
- 指定key或value不存在返回为0。
zrem key member [member ...]
zremrangebyrank -- 删除指定索引区间的元素
- 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
- 区间参数从 0 开始,即 0 表示排名第一的成员, 1 表示排名第二的成员,以此类推。
- 也可以使用负数表示,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。
- 命令执行成功,则返回被移除成员的数量。
- 索引区间没有成员则返回 0。
zremrangebyrank key start stop
zremrangebyscore -- 删除指定score值之间的元素
- 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于min或max)的成员。
- 返回删除元素的个数。
- 指定key或权重之间不存在元素则返回为0。
zremrangebyscore key min max
Geospatial 地理位置
geoadd -- 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
- 当坐标位置超出上述指定范围时则会报错。
- 两级(南极北极)是无法直接添加的,一般会下载城市数据,直接通过Java程序一次性导入。
# 语法,可同时添加多个
geoadd key 经度 纬度 地理位置 [经度2 纬度2 地理位置2]
# 示例
geoadd china:city 116.40 39.90 beijing
geopos -- 从key里返回所有给定位置元素的位置(经度和纬度)
- 返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。
- 当给定的元素不存在时,对应的数组项为空值。
# 语法,可同时查询多个
geopos key member [member2]
# 示例
geopos china:city beijing
geodist -- 返回两个给定位置之间的直线距离,如果两个位置之间的其中一个不存在则返回为空
- 指定单位的参数 unit 必须是以下单位的其中一个:
- m 表示单位为米;
- km 表示单位为千米;
- mi 表示单位为英里;
- ft 表示单位为英尺;
- 如果没有显式地指定单位参数, 那么默认使用米作为单位。
- 如果两个位置之间的其中一个不存在, 那么命令返回空值。
- 在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。
# 语法
geodist key member1 member2 [unit]
# 示例
geopos china:city beijing shanghai km
georadius -- 以给定的经纬度为中心,找出某一半径内的元素。
- 以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的所有位置元素。
# 语法,longitude、latitude表示当前位置的经纬度,radius表示搜索半径,m|km|ft|mi表示单位
georadius key longitude latitude radius m|km|ft|mi
# 示例
georadius china:city 110 23 1000 km
Hyperloglog 基数统计
pfadd -- 添加一个或者多个元素
- 如果内部存储被修改了返回 1,否则返回 0。
pfadd key member1 member2 ...
pfcount -- 统计key集合中基数的个数
- 该命令作用于单个 key 时,返回给定 key 的 HyperLogLog 集合的近似基数;
- 该命令作用于多个 key 时,返回所有给定 key 的 HyperLogLog 集合的并集的近似基数;
- 如果key 不存在,则返回 0。
pfcount key [key...]
pfmerge -- 合并多个key中的元素,并且剔除其中重复的元素,产生新的集合
- 将多个 HyperLogLog 集合合并为一个 HyperLogLog 集合,并存储到 destkey 中。
- 合并后的 HyperLogLog 的基数接近于所有 sourcekey 的 HyperLogLog 集合的并集。
pfmerge destkey sourcekey [sourcekey...]
Bitmap位图场景
通过偏移量(offset)定位元素,来进行0|1的设置,表示某个元素的值或者状态。
setbit -- 添加
- offset 只能是包含 0的正整数,通常代表日期,比如1-7来统计一周,1-31来统计一月,最多366也就能统计一年了;
- value是值只能是 0或者 1,用来代表布尔状态,比如说打卡状态;
- offset 和 value 超出指定范围会报错;
- 当offset 重复设置时,就是更新其value 状态;
- 其返回值是offset位置的原始值,不是成功状态。
# 语法
setbit key offset value
# 示例
127.0.0.1:6379> setbit sb 1 1
0
127.0.0.1:6379> setbit sb 2 1
0
127.0.0.1:6379> setbit sb 3 1
0
127.0.0.1:6379> setbit sb 4 0
0
127.0.0.1:6379> setbit sb 5 1
0
127.0.0.1:6379> setbit sb 5 0
1
getbit -- 获取key中的指定offset值
- 就是用来获取指定某一天的状态。
- 当 offset 比字符串值的长度大,或者 key 不存在时,返回 0 。
# 语法
getbit key offset
# 示例
127.0.0.1:6379> getbit sb 4
0
127.0.0.1:6379> getbit sb 3
1
bitcount -- 统计操作
- 统计给定字符串中,value为 1的数量。
- key不存在则返回 0。
# 语法,可以通过索引选取指定offset范围,但是默认是byte,1byte=8bit,所以使用索引区间还需要指定bit参数。
bitcount key [start end [BYTE|BIT]]
# 示例
127.0.0.1:6379> bitcount sb
3
127.0.0.1:6379> bitcount sb 3 5 bit
1
127.0.0.1:6379> bitcount sb 1 5 bit
3
127.0.0.1:6379> bitcount sb 2 5 bit
2