这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
Redis-刨根问底:
redis在企业中常用作一个缓存中间件,这里通过30问,解读redis的知识点。
1.什么时Redis:
k-v数据库,c语言编写,遵循BSD协议,基于内存也可持久化的日志数据库,广泛应用到数据库,缓存,消息中间件。支持事务持久化,lua脚本和集群方案等。
2.Redis优缺点:
优点:
- 内存操作,性能高,100kB/s的读写速度
- 高并发,10万级别的并发读写
- 主从模式,读写分离
- 丰富数据类型
- 支持持久化,不会丢失数据
缺点:
- 数据库容量受内存限制,不能实现海量数据的高性能写
- 不支持复杂逻辑查询,存储相对简单
- 有持久化能力,但是更多时也给disk-backed功能,相对传统意义上的持久化有所区别
3.mecache和redis区别:
4.redis支持的数据类型
基本数据类型:
- String
- hash
- list
- set
- zset
高级数据类型:
- hyperLogLog:
- Geo:
- BitMap:二进制字符串,可以进行位操作,方便统计用户数据
5.Redis中String类型的实现原理
底层实现了简单动态字符串类型(Simple Dynamic String,SDS)来表示String类型。没有用c语言自带的。
- 避免缓冲区溢出,可以通过len判断空间是否满足。
- 获取字符串长度的复杂度1较低
- 减少内存分配次数
- 兼容c字符串喊出,可以重写c语言库的一些函数。
6.Redis为何直接内存存储:
为了更快的读写速度,开启持久化可以异步方式将数据写入磁盘,因此redis可以快速和持久化。不受IO影响,redis开启了虚拟内存功能功能,会把不常用的数据写入磁盘。
7.redis如何进行内存优化
- 使用hash表:效率很高
- 根据业务使用bitmap:
- 利用共享0-9999整型对象池:共享数据,节约空间
- 合理内存回收,过期数据清理
8.如何实现分布式锁:
1.通过INCR,
2.通过SETNX,
3.通过SET,
9.高性能原因:
- 基于内存
- 数据结构简单,操作方便,
- 单线程,避免浪费上下文切换,竞争条件,等
- 使用了多路IO模型,和非阻塞IO
- redis的VM机制。
10.redis持久化方式
1.RDB(redis database)持久化:
默认持久化机制,按照一定时间将内存中的数据以快照的方式保存到磁盘,生成一个.rdb文件,save 来调节快照周期。
fork和cow:
执行bgsave会fork一个主进程,然后子进程将数据复制到临时.rdb文件中,复制完成后再将原来的文件替换掉。
cow就是copy-on-write,主线程时才会写操作会拷贝一份数据,执行写操作。
优点:
- 只有一个dump.rdb
- 容错性好
- 性能好
- RDB是紧凑的二进制文件,加载效率高。
缺点:
- 数据丢失,在持久化间隔中宕机会数据丢失
- fork子进程,数据集大时,可能导致服务器间歇性停止服务。
2.AOF(Append Only File)持久化
追加文件,些命令会记录在AOF文件中,对文件写入不会马上同步到磁盘中,而是先在缓冲区,同步选项有三种配置方式:
- always:同步刷盘
- everysec:每秒刷盘,最多丢失一秒数据
- no,系统控制,性能好
通过使用bgrewriteaof命令可以将AOF文件进行压缩,也可以自动触发。
优点:
- 持久化,数据安全 最多丢失一次。
- append追加,服务器宕机,也可以恢复。
- rewrite模式,节约空间
缺点:
- 生成文件大
- 启动效率低对比RDB,
- 需要定期执行重写操作来降低文件体机,
11.过期删除策略
1.定时删除:计时器,浪费cpu
2.惰性删除:使用的时候看是否过期,浪费内存
3.定期删除:折中。
12.同步机制:
Redis 主从同步分为增量同步和全量同步Redis 会先尝试进行增量同步,如果不成功则会进行全量同步。
增量同步:只同步写操作到从机
全量同步:先发送psync指令到主服务器,主服务器进行bgsave,将后续修改操作记录到buffer中,然后将bgsave全量同步到从服务器,从服务器会将RDB快照加载到内存到后到磁盘,然后同步期间的修改操作,然后完成全量同步。
13.Redis淘汰策略:
设有过期时间
- volatile-lru:尝试回收最少使用的键
- volatile-random:回收随机的键
- volatile-ttl:优先回收存活时间较短的键
没有过期时间
- allkey-lru:尝试回收最少使用的键
- allkeys-random:回收随机的键
- noeviction:当内存达到限制并且客户端尝试执行新增,会返回错误
基本原理规则:
- 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allKeys-lru
- 如果数据呈现平等分布,也就是所有的数据访问频率大体相同,则使用 allKeys-random
- 关于 lru 策略,Redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取5个键(个数由参数maxmemory-samples决定,默认值是5),删除这5个键中最近最少使用的键。
14.Redis的常见问题
缓存穿透:缓存穿透是指缓存和数据库上都没有的数据,导致所有请求都落到数据库上,造成数据库短时间内承受大量的请求而导致宕机
缓存击穿:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),就会导致所有请求都落到数据库上,造成数据库段时间内承受大量的请求而宕机·
缓存雪崩:缓存雪崩是指大量缓存同一时间内大面积失效,后面的请求都会落到数据库上,造成数据库段时间无法承受大量的请求而宕掉