Redis知识点汇总
Redis知识点
九、常见面试题
9.1redis为什么快
- redis是单线程模型,对应redis的单线程事件处理器(file event handler)
- redis通过套接字socket和其他的客户端进行连接。通过对文件事件的监听,服务器能进行处理。
- 文件事件处理器:
- 多个socket
- IO多路复用程序
- 文件事件分派器(将socket关联到对应的事件中)
- 文件事件处理器
- 性能:在cpu跑满的情况下,1kw的数据,每秒能个执行5563个请求(LRANGE),4w5个请求(set)
9.2redis单线程为什么比多线程快?
- 完全基于内存,大部分请求都是内存操作,所以很快。类似HashMap,优势在于查找和操作的时间复杂度都是O(1)。
- 采用单线程,可以避免不必要的上下文切换和竞争条件,多线程之间需要切换,消耗cpu。
- 单线程不用考虑锁的问题。不会因为死锁而产生多余的性能消耗。
- 采用多路I/O复用(epoll)模型,并非阻塞IO
9.3redis常用数据类型
- String
- List
- Set
- Hash
- ZSet
- hyperloglog
- bitmap
- geospatital
- stream
9.4Redis的持久化机制了解吗?
两种机制:RDB和AOF,默认RDB
RDB:
快照持久化,redis通过fork一个子进程进行持久化,在子进程中创建一个临时文件写入数据,当数据写完,用临时文件替换上次持久化的文件。整个过程中,主进程不需要进行IO操作
AOF:
- 当每执行一条写操作,会将操作append在AOF缓冲区中
- 根据持久化策略,将缓冲区的内容(appendfsync)刷到磁盘文件中。
- 当AOF文件大小超过重写策略的大小时,会通过rewrite压缩AOF文件。
- 当redis重启后,会根据AOF文件,重新加载写操作,恢复数据。
二者对比:
RDB:
- 适合大规模数据恢复,恢复速度快,节省磁盘空间。
- fork时采用写时复制技术,如果数据量太大,性能会有影响。
- 有数据丢失的风险。
AOF:
- 数据丢失的风险较小。
- 占用更多的磁盘空间,恢复速度慢。
9.5 redis过期键淘汰(删除)策略
5种策略
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
- volatile-ttl:挑选将要过期的数据进行淘汰
- volatile-random:任意选择数据淘汰
- allkeys-lru:当内存不足时,在key空间中,移除最近最少使用的key淘汰
- allkeys-random:从key空间中,任意选择数据淘汰。
2种删除
定期删除:
在设置某个key的过期时间的时候,创建一个定时器,让定时器倒计时结束时,对其进行删除。
优点:对内存友好,能够保证能存的key一旦过期就从内存中删除,释放空间。
缺点:对cpu不友好,在过期键较多时,删除过期键会占用一部分CPU事件,对服务器的性能和吞吐量有影响。
惰性删除:
设置某个Key的过期事件,当需要该key时,检查是否过期,如果过期,就删除,否则就返回该key的值。
优点:有利于cpu的运转,在使用该key时才进行过期检查,对于很多用不到的key不用进行检查。
缺点:不利于内存空间的释放。如果一个键已过期,但是一直没有使用,不检查到就不会释放内存。从而造成内存泄漏。
9.6Redis内存用完了会发生什么?
达到设置的内存上限,写命令会返回错误信息(读命令还会正常返回),如果设置了内存淘汰策略,则会淘汰旧内容。
9.7缓存穿透、缓存击穿、缓存雪崩
缓存穿透:
查询根本不存在的key A,使得请求穿过redis直达数据库(DB),DB负载过大时,就会宕机。
解决方案:
- 缓存空对象
- 设置布隆过滤器
缓存击穿:
一份热点数据,访问量极大,在缓存失效的瞬间,大量请求直达DB。
解决方案:
- 设置热点数据永不过期
- 加互斥锁,当一个线程访问数据时,其他线程等待。
缓存雪崩:
key对应的数据存在,但是在redis中的某一时刻,
但是在redis中的某一时刻,key大批量失效,如果这个时刻有大量的并发请求过来,就会发现缓存过期,就会访问DB,并更新到缓存中,大量请求会使DB崩溃。