1.简单说一下Redis Cluster集群模式?
Cluster是redis 3.0推出,采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。Cluster数据分片的算法有哈希取模、范围分片、一致性Hash分区,Redis集群预分好16384个槽,当需要在Redis集群中放置一个key-value时,根据key的检验算法跟槽位取模,然后确定放置在哪个槽位。官方推荐6个节点,三主三从,主节点会自动分配,不是人工指定,主节点故障后,从节点会替换主节点。
2.说下Redis key的八种淘汰策略?
- volatile-lru:最近最少使用算法,从设置了过期时间的key中选出空转时间最长的键对其进行清除。
- volatile-lfu:最近不常用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键清除。
volatile-ttl:从设置了过期时间的键中选择过期时间最早的键对其清除。
volatile-random:从设置了过期时间的key中,随机进行清除
allkeys-lru:最近最少使用算法,从所有的key中选出空转时间最长的键对其清除。
allkeys-lfu:最近不经常使用算法,从所有的key中选出某段时间内使用频次最少的键值对其清除。
allkeys-random:所有键中,随机选择键进行删除。
noeviction:不做任何处理。
3.Redis key的过期策略?
定期删除:隔一段时间就会随机抽取一些设置了过期时间的key,检查是否已经过期,如果过期了就会删除,但是定期删除可能会导致很多过期的key到了时间但是还没有被删除。
惰性删除:当用户尝试的去访问它时,key会被发现并发现过期,惰性删除算法就会删除key。
定时删除:创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作, 但是对CPU的消耗会特别大。
4.说一说Redis的持久化方式?
Redis的持久化方式,分为两种RDB和AOF方式。
RDB:在指定的时间间隔内将内存中的数据集快照写入磁盘,默认的文件名为dump.rdb。save 900 5表示在900s内持久化5个key。文件紧凑,全量备份,适用于备份和灾难恢复。
AOF:追加文件的方式,以独立日志的方式记录每次写的命令,重启时重新执行AOF中的命令达到恢复。appendonly yes 开启aof持久化方式,默认是不开启的。默认文件名appendonly.aof,aof一共三种同步方式:appendfsync always(每次修改数据都会写入aof文件),appendfsync everysec(每秒同步一次),appendfsync no(从不同步),当AOF文件越来越大的时候会重写和压缩。
Redis4.0开启rdb和aof一起使用,直接将rdb持久化的方式来操作,将二进制的内容覆盖到aof文件中,写的话还是继续append追加到文件原始命令,等下次文件过大的时候再次rewrite。
5.Redis常见的数据结构有哪些?它们都有哪些作用?
String类型可以用作图形验证码,设置过期时间,可以做一些热点数据的使用,还可以实现分布式锁。
List类型可以做昨日热销榜单,不是实时的,由后台定时计算,0点更新榜单。
Set类型可以作为大数据下用户标签的去重,关注、共同好友等,用Set的交集、并集、差集处理。
Hash类型可以用作购物车实现,大Map->BoundHashOperations。
SortedSet类型可以用作电商热销实时榜单,用户游戏积分排名,IT视频热销榜单等。
6.Redis怎末实现分布式锁?
Redis实现分布式锁用String类型来做分布式锁的设置。
分布式锁的核心是保证同一时间,只能有一个client对共享资源进行操作。
背景就是优惠券领取次数限制、商品库存超卖。
设计分布式锁的时候主要要注意两点,第一就是在加锁的时候,保证加锁的原子性,也就是说在Redis中设置一个Key并且带有过期时间,这一步的操作是原子性的,第二就是在释放锁的时候,保证线程释放的是自己的锁。所以在加锁的时候采用redisTemplate中的opsFosValue().setIfAbsent()方法,加锁设置过期时间。那么保证了加锁的原子性,还要保证在释放锁的时候不会因为业务逻辑的执行慢,A线程的锁过期了,而删掉了B线程的锁。所以在释放锁所资源的时候判断一下是不是自己加的锁,value存储当前线程的唯一标识。删除的时候也是采用Lua脚本+redis保证删除的原子性。
7.说一说Redis主从复制的原理?
刚连接时,从节点回向主节点发送一个sync指令,master服务器会开启一个后台进程开始给从服务器同步数据,同步的是rdb文件,从服务器将rdb文件保存在磁盘并通过取该文件将数据读到内存,在此之后,master会将同步期间缓存的命令通过AOF的方式给slave服务器,然后slave将这些命令依次作用在自己的服务器上,和主服务器保持一致。
8.什么是缓存击穿、缓存穿透和缓存雪崩?
缓存击穿:某个热点key失效,缓存中没有但是数据库中有数据,假如某个key是热点数据,那个key在缓存过期的那一刻,同时有大量的请求,这些请求都会击穿到DB上,造成DB请求量增大。
解决办法:设置热点key不过期,定时任务更新缓存或者设置互斥锁,当请求过来时,发现缓存不存在数据时,就给当前请求加锁,后面的请求等待或者返回,当从数据库中拿出来放到缓存中时,就可以释放锁资源。
缓存雪崩:多个热点key缓存失效,大量的key设置了相同的过期时间、导致缓存在同一时间全部失效,造成瞬时DB请求量大、压力剧增。
解决办法:存数据的过期时间设置随机,防止同一时间大量数据过期现象发生或者设置热点数据永不过期。
缓存穿透:查询不存在的数据,由于缓存没有命中,DB也没有命中,给DB造成压力。
解决办法:增加接口层校验或者缓存和数据库都没有找到将一个-1缓存到redis中,防止这个key一直被攻击。