美文网首页
redis初识

redis初识

作者: 镜中无我 | 来源:发表于2019-10-09 16:21 被阅读0次

    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的底层数据结构会根据数据量的大小进行转储,数据量大的时候采用跳表

    redis的两种持久化方式

    image.png
    AOF持久化
    image.png
    references:

    https://juejin.im/entry/5b7cfe976fb9a01a13366d95

    相关文章

      网友评论

          本文标题:redis初识

          本文链接:https://www.haomeiwen.com/subject/rjfwpctx.html