Forever Young

What are you following

  • 首页
  • 标签
  • 分类目录
  • 文章归档
  • 行路万里
  • 读书万卷
  • About Me

  • 搜索
面经 解决方案 操作系统 Java源码 开源 GSoC 哲学 中间件 回溯 链表 书 top 数据库 分布式 滑动窗口 配置 动态规划 前缀树 并查集 Redis 总结 年终总结 面试 算法基础

Redis [1-1] 基础应用

发表于 2021-11-08 | 分类于 学习 | 阅读次数 259
# Redis
Redis[1] 简介、数据结构、应用场景
Redis [1-2] 数据结构源码

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 指令。

判定可能会误伤,但一定不会遗漏

简单限流

漏斗限流

参考1Java中boolean类型占用多少个字节

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硬件层面),具有高效存取的特点。

# Redis
Redis[1] 简介、数据结构、应用场景
Redis [1-2] 数据结构源码

  • 文章目录
  • 站点概览
erdengk

erdengk

87 日志
5 分类
24 标签
RSS
Github E-mail
Creative Commons
友链
  • 星球球友
  • Joey
  • 北松山(itwaix)-TP在职
  • JooKS' Blog-GSoC 2022 Mentor
  • Chever-John-Shein在职
  • 一堆网页小游戏
  • 飞鸟记
0%
© 2019 — 2023 erdengk
由 Halo 强力驱动
陕ICP备2021015348号-1
川公网安备 51011202000481号
轻点广告,请我喝水,非常感谢 (。・ω・。)ノ(*/ω\*)