Redis特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供1.spring(用的最多的一种,结构(key,value)),2.list(底层是链表,可以完成栈(左)或者队列(右)的场景),3.set(是无序的集合,不可以重复的集合),4.zset(在set的方法上加了一个排序的功能),5.hash(主要是存储对象的缓存)等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
存对象用map、一个hash存储一个对象,优点:就是在管理方面数据大的话spring不是很好,
限流算法:令牌桶,阿里的loude,
1. 那你们项目中redis主要做什么吗?
我们redis主要是做缓存的,就是缓存一些不经常改变的哪些 查询的热点数据,用来提高常用接口的访问效率;
2.缓存一致性是如何保证的呢?(双写一致性)
我们之前呢是在数据库更新的时候,采用的双删的一个策略,比如说在执行写的操作的时候先删除一遍缓存,然后再写数据库,最后在延时一段时间以后再去再删一遍缓存
这样做主要是为了避免一个场景,就比如说有一个请求去执行写操作在写操作之前先删除缓存又有一个请求去先查询缓存,这种脏数据的情况发生;
3.如何保证缓存中的热点数据?(我是去主动刷新的他的过期时间的)
就是在查询的时候redis缓存如果说命中一回就会给这个热点数据增加一段过期时间,就是确定过期时间,就是这样如果是被频繁查询的数据他的过期时间很定会长,不会到了预先
初始化设定的过期时间了就会失效,如果不怎么经常查询的这种老数据到了初始化设定的过期时间就会别淘汰吊;
4.redis的线程模型?
他的版本都是单线程的,然后就是6点叉之后是引入了多线层,单线程使用到了I/O 多路复用,然后六点叉多线层
单线层为啥快?
首先他是走的那个操作内存,也就是操作内存内存比较快的而且他这个单线程避免了线层切换,其次呢是通过I/O多路复用
I/O多路复用内部实现采用的什么模型?
让单线程(进程)的服务端应用同时处理多个客户端的事件;
I/O 多路复用模型是利用select、poll、epoll函数可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉。当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),依次顺序的处理就绪的流,这种做法就避免了大量无用的等待操作。
5.Redis 设置过期时间?
就是有一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般我们 set key 的时候,都可以给一个 expire time,就是过期时间,通过过期时间我们可以指定这个 key 可以存活的时间。
如果没成功咋办?
我是直接用一个原子操作了就是通过set原子操作就是(set多参数命令)
2.Redis是怎么对这批key进行删除的?
定期删除+惰性删除。
通过名字大概就能猜出这两个删除方式的意思了。
定期删除:Redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?因为假如 Redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!
惰性删除 :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。
6.Redis【集群规则、分片机制、缓存】;
codis,分布式缓存它底层是redis,集群不太一样,主要适用于缓存
我是实际上没有部署过,因为我们公司有专门的运维,他们维护了一些集群,我了解的就是我们的应用会通过Hash的Key会落到不同的节点上面去然后我们会每个节点他都会有个从节点的然后他保证了高可用;
Redis集群?
Redis哨兵虽然可以实现Redis的高可用,但是哨兵本身没办法实现高可用,程序调用存在风险,我们需要搭建集群来实现高可用.
Redis哨兵机制?
集群的工作原理:
1)集群中所有点都会保存集群中全部主从关系的信息并且所有节点之间可以互相通信.
2)定时向其他节点发送ping pong心跳检测,若某主机无法回应超一半以上则该主机宕机
3)剩余主机重新选举宕机主机的从机变为主机(从机只有判断宕机的投票权没有选举权)
4)此时新主机没有从机,若其他主机有可用从机借用其他主机的从机作为自己的从机
5)若宕机后无法借用也无法在推举新的主机发生主机数量减少则集群崩溃
哨兵机制是为了解决Redis分片存在的无法高可用的问题,因为如果redis分片的节点有一个服务器宕机,则直接影响用户的使用.
Redis分片机制?
单台Redis的内存大约是10M左右,若需要保存的缓存数据特别大,单台不够用,那么我们可以准备多台Redis来实现扩容.
7.Redis的缓存穿透,缓存雪崩,缓存击穿以及解决方案?
reids缓存的执行流程:
正常的使用缓存流程:数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的数据,放进缓存。如果数据库查询数据为空,则不放进缓存。
7.1缓存穿透
说明: 在高并发的条件下,用户频繁访问<一个不存在的数据>.导致大量的请求直接发往数据库.导致服务器宕机.
解决方案:
- 只要能够保障用户访问的数据 数据库中一定存在. 布隆过滤器
- IP限流 黑名单. 微服务中可以通过API网关进行控制,设置空值。
7.2缓存击穿
说明: 在高并发条件下 <用户频繁访问一个热点数据>. 但是该热点数据在缓存中失效.导致用户直接访问数据库.
解决方案:
异步定时更新,
互斥锁:就是当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。用一个线程去请求,
7.3缓存雪崩
说明: 在高并发的条件下, <有大量的缓存同时过期或缓存服务宕机>. 导致redis缓存服务器命中率太低.从而导致用户直接访问数据库.
主要问题: 热点数据失效.
解决方案:
1.为热点数据设定超时时间时 采用随机数. 10秒+随机数 保障数据不会同时失效.
2. 设定多级缓存
7.4布隆过滤器介绍?
布隆过滤器它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难
8.Redis内存优化策略?
Redis的缓存数据都在内存中,若数据量越来越大,则内存压力也会越来越大,甚至出现内
存溢出,因为我们需要将不使用的数据进行淘汰.
LRU算法:按照时间维度,将时间特别久最近使用少的数据进行淘汰。
LFU算法:按照引用计数的次数将最少引用的数据进行淘汰,最少引用次数是将引用计数
寄存器定时向右移一位,形成指数衰减的平均使用次数。
1838

被折叠的 条评论
为什么被折叠?



