
Redis深度历险核心原理和应用实践学习笔记
文章平均质量分 75
心 雨 尘
这个作者很懒,什么都没留下…
展开
-
应用 9:大海捞针 —— Scan
1.keys在Redis维护工作中,有时需要从Redis实例成千上万个key值找出特定前缀的key列表,如何在海量的key值中找到满足特定前缀的key列表?keys用来列出满足特定正则字符串规则的key值(1)缺点a.没有offset、limit参数,一次性输出所有满足条件的key值,这样对于满足条件较多的情况会造成很大的困扰。b.且使用遍历算法,复杂度O(n),如果满足条件的key较多,这个指令就会造成Redis服务卡顿,所有其他读写指令都会被延后甚至超时报错,因为Redis是单线..原创 2021-09-05 14:47:05 · 300 阅读 · 0 评论 -
应用 8:近水楼台 —— GeoHash
1.Redis在3.2 版本以后增加了地理位置GEO 模块实现“附近的人”这样的功能2.假如你用数据库来算附近的人地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90,90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。对于“附近的人”的功能,元素距离不会很大,使用勾股定理就可以算出距离。首先,你不能通过遍历计算所有目标的元素和目标元素的距离然后进行排序,这样计算量太大。一般是通过矩形区域来限原创 2021-09-05 14:39:47 · 212 阅读 · 0 评论 -
用 7:一毛不拔 ——漏斗限流
1.对于漏斗限流,漏洞的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去。如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水。如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满。如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空。所以,漏斗的剩余空间就代表着当前行为可以持续进行的数量,漏嘴的流水速率代表着系统允许该行为的最大频率。下面我们使用代码来描述单机漏斗算法。# coding: utf8import time原创 2021-09-05 14:35:19 · 239 阅读 · 0 评论 -
应用6:断尾求生 —— 简单限流
1.当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压。除了控制流量,限流还有一个应用目的是用于控制用户行为,避免垃圾请求。2.redis如何实现简单限流策略系统要限定用户的某个行为在指定的时间里只能允许发生 N 次,如何使用Redis的数据结构来实现这个限流的功能?先定义这个接口,理解了这个接口的定义#指定用户user_id的某个行为action_key在特定的时间内period只允许发生一定的次数max_countdefis_action_a...原创 2021-08-10 00:23:59 · 161 阅读 · 0 评论 -
应用5:层峦叠嶂 ——布隆过滤器
1.场景:在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。新闻客户端推荐系统如何实现推送去重?想法:(1)在服务器中记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。问题是当用户量很大,每个用户看过的新闻又很多的情况下,这种方式,推荐系统的去重工作在性能上跟的上么?如果历史记录存储在关系数据库里,去重就需要频繁地对数据库进行exists查询,当系统并发量很高时,数据库是很难扛住压力的。原创 2021-08-09 00:14:38 · 161 阅读 · 0 评论 -
应用4:四两拨千斤 —— HyperLogLog
1.场景:需要统计一个网页的一天的访问量,同一个用户一天之内的多次访问请求只能计数一次解决办法:为每一个页面一个独立的 set 集合来存储所有当天访问过此页面的用户 ID缺陷:页面访问量非常大,使用一个很大的 set 集合来统计,这就非常浪费空间。如果这样的页面很多,那所需要的存储空间是惊人的引入:Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81...原创 2021-08-08 23:12:17 · 159 阅读 · 0 评论 -
应用 3:节衣缩食 ——位图
1.位图用于用户一年的签到记录场景,可以减少存储空间2.位图指令(1)set,get,(前两个指令获取整个位图)setbit,getbit(2)位图统计指令bitcount,用来统计指定范围内1的个数,位图查找指令bitpos,用来查找指定范围内出现的第一个0或1比如我们可以通过 bitcount 统计用户一共签到了多少天,通过 bitpos 指令查找用户从哪一天开始第一次签到。如果指定了范围参数[start, end],就可以统计在某个时间范围内用户签到了多少天,用户自某天以后的哪天...原创 2021-08-01 23:57:01 · 168 阅读 · 0 评论 -
应用 2:缓兵之计 ——延时队列
1.redis做消息队列使用list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用 lpop 和 rpop来出队列2.队列空了怎么办客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。可是如果队列空了,客户端就会陷入 pop 的死循环,不停地 pop,没有数据,接着再 pop,又没有数据。这就是浪费生命的空轮询。空轮询不但拉高了客户端的 CPU,redis 的 QPS 也会被拉高,如.原创 2021-07-31 13:10:24 · 337 阅读 · 0 评论 -
应用 1:千帆竞发 ——分布式锁
1.分布式应用进行逻辑处理时经常会遇到并发问题比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是原子的。(Wiki 解释:所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。)这个时候就要使用到分布式锁来限制程序的并发执行。2.分布式锁(1)分布式锁本质上要实现的.原创 2021-07-30 14:51:36 · 214 阅读 · 0 评论