【Redis】Strings常用指令及位图

set、get、setex、setnx

set:设置一个key的value值。
get:获取一个key的value值。
setex:设置一个key的value值,并指定失效时间。
setnx:当key不存在的时候,设置一个key的value值。key存在设置失败。

127.0.0.1:6379> set name xupeng
OK
127.0.0.1:6379> get name
"xupeng"
127.0.0.1:6379> setnx name zhuang
(integer) 0
127.0.0.1:6379> get name
"xupeng"
127.0.0.1:6379> setnx addr Jinan
(integer) 1
127.0.0.1:6379> get addr
"Jinan"
127.0.0.1:6379> setex memory 10 fish
OK
127.0.0.1:6379> ttl memory
(integer) 5
127.0.0.1:6379> ttl memory
(integer) -2
127.0.0.1:6379>

位图

在日常的工作开发中,会涉及到一些bool类型的数据存取,比如用户一年的签到记录,已签到是1,未签到是0。记录一年365年,如果使用普通的key/value,当用户数量非常庞大的时候,需要的存储空间是惊人的。

Redis中提供的位图数据结构可以解决这个问题,这样每个用户每天的签到记录只占一个位,365天就是365个位,46个字节就可以容纳下。

位图并不是特殊的数据结构,它的内容其实就是普通的字符串,也就是byte数组。我们可以使用get/set来获取整个位图的内容,也可以使用getbit/setbit等将byte数组看成位数组进行处理。

基本使用:setbit、getbit

目的:使用位操作将字符串设置为 hello。
首先,获取每个字符的ASCII码的二进制值。
h:01101000
e:01100101
l:01101100
l:01101100
o:01101111
低位 到 高位
setbit:设置key的value(string)在offset处的bit值。
getbit:返回key对应的string在offset处的bit值。
(只需要设置为1的位)

127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> get s
"h"
127.0.0.1:6379> setbit s 9 1
(integer) 0
127.0.0.1:6379> setbit s 10 1
(integer) 0
127.0.0.1:6379> setbit s 13 1
(integer) 0
127.0.0.1:6379> setbit s 15 1
(integer) 0
127.0.0.1:6379> get s
"he"
127.0.0.1:6379> setbit s 17 1
(integer) 0
127.0.0.1:6379> setbit s 18 1
(integer) 0
127.0.0.1:6379> setbit s 20 1
(integer) 0
127.0.0.1:6379> setbit s 21 1
(integer) 0
127.0.0.1:6379> get s
"hel"
127.0.0.1:6379>
127.0.0.1:6379> getbit s 0
(integer) 0
127.0.0.1:6379> getbit s 1
(integer) 1
127.0.0.1:6379> getbit s 2
(integer) 1
127.0.0.1:6379> getbit s 4
(integer) 1
127.0.0.1:6379>

统计和查找:bitcount、bitpos

bitcount:统计字符串被设置为1的bit数

127.0.0.1:6379> set s hello
OK
127.0.0.1:6379> get s
"hello"
127.0.0.1:6379> bitcount s
(integer) 21
127.0.0.1:6379>

bitpos:返回字符串里面第一个被设置为1或者0的bit位。

127.0.0.1:6379> setbit s 1 1
(integer) 0
127.0.0.1:6379> setbit s 2 1
(integer) 0
127.0.0.1:6379> setbit s 4 1
(integer) 0
127.0.0.1:6379> get s
"h"
127.0.0.1:6379> bitpos s 0
(integer) 0
127.0.0.1:6379> bitpos s 1
(integer) 1
127.0.0.1:6379>

bitpos可以指定start和end范围进行查找。
比如hello的二进制为01101000 01100101 01101100 01101100 01101111
1,从第三个字符开始,获取hello第一个被设置为0的bit位。

127.0.0.1:6379> set s hello
OK
127.0.0.1:6379> bitpos s 0 2
(integer) 16

2,从第三个字符开始,获取hello第一个被设置为1的bit位.

127.0.0.1:6379> set s hello
OK
127.0.0.1:6379> bitpos s 1 2
(integer) 17
127.0.0.1:6379>

参考《Redis深度历险 核心原理与应用实践》钱文品/著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值