redis是Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,那我们为什么要使用redis呢?
为什么使用redis目录
- Redis为什么速度这么快?
- 谈谈Redis有哪些应用场景?
- 一对多的关系表,使用Redis设计会用到哪些数据结构类型?
- Redis的ZSet集合应用场景有哪些?
- 如何使用Redis完成订单列表场景?
- Redis同时打开AOP与RDB持久化操作后,请描述Redis在恢复数据时加载的顺序?
接下来我们来一一解决这些问题
一、redis为什么那么快?
从redis的存储机制:
- 内存数据库,基于key-value的nosql数据库,内存操作反应迅速
- 高效的数据类型: 五种值类型对应着七种数据结构,更加细粒度的内存选型使得内存利用率更高,因势利导,充分发挥内存操作的效率
从redis的运行机制:
redis为什么选择单线程?官方解释是因为cpu不是redis的性能瓶颈,而内存和网络带宽才是。所以顺理成章就应该设计成单线程的,但是事实上我觉得原因很简单,因为单线程确实也快,那么单线程更简单为什么不用呢?另外,这个快是没法定义的,所以大可能以后还会在因为某些场景的原因引入多线程
贴士:使用ps -T -p PID可以查看进程底下的线程,在4.0版本以后引入了多线程机制
- redis是单线程的数据库,数据库访问对应io管理和io处理在一个线程中串行完成,避免了线程或者进程切换的开销,以及数据同步带来的编程复杂性和效率损失;
- 单线程实现的机制是基于最高效的epoll(不同环境做编译时适配)多路复用机制,该机制本身效率级高;
- redis的底层模型不太一样(主要是通信机制)
- 当然redis在面对高并发场景下,也提供了分布式集群(基于主从复制),哨兵等高可用模型
注意:因为是单一线程,所以同一时刻只有一个操作在进行,所以,耗时的命令会导致并发的下降,不只是读并发,写并发也会下降。而单一线程也只能用到一个CPU核心,所以可以在同一个多核的服务器中,可以启动多个实例,组成master-master或者master-slave的形式,耗时的读命令可以完全在slave进行。
2. redis被用于哪些场景
image.png补充:redis是一种nosql数据库适合可扩展性强的数据存储,对较大数据处理比较快,分布式方面的应用也比较突出;但是对于结构化查询不太适合,虽然支持事务操作,但是单线程执行效率比较低。
3. 一对多的关系表,使用redis设计的时候会用到哪些数据结构类型
注意:我们在进行数据库转储的时候,更多的是关注value值本身,也就对于关系型数据库我们可能会优先考虑将单个元组的数据作为value值(key可以自定义,也可以使用主键),这个时候使用hashmap的效率相对比较高,但是如果仅仅存储某一列的值,我们又会优先使用set,zset,list等数据类型作为值。
下图是一个使用hash作为值保存数据库关系表的方式
image.png
redis的ZSet,list集合应用场景有哪些
前者按照分值顺序有序排列适合作为排行榜等,后者按照插入时间顺序排列适合当做有序队列
注意:ZSet的底层数据结构会根据数据量的大小进行转储,数据量大的时候采用跳表
网友评论