redis14问 | 青训营笔记

98 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的常见问题

缓存穿透:缓存穿透是指缓存和数据库上都没有的数据,导致所有请求都落到数据库上,造成数据库短时间内承受大量的请求而导致宕机

缓存击穿:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),就会导致所有请求都落到数据库上,造成数据库段时间内承受大量的请求而宕机·

缓存雪崩:缓存雪崩是指大量缓存同一时间内大面积失效,后面的请求都会落到数据库上,造成数据库段时间无法承受大量的请求而宕掉