Redis [1-1] 基础应用
本文写于2022-01-16
为了放便连续阅读,固移动到此处主要借鉴 Redis 深度历险:核心原理与应用实践
分布式锁
见下一篇博客
延时队列
是redis 的消息队列不是专业的消息队列,它没有非常多的高级特性 ack 保证,如果对消息的可靠性有着极高要求,那么它就不适合使用。
如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop ,没有数据,接着再 pop ,还没有数据。这就是浪费生命的空轮询。空轮询不但拉高了客户端的CPU 消耗, Redis QPS 也会被拉高,如果这样空轮询的客户端有几十个, Redis的慢查询可能会显著增多。
解决方案:
blpop/ brpop
这两个指令的前缀字符 代表的是 blocki吨,也就是阻塞读。
阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。用 blpop/brpop 替代 lpop / rpop (出队操作) ,就完美解决上面的问题。
位图
比如记录365天打卡记录,一天用一个boolean表示,那就有365*4 (这里采用四个的理由见 参考1) 那就是1400+的字节,1.4k,一个人的365天用1.4k,1亿人就是 140G,完全无法接受的空间大小。
用位图来计算,每天的记录只占据一个位, 365 天就是 365 个位, 46 个字节(一个稍长一点的字符串)就可以完全容纳下,这就大大节约了存储空间。位图的最小单位是比特(bit ),每个 bit 的取值只能是 1或者0。
一个人46字节,0.046k,1亿人为3.6G,虽然大,但也比上面的方式省了很多空间了。
统计和查找
redis提供了命令查找365天打卡,或者查找某个星期一是否有打卡行为。
redis提供了位图统计指令 bitcount
和位图查找指令 bitpos
.
bitcount 用来统计指定位置范围内 1 的个数,
bitpos 查找指定范围内第一个出现的1或0.
统计-HyperLogLog
对于统计来说,如果数据要求不是那么严格,100w和100.2w是没什么差别的
HyperLogLog 提供了两个指令pfadd
,pfcount
,根据字面意思很好理解,一个是增加计数,一个是获取计数。
pfadd 和 set 集合的 sadd 的用法是一样的,来一个用户id,就将用户 ID 塞进去就是。
pfcount 和scard 的用法是一样的,直接获取计数值
步隆过滤器
大名鼎鼎步隆过滤器
黑名单、白名单、过滤都有你
布隆过滤器有两个基本指令,bf.add
,bf.exists
.
bf.add 添加元素, bf.exists 查询元素是否存在,它们的用法和 set 集合的 sadd sismember 差不多。注意 bf.add 只能一次添加一个元素,如果想要一次添加多个,就需要用到,bf.madd 指令。同样如果需要一次查询多个元素是否存在,就需要用到 bf.mexists 指令。
判定可能会误伤,但一定不会遗漏
简单限流
漏斗限流
1.https://www.cnblogs.com/wangtianze/p/6690665.html
1、1个bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
2、1个字节
理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
3、4个字节
理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。大多数人都会很自然的这样去想,我同样也有这个疑问,经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。