【HBZ分享】Redis的一些常见面试问题

Redis性能为啥那么快,常规QPS有多高

  1. Redis将数据保存在内存中,可以高效的读写。
  2. 支持多种数据结构,支持对这些数据的原子操作,原子操作避免了多个操作竞争和数据冲突,减少了锁的使用
  3. 采用非阻塞堵多路复用IO, 服务端一个线程处理多个请求, 避免了上下文切换和IO阻塞。因为上下文切换的时候要保存当前状态,切回来时还要恢复之前的状态,这块就有很大的损耗
  4. 性能:
    常规读写QPS的指标性能,因具体部署环境和硬件条件的不同是有差异的
    可以轻松处理百万级别的并发【读】请求, 写请求每秒【数万到10万+】,集群可以进一步提升
    官方数据:
    (1).Redis单例能处理key: 2.5亿个
    (2).一个key或value大小最大512M
    常规瓶颈:一般机器的内存和带宽,而不是CPU。

Redis是单线程还是多线程

  1. redis4.x-6.x的【工作线程】是单线程, 但是对于整个服务来说也是多线程,比如rdb备份,主从同步,异步删除也都是独立线程完成
    注意:
    (1). 对于Big Key删除,不推荐直接del key, 会阻塞主线程,而应该采用unlink key 异步删除操作
    (2). redis4.x引入了unlink key 和 flushall 【ASYNC | SYNC】, 异步删除相当于交给了外包小弟实现
  2. redis6.x开始多线程只是用来处理【网络数据的读写】和【协议解析】上,但底层数据操作还是单线程
  3. 执行命令还是单线程,这么设计是不想因为多线程而变得复杂,需要去控制key,lua,事务,LPUSH/LPOP等并发问题
  4. 默认不开启多线程,但要开启也可以(【网络数据的读写】和【协议解析】上),需要做如下配置
	io-threads-do-reads   yes
	io-threads  线程数
  1. 官方建议:线程数小于机器核数,比如4核的机器建议设置2或3个线程
  2. 开启多线程是否会有并发安全问题?
    答:不会有安全问题,多线程仅仅是处理【网络数据的读写】和【协议解析】上, 执行命令依然是单线程

Redis的key过期时间删除策略

  1. redis服务器使用【惰性删除】 和 【定期删除】两种策略结合
  2. 定期删除:
    (1).隔一段时间,就随机抽取一些设置了过期时间的key, 检查其是否过期,如果过期就删除
    (2).定期删除会导致很多key到了时间但没被筛选到,所以就没删除,此时惰性删除就上场了
  3. 惰性删除:
    (1).当key被访问的时候,会去检测key是否过期,如果过期直接删除,并返回null

Redis内存不够了怎么办,比如Redis只剩余10G,但此时需要写20G?

  1. Redis有淘汰策略
  2. 通常使用的淘汰策略:
    (1). volatile-lru: 最近最少使用,从设置了过期时间的key中选择空转时间最长的键值进行删除
    (2). volatile-lfu: 最近最不经常使用, 从设置了过期时间key中选择某段时间之内使用频次最少的键值删除
    (3). volatile-ttl: 删除离过期时间最近的key
    (4). volatile-random: 从设置过期时间的key中随即删除

在惰性删除+定期删除作用下,还会出现哪些问题?

  1. 如果大量过期的key没被定期删除选中,并且也长时间没被查询,那么这样的key就会逃脱惰性删除+定期删除的检测
    解决方案: redis的淘汰策略会处理该问题

你可能感兴趣的:(redis,面试,java)