redis初识

2019-10-09  本文已影响0人  镜中无我

redis是Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,那我们为什么要使用redis呢?

为什么使用redis
目录
  • Redis为什么速度这么快?
  • 谈谈Redis有哪些应用场景?
  • 一对多的关系表,使用Redis设计会用到哪些数据结构类型?
  • Redis的ZSet集合应用场景有哪些?
  • 如何使用Redis完成订单列表场景?
  • Redis同时打开AOP与RDB持久化操作后,请描述Redis在恢复数据时加载的顺序?
接下来我们来一一解决这些问题

一、redis为什么那么快?

从redis的存储机制:
从redis的运行机制:

redis为什么选择单线程?官方解释是因为cpu不是redis的性能瓶颈,而内存和网络带宽才是。所以顺理成章就应该设计成单线程的,但是事实上我觉得原因很简单,因为单线程确实也快,那么单线程更简单为什么不用呢?另外,这个快是没法定义的,所以大可能以后还会在因为某些场景的原因引入多线程
贴士:使用ps -T -p PID可以查看进程底下的线程,在4.0版本以后引入了多线程机制

注意:因为是单一线程,所以同一时刻只有一个操作在进行,所以,耗时的命令会导致并发的下降,不只是读并发,写并发也会下降。而单一线程也只能用到一个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

上一篇 下一篇

猜你喜欢

热点阅读