面试官:现在来考考你几道非常非常常见的Redis题目

Redis为什么快

1:基于内存操作
2:单线程,没有多线程的上下文切换的开销
3:高效的数据结构
4:多路复用io机制

Redis的数据类型

1:String类型
最常用数据类型。这个是二进制安全。什么是二进制安全,简单来说就是能够将输入作为原始的,无任何特殊格式意义的数据流,这意味着redis的string类型可以存储数据,包括图片等等。如果存储是数字,那么就行进行增加减少等操作。
String常用的实际应用类型的场景:

  • 缓存功能:非常常见的场景,配合redis高并发,数据快的特点,能够很好的降低数据库的压力,提高系统的读写的速度

2:Hash类型
类似Map结构,是键值对的组合。可以存储有结构化的数据。比如存储一个用户对象的数据,像是用户的昵称,性别,生日等等。

3:list类型
有序列表,应用场景非常多。
常见的场景:

  • 粉丝列表,文章评论列表等列表型的数据
  • 通过读取某个闭区间的元素,可以实现基于List的分页查询
  • 消息队列:生产者利用Lpush往左插入数据,消费者用BRpop消费

4:set类型
无序去重集合。这个也能有很多的花样。
利用求交集,并集,差集等操作,可以实现像是共同好友,共同关注等功能

5:Sorted Set类型
排序的set。
和set的应用场景也很相似,由于它具有排序的功能,还能实现像排行榜,热搜榜等功能。

除了这5大数据类型,还有其他一些也很好用的数据类型

6:Bitmap 类型
位图。就是按照bit位来存储信息,可以用来布隆过滤器。所谓的布隆过滤器是指能够判断某个元素是否在某个集合里。

7:HyperLogLog类型
适合做大规模的数据去重统计

8:Geospatial类型
可以保存地理位置,也可以进行位置距离计算等

9:pub/sub类型
可以做简单的消息队列

10:Pipeline类型
管道机制。一次发送多个命令,节省往返时间。

Redis的过期策略和内存淘汰机制

redis的过期策略用到的是定期删除+惰性删除
定期删除:每隔100ms随机抽取一些key值检查是否过期,过期就删除
惰性删除:获取key时,redis先检查是否过期,过期的话就直接删除。

定期删除+惰性删除有可能导致某些过期key永远不会被删除,于是,需要通过内存淘汰机制进行内存淘汰

内存的淘汰机制一般有如下策略
noeviction:内存不足时,直接读写报错,这个一般都没人用吧
allkeys-lru:淘汰整个键值中最久没被使用的健值对
volatile-lru:淘汰设置过期时间中最久没被使用的
allkeys-random:随机淘汰任意健值对
volatile-random:随机淘汰过期时间中最久没被使用的
volatile-ttl:优先淘汰设置过期时间中最快过期的

缓存数据双写一致性

使用Cache Aside Pattern模式。这时最经典的缓存+数据库读写的模式

  • 读的时候,先读缓存,缓存没有,就去读取数据库,然后放入缓存中,再返回响应
  • 更新的时候,先更新数据库,再删除缓存

缓存三大问题

缓存穿透
这个一般是指去大量请求缓存和数据库都没有的数据。比如说请求id=-1的数据。通常这些用户都是攻击者。这种的解决方法可以有
1:应用层做校验过滤,比如用户鉴权检验,id检验
2:对于没有的数据,可以返回null并存在缓存里,然后设置一个较短的过期时间
3:布隆过滤器

缓存击穿
指的是大量的请求访问一个key,突然这个key失效了,那么这些大量的请求直接打到数据库上。这种的解决方法可以是:
在第一个查询的请求用一把互斥锁锁住它,然后查到数据后再放回缓存,再释放锁。后面的请求过来就直接在缓存上获取数据。

缓存雪崩
这个和缓存击穿很像,区别是这个是大量的key同时失效。这个解决方法可以是
1:过期时间加个随机的时间
2:和缓存击穿一样用互斥锁

Redis持久化机制

Redis提供RDBAOF两种持久化机制。
RDB机制
RDB机制下,redis会创建一个一模一样的子进程去进行持久化,这个进程会先将数据写到一个临时文件,然后再用这个文件去替换上去持久化的文件。redis在执行shutdown,save,bgsave,flushall触发该机制的持久化。在redis配置文件里,也可以通过配置文件来触发该机制的持久化。配置文件如下

save 900 1 //表示900秒内有一个key发生变化,那么触发持久化机制
save 300 10 //以此类推
save 60 10000 

AOF机制
AOF机制是根据历史日志进行持久化。AOF触发机制的配置

#appendfsync always
appendfsync everysec
#appendfsync no

always表示数据一有变化就持久化到磁盘,性能比较低,但是安全。
everysec表示每隔一秒持久到磁盘,这是redis默认的配置
no表示不同步到磁盘,由操作系统自行同步
always和no都太极端,一般是采用everysec,这就意味着AOF机制下最多丢失1秒的数据

随着时间的推移,AOF持久化文件会越来越大。因此,需要对AOF持久化文件进行重写。AOF重写的原理是将多个命令合成一个,比如10次的i++,直接写成i+10,重写的目的就是为AOF持久化文件进行瘦身。

触发AOF重写的配置

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

64mb表示文件大小超过64mb第一次重写,100表示100%,是指后面触发重写的文件增长率。
比如一个文件超过64mb进行重写,文件瘦身到40mb,然后当文件增长100%也即80mb又进行重写。

现今,RDB和AOF都是一起开启的。是默认优先加载AOF。只有AOF加载失败才去加载RDB文件。

Redis高可用

1:主从
一般是解决单机的内存性能问题。在不同机器上分别部署Master和slave,可以同时对外提供服务和读写分离策略。当Master宕机时,也可以将slave升级为Master。不过,主从模式没有故障转移和监控,如果Master挂了,还需要手动切到slave。因此虽然比单实例可用性要好些,不过在生产上还是不太会用。
2:哨兵
基于主从模式,不过提供了master的监控和故障转移。当master出现故障时,会自动选举一台slave作为master,当master恢复后,再切回来。哨兵之间也能做集群部署,相互监测。
3:Redis-Cluste
Redis集群是提供在多个redis节点间共享数据的程序集。以3个Master和3个slave节点为例,Redis集群有16384个Hash槽,每个key对16384取模来决定放哪里Hash槽。集群的每个节点负责一部分的Hash槽。为了保证高可用性,每个节点都会有1-n个从节点。假如Master-A不能用了,就会选举处一个Slave-A作为新节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值