redis 相关知识

MySQL关系型数据库数据存储的问题

1,性能瓶颈  磁盘io性能低下

2,扩展瓶颈 数据关系复杂,扩展性差,不利于搭建集群维护

3,数据增多会让查询速度变慢

所以为了减少磁盘io次数,和数据之间的关系,就有了一个新的概念 nosql

 

NoSQL (not-Only SQl)  非关系型数据库 ,基于内存结构,数据之间没有关系。作为关系型数据库的补充,应对现在基于海量用户和海量数据的的数据处理问题。

 

比如电商场景下 会把热点和活动期间需要高频访问的数据缓存到redis当中,

redis是一个开源的可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库存储系统

 

redis的特点

1 高性能 , 内存存储不走 IO 在大数据量下也可以实现高性能运行  官方提供测试数据,50个并发执行100000个请求,读110000 次/s,写81000次/s

2 数据结构丰富  支持的数据类型有  String(字符串) hash(哈希)  list(列表)  set (集合)   zset(sorted set:有序集合)。

3 原子性 核心读写部分是单线程 排队执行 对应的操作便具有了原子性,避免多线程带来的复杂性和不安全型

4 高可用,redis 从3.0开始支持集群,可多主多从 ,单个节点故障,其他机器可迅速顶替,保证集群的高可用

5 可持久化,支持把数据持久化到硬盘中,以免遇到重启或者故障后可以从硬盘中恢复

 

实际上Redis每种数据结构都有自己底层的内部编码实现,而且是多种实现,例如list数据接口就包含了linkedlist和ziplist两种内部编码,同时有些内部编码可以作为多种外部数据结构的内部实现,可以通过object encoding 命令查询内部编码    如 object encoding hello;

 

应用场景
 
 1,缓存,查询频率较高,不经常变得数据
 2,即时信息,临时型的,经常变化的
 3,session共享,可用户解决分布式中session共享的问题  时效性消息,队列消息等
 
 
 
redis 的删除策略和淘汰策略  
 
删除策略是指已经过期的数据怎么删除
1,定时删除      节省内存CPU压力大 ,  不分时间段 到时间即删除过期数据    即使CPU性能使用过高时也会执行 占用CPU资源 
2,懒惰删除      节约CPU性能内存压力大,  数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断,如果未过期,返回数据。发现已过期,则删除,返回不存在。
3,定期删除    定期随机删除  , 使用固定的CPU资源  随机抽查  当前一场抽查删除很多数据时会再次抽查当前数据。周期性抽查存储空间(随机抽查,重点抽查)
 
淘汰机制是指当内存不够时淘汰掉一些数据以腾出内存空间,淘汰的可能是还未过期的数据
Redis在执行每个指令前,都要调用freeMemoryIfNeeded()检测内存是否充足,如果不能满足新加入数据的最低存储大小,redis要删除一些数据为新的数据腾出一些内存空间,此为逐出算法。
 
可以选择执行淘汰策略   长时间不用的、用的次数少的、快要过去过期的或者随机淘汰,也可也全盘删除获取不进行淘汰
 
 

面试可能会问道的redis常见的问题和解决方案

 
1  缓存预热,提前把需要用到的热点数据缓存到redis 避免大请求打到MySQL类的关系型数据库上
 
2  缓存穿透  当大量请求来查找没有的数据 ,请求到达redis 发现没有命中,然后请求到达了mysql 
      比如大量请求来查找id的-1 的数据   那MySQL数据的id都是从0开自增,当然就没有数据  这个时候就要排查问题 ,可能存在黑客攻击等问题,可以在接口处做基础校验,用户校验、id做基础校验,id<=0的直接拦截
      如果是相同的请求请求很多次,那么可以选择把固定的key缓存到redis,对应的value为null,
      如果是 每次请求参数不同,那可以缓存所有的不存在的key,内存压力过大淘汰机制会把有效数据淘汰。level1的方案已经不能解决。也可以使用布隆过滤器等过滤每次请求,不存在的数据会无法通过布隆过滤器,可以使用不超过1G的内存,存储超过百亿的数据量。
 
3 缓存雪崩  短时内大量的热点key同时过期  然后大量请求到MySQL,造成MySQL压力变大   如淘宝做活动是大量的缓存热点信息过期   然后用户请求直接打到MySQL
    解决方法 错峰设置热带数据的过期时间,采用不同的固定时间+-随机时间,避免同时失效的情况, 或者让缓存永不失效,之后再修改,还可以通过加互斥锁。
 
4 缓存击穿,  某个热点key过期  导致大量请求到MySQL,  解决方法  监控超热数据 适当延长过期时间,或者设置长期有效,之后再修改,还可以通过加互斥锁
 
 

为什么Redis这么快?

完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高 采用单线程,单线程也能处理高并发请求,想多核也可启动多实例

单线程反而避免了多线程的频繁上下文切换问题,预防了多线程可能产生的竞争问题。

核心是基于非阻塞的 IO 多路复用机制。

posted @ 2021-03-03 00:00  余一洋  阅读(70)  评论(0编辑  收藏  举报