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 多路复用机制。