您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
redis是什么(redis原理详解)
节点,哨兵,内存redis是什么(redis原理详解)
发布时间:2020-12-06加入收藏来源:互联网点击:
Redis 单节点会有可靠性问题,节点故障后锁操作就会失败。Redis 为了应对单点故障的问题,设计了多节点的分布式锁,也叫红锁。
主要思想是客户端跟多个 Redis 实例请求加锁,只有超过半数的实例加锁成功,才认为成功获取了分布式锁。
如下图,客户端分别跟 3 个实例请求加锁,有 2 个实例加锁成功,所以获取分布式锁成功:
缓存雪崩、击穿、穿透
①缓存雪崩
Redis 做缓存时,如果同一时间大量缓存数据失效,客户端请求会大量发送到数据库,导致数据库压力激增。
如下图:
应对方法主要有 3 个:
给 key 设置过期时间时加一个小的随机数限流服务降级②缓存击穿
某个热点 key,突然过期了,大量请求发送到了数据库。解决方案是给热点 key 不设置过期时间。
③缓存穿透
某个热点 key,查询缓存和查询数据库都没有,就发生了缓存穿透。
如下图:
应对方法主要有 2 个:
缓存热点的空值和缺省值查询数据库之前先查询布隆过滤器数据倾斜
什么是数据倾斜?看下面这个面试题:如果 Redis 有一个热点 key,QPS 能达到 100w,该如何存储?
如果这个热点 key 被放到一个 Redis 实例上,这个实例面临的访问压力会非常大。
如下图,redis3 这个实例保存了 foo 这个热点 key,访问压力会很大:
解决方法主要有两个:
①使用客户端本地缓存来缓存 key。
这样改造会有两个问题:
客户端缓存的热点 key 可能消耗大量内存。客户端需要保证本地缓存和 Redis 缓存的一致性。②给热点 key 加一个随机前缀,让它保存到不同的 Redis 实例上。
这样也会存在两个问题:
客户端在访问的时候需要给这个 key 加前缀客户端在删除的时候需要根据所有前缀来删除不同实例上保存的这个 keyBitmap 使用
有一道经典的面试题,10 亿整数怎么在内存中去重排序?
我们先算一下 10 亿整数占的内存,Java 一个整数类型占四字节,占用内存大小约:
10亿 * 4 / 1024 / 1024 = 3.7G
占得内存太大了,如果内存不够,怎么办呢?
①Bitmap 介绍
Bitmap 类型使用的数据结构是 String,底层存储格式是二进制的 bit 数组。假如我们有 1、4、6、9 四个数,保存在 bit 数组中如下图:
在这个 bit 数组中用 10 个 bit 的空间保存了四个整数,占用空间非常小。
再回到面试题,我们使用 bit 数组长度是 10 亿整数中 (最大值-最小值 1)。
如果有负数,需要进行一个转化,所有数字加最小负数的绝对值。比如 {-2, 0, 1, 3},我们转换成 {0, 2, 3, 5},因为数组下标必须从 0 开始。
②使用场景
员工打卡记录:在一个有 100 个员工的公司,要统计一个月内员工全勤的人数,可以每天创建一个 Bitmap,签到的员工 bit 位置为 1。
要统计当天签到的员工只要用 BITCOUNT 命令就可以。
要统计当月全勤的员工,只要对当月每天的 Bitmap 做交集运算就可以。
命令如下:
BITOP AND srckey1 srckey2 srckey3 ... srckey30
srckeyN 表示第 N 天的打卡记录 Bitmap。
统计网站日活跃用户:比如网站有 10 万个用户,这样我们创建一个长度为 10 万的 Bitmap,每个用户 id 占一个位,如果用户登录,就把 bit 位置为 1,日终的时候用 BITCOUNT 命令统计出当天登录过的用户总数。
作者:jinjunzhu
编辑:陶家龙
出处:转载自公众号程序员jinjunzhu
本文到此结束,希望对大家有所帮助呢。
上一篇:redmi note 7 pro怎么样 准备好入手了吗
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |