Redis面试复习(基础)

Redis特点、优势

  • 高性能:
    Redis存在内存中,所以读写非常快
    MySQL的2000QPB就顶不住了,Redis可以达到每秒10w左右的QPB
  • 高并发:
    直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

redis 和 memcached 的区别

  • redis支持更丰富的数据类型(支持更复杂的应用场景)
  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
  • 集群模式
  • Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。

单线程的Redis为什么快

  1. 纯内存操作
  2. 单线程操作,避免了频繁的上下文切换
  3. Redis利用队列技术将并发访问变为串行访问

Redis五种数据结构

  • String 最常见的类型,统计网站访问数量,当前在线人数等。
  • Hash 以将结构化的数据,比如一个对象给缓存在 redis 里,存储、读取、修改用户属性
  • List 实现简单的消息队列 ,以完成多程序之间的消息交换 ,可以做最新消息列表, 可以做类似微博那种下拉不断分页的东西
  • Set(无序,自动去重) 基于 set 玩儿交集、并集、差集的操作,把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁
  • Zset(sorted set:自动排序)可以实现各类排行榜功能

    Zset底层实现是跳表:因为其可以快速的插入和删除,且是排好序的,所以可以建多级索引。
    索引位置是某种程度的随机

Redis持久化

把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。

  • RDB 快照持久化
    Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的数据文件为dump.rdb,通过配置文件中的save参数来定义快照的周期。
  • AOF 追加文件持久化
    将每一个收到的写命令都通过Write函数追加到文件最后,当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
    当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

redis 过期时间

Redis中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。项目中的 token 或者一些登录信息,尤其是短信验证码都是有时间限制的

定期删除+惰性删除

  • 定期删除
    默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
    如果全部检查的话,数据量多会早场性能浪费,造成负载
  • 惰性删除
    很多过期 key 到了时间并没有被删除掉。当你的系统去查一下那个 key,发现已经过期,会被redis给删除掉

内存淘汰机制

  • olatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的).
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。

出现问题

缓存击透

请求缓存中不存在的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决办法

  1. 简单粗暴的方法,如果一个查询返回的数据为空,我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
  2. 布隆过滤器:优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
    是一个字节数组,然后有多个hash函数,其中的一个Hash值我们得出某元素不在集合中,那么该元素肯定不在集合中。只有在所有的Hash函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。

缓存雪崩

缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力
解决办法

  1. 设置不同的过期时间,例如电商项目中,设置过期时间时,采用随机函数生成时间并且对热门商品设置较长的过期时间,对冷门商品设置较短的时间。
  2. 用加锁( 最多的解决方案)或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上

多机Redis部署

主从复制,读写分离
一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值