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, 解决方法 监控超热数据 适当延长过期时间,或者设置长期有效,之后再修改。