(二)redis的String类型 Bitmaps

16 篇文章 2 订阅
本文介绍了Redis中的分区概念,重点讲解了String类型的特点和常用命令,如二进制安全性、正反向索引等。此外,还详细阐述了Bitmaps位图的特性、命令及应用场景,如用户登录天数统计和活动备货数量计算。通过Redis的这些特性,可以高效地处理分布式锁和节约存储空间。
摘要由CSDN通过智能技术生成

一,分区概念

redis进程中有16个的分区,分区之间是隔离的。
在这里插入图片描述
#直接去8号库
redis-cli -p 6379 -n 8

二,String

  二进制安全的字符串
  这是最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)。
(一)正反向索引

在这里插入图片描述

(二)二进制安全

redis 是二进制安全的,并不会去破坏你的编码,也不去关心你是什么编码。底层存储的时候,是按照Byte字节存储的。
不会破坏你的编码,即使格式化以后,长度依然不会被改变

1,不同的编码,对汉字的长度表示不一样

在这里插入图片描述

(三)String 常用命令
keys  *    查看当前分区所有创建的key 
set      k1 111 nx 不存的时候去设置(只能新增:分布式锁)
set      k1 111 xx  存的的时候去设置(只能更新)
set      k1 111  ex 5   5秒后过期  px 毫秒
append   k1 "sdas"      追加到末尾
getrange k1  2  3        按下标获取值
setrange k1  2  "sss"   覆盖内容
type  k1   查看类型
object encoding k1  查看编码  有数值类型可以计算,有一些方法会改变数据的类型
strlen  k1 长度
redis-cli --raw 格式化
mget  k1 k2  获取多个key
mset  k1 1 k2 2 设置多个key
msetnx  k2 2 k3 3 原子性操作,都不存在的时候操作生效
FLUSHALL  清空
(四)使用场景
1,分布式锁

利用nx的特性,多线程创建同一个key,谁创建成功谁或得资源,执行完毕销毁,需要设置过期时间,防止线程意外中断,其他线程或得不到锁。
set k1 111 nx 不存的时候去设置(只能新增:分布式锁)

三,Bitmaps 位图

位图不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。由于字符串是二进制安全blob,其最大长度为512MB,因此适合设置为2^32个不同的位。

位操作分为两组:恒定时间的单位操作,如将位设置为1或0,或获取其值;以及对位组的操作,如对给定位范围内的设置位数进行计数(如总体计数)。

(一)位图特性
1,计算快

二进制数据的存储,进行相关计算的时候非常快。

2,占用空间小

位图最大的优点之一是,在存储信息时,它们通常可以极大地节省空间。例如,在用增量用户id表示不同用户的系统中,仅使用512MB内存就可以记住40亿用户的一位信息(例如,知道用户是否想要接收时事通讯)。
8bit = 1b = 0.001kb
bitmap就是通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态。
一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。

在这里插入图片描述

(二)Bitmaps 命令
SETBIT命令将位号作为其第一个参数,而作为第二个参数,将位设置为1或0的值。如果地址位超出当前字符串长度,则命令会自动放大字符串。
GETBIT只返回指定索引处的位的值。超出范围的位(寻址超出存储到目标键的字符串长度之外的位)始终被视为零。
BITOP在不同的字符串之间执行逐位操作。提供的操作是AND(按位与 有0则0,全1才1)  OR(按位或 有1则1,全0才0)
BITCOUNT执行人口计数,报告设置为1的位数。
BITPOS找到第一个位,其指定值为0或1。

BITPOS和BITCOUNT都可以使用字符串的字节范围操作,而不是运行整个字符串长度。

(三)使用场景
1,计算用户登录天数

公司有用户系统,让你统计用户登录天数,且时间窗口随机。例如,A用户在某一年中登陆了几次。怎么优化?
每人每年活跃200多天,如果人员基数大,关系型数据库的表数据是很庞大的。
可以使用redis实现,假设一年400天,让每一天对应一个二进制位,需要50个字节即可。
setbit sean 1 1 表示 sean 在第2天登录了一次(下标从0开始)
setbit sean 364 1 表示 sean 在第365天登录了一次
bitcount sean -2 -1 统计 sean 在最后16天的总登录次数,一个字节8天,最后两个字节
?不精确啊,16天,两周是14天,这个如何计算呢

2,活动备货,计算活跃用户数量

京东618做活动,登录就送礼物,假设京东有2亿用户。大库应该备货多少礼物?
用户应该分为:僵尸用户、冷热用户、忠诚用户
你需要统计活跃用户,也是随机时间窗口
比如说,统计本月1号~3号范围内的活跃过的用户,需要去重

位图旋转
key表示时间,每个用户占用一个二进制位
setbit 20190101 1 1
setbit 20190102 1 1
setbit 20190102 7 1

活跃用户有多少?
bitop or destkey 20190101 20190102 //两天的用户活跃数,按位或,有1则1
bitcount destkey 0 -1 //所有区间的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值