前言
常用的SQL数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的IO压力,但由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候,数据库的缓存才会产生作用,但这并不能减少业务逻辑对数据库的增删改操作的IO压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,可以大大缓解后端数据库的压力。
主流应用架构
![573a89215d8cb83a315213e370f0f205.png](https://i-blog.csdnimg.cn/blog_migrate/dbddcc2348674bfdb9ea8404e9588509.jpeg)
客户端在对数据库发起请求时,先到缓存层查看是否有所需的数据,如果缓存层存有客户端所需的数据,则直接从缓存层返回,否则进行穿透查询,对数据库进行查询,如果在数据库中查询到该数据,则将该数据回写到缓存层,以便下次客户端再次查询能够直接从缓存层获取数据。
缓存中间件 -- Memcache和Redis的区别
- Memcache:代码层类似Hash
- 1.支持简单数据类型
- 2.不支持数据持久化存储
- 3.不支持主从
- 4.不支持分片
- Redis
- 1.数据类型丰富
- 2.支持数据磁盘持久化存储
- 3.支持主从
- 4.支持分片
为什么Redis能这么快
Redis的效率很高,官方给出的数据是100000+QPS(query per second),这是因为:
1.Redis完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高。
2.Redis使用单进程单线程模型的(K,V)数据库,将数据存储在内存中,存取均不会受到硬盘IO的限制,因此其执行速度极快,另外单线程也能处理高并发请求,还可以避免频繁上下文切换和锁的竞争,如果想要多核运行也可以启动多个实例。
3.数据结构简单,对数据操作也简单,Redis不使用表,不会强制用户对各个关系进行关联,不会有复杂的关系限制,其存储结构就是键值对,类似于HashMap,HashMap最大的优点就是存取的时间复杂度为O(1)。
4.Redis使用多路I/O复用模型,为非阻塞IO(非阻塞IO会另写一篇解释,可以先行百度)。
注:Redis采用的I/O多路复用函数:epoll/kqueue/evport/select
选用策略:
1.因地制宜,优先选择时间复杂度为O(1)的I/O多路复用函数作为底层实现。
2.由于select要遍历每一个IO,所以其时间复杂度为O(n),通常被作为保底方案。
3.基于react设计模式监听I/O事件。
Redis的数据类型
- String
- 最基本的数据类型,其值最大可存储512M,二进制安全(Redis的String可以包含任何二进制数据,包含jpg对象等)。
![37e30b849acf569c4dcc04bc71508c2b.png](https://i-blog.csdnimg.cn/blog_migrate/6ac39d565133226e27de126b677093cb.jpeg)
注:如果重复写入key相同的键值对,后写入的会将之前写入的覆盖。
Hash
String元素组成的字典,适用于存储对象。
![3f9769ffb5f0c0b67df4ef3d212cfdc9.png](https://i-blog.csdnimg.cn/blog_migrate/f92a6a26d53a549ffcc6ec1bfdb3b1ea.jpeg)
List
列表,按照String元素插入顺序排序。其顺序为后进先出。由于其具有栈的特性,所以可以实现如“最新消息排行榜”这类的功能。
![5eb3da0616f639848ae02652166fea5f.png](https://i-blog.csdnimg.cn/blog_migrate/1d7c422cdeb68cf3ff36e04fdd1d9aec.jpeg)
Set
String元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为O(1)),不允许重复。
![af3a8ae050c03a3897ada818135a0bf6.png](https://i-blog.csdnimg.cn/blog_migrate/149491aee6a6f59e4865d6486be94641.jpeg)
另外,当我们使用smembers遍历set中的元素时,其顺序也是不确