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

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

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

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

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

 

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

 

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

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

 

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

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

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

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

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

 

redis支持的数据类型

 

支持类型表示形式
字符串类型string
列表类型list
散列类型hash
集合类型set
有序集合类型

zset/sorted_set

 

 

应用场景

 1,缓存,查询频率较高,不经常变得数据

 2,即时信息,临时型的,经常变化的

 3,session共享,可用户解决分布式中session共享的问题  时效性消息,队列消息等

 

 

 

redis 的删除策略和淘汰策略  

 

删除策略是指已经过期的数据怎么删除

1,定时删除      节省内存减少占用   不分时间段 到时间即删除过期数据    即使CPU性能使用过高时也会执行 占用CPU资源 

2,懒惰删除      内存占用严重,     延时执行  在CPU不忙的时候删除  CPU利用率高      

3,定期删除    定期随机删除    使用固定的CPU资源  随机抽查  当前一场抽查删除很多数据时会再次抽查当前数据

 

淘汰机制是指当内存不够时淘汰掉一些数据以腾出内存空间,淘汰的可能是还未过期的数据

Redis在执行每个指令前,都要调用freeMemoryIfNeeded()检测内存是否充足,如果不能满足新加入数据的最低存储大小,redis要删除一些数据为新的数据腾出一些内存空间,此为逐出算法。

 

可以选择执行淘汰策略   长时间不用的、用的次数少的、快要过去过期的或者随机淘汰,也可也全盘删除获取不进行淘汰

 

 

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

 

1  缓存预热,提前把需要用到的热点数据缓存到redis 避免大请求打到MySQL类的关系型数据库上

 

2  缓存穿透  当大量请求来查找没有的数据 ,请求到达redis 发现没有命中,然后请求到达了mysql 

      比如大量请求来查找id的-1 的数据   那MySQL数据的id都是从0开自增,当然就没有数据  这个时候就要排查问题 ,可能存在黑客攻击等问题

      如果是相同的请求请求很多次,那么可以选择把固定的key缓存到redis,对应的value为null,

      如果是 每次请求参数不同,那可以缓存所有的不存在的key,内存压力过大淘汰机制会把有效数据淘汰。level1的方案已经不能解决。也可以使用布隆过滤器等过滤每次请求,不存在的数据会无法通过布隆过滤器,可以使用不超过1G的内存,存储超过百亿的数据量。

 

3 缓存雪崩  短时内大量的热点key同时过期  然后大量请求到MySQL,造成MySQL压力变大   如淘宝做活动是大量的缓存热点信息过期   然后用户请求直接打到MySQL

    解决方法 错峰设置热带数据的过期时间,采用不同的固定时间+-随机时间,避免同时失效的情况, 或者让缓存永不失效,之后再修改。

 

4 缓存击穿,  某个热点key过期  导致大量请求到MySQL,  解决方法  监控超热数据 适当延长过期时间,或者设置长期有效,之后再修改。