Redis 是什么,为什么要用它?


引言

如今我们处在数字化的时代,我们的一举一动、一言一行都可以变成数字化的语言。而在我们借助于数字化的手段、借助大数据构建精准的用户画像,进而推送用户感兴趣的增值业务,就需要一款性能强劲、扩展性强的数据库模型,也就 Redis。


一、Redis 概述

1. 简介

  • Redis 是一个开源的、使用C语言编写的 NoSQL 数据库。

  • Redis 基于内存运行并支持持久化(支持存储在磁盘),采用 key-value (键值对) 的存储形式,是目前分布式架构中不可或缺的一环。

  • Redis 服务器程序是单进程模型,在一台服务器上可以同时启动多个 Redis 进程,但 Redis 的实际处理速度则是完全依靠于主进程的执行效率

  • 若在服务器上只运行一个 Redis 进程,但有多个客户端同时访问时,服务器的处理能力会有一定程度的下降

  • 若在同一台服务器上开启多个 Redis 进程,Redis 在提高并发处理能力的同时也会给服务器的 CPU 造成很大压力,在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程。

建议可以开2个进程,原因如下:
① 备份
② 抗高并发的同时尽量不给CPU造成太大的压力;
③ 若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个进程,若CPU资源比较紧张,采用单进程即可

2. 单进程为什么快

2.1 纯内存操作

  • 避免大量访问数据库,减少直接读取磁盘数据
  • redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快

2.2 单线程操作

  • 避免了不必要的上下文切换和竞争条件
  • 不存在多进程或者多线程导致的切换而消耗 CPU
  • 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

2.3 采用了非阻塞 I/O 多路复用机制

  • 多路复用机制概论:
    ① 用户首先将需要进行 IO 操作的 socket 添加到 select 中,然后阻塞等待 select 系统调用返回。当数据到达时,socket 被激活,select 函数返回。
    ② 用户线程正式发起 read 请求,读取数据并继续执行。这样用户可以注册多个socket,然后不断地调用 select 读取被激活的 socket,redis 服务端将这些 socke 置于队列中,然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中,提高读取效率。

  • 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作,从而提高效率。

在这里插入图片描述

举个例子:
老王在x城开了一家快递店,负责同城快送服务。老王因为资金限制,雇佣了一批快递员,然后老王发现资金不够了,只够买一辆车送快递。

  • 经营方式一 :
    ① 客户每送来一份快递,老王就让一个快递员盯着,然后快递员开车去送快递。慢慢的老王就发现了这种经营方式存在下述问题,几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递。随着快递的增多,快递员也越来越多,老王发现快递店里越来越挤,没办法雇佣新的快递员了,快递员之间的协调很花时间。
    ② 综合上述缺点,老王痛定思痛,提出了下面的经营方式

  • 经营方式二:
    ① 老王只雇佣一个快递员,客户送来的快递,老王按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

对比上述两种经营方式对比,是不是明显觉得第二种效率更高,更好 ?

  • 在上述比喻中:
每个快递员----------------->每个线程
每个快递------------------->每个socket(I/O流)
快递的送达地点-------------->socket的不同状态
客户送快递请求-------------->来自客户端的请求
经营方式------------------->服务端运行的代码
一辆车--------------------->CPU的核数
  • 总结
    经营方式一就是传统的并发模型,每个 I/O 流(快递)都有一个新的线程(快递员)管理。
    经营方式二就是 I/O 多路复用。只有单个线程(一个快递员),通过跟踪每个 I/O 流的状态(每个快递的送达地点),来管理多个 I/O 流。

2.4 灵活多样的数据结构

  • redis 内部使用一个 redisObject 对象来表示所有的 key 和 value
  • redisObject主要的信息包括数据类型、编码方式、数据指针、虚拟内存等。
  • 它包含String,Hash,List,Set,Sorted Set五种数据类型,针对不同的场景使用对应的数据类型,减少内存使用的同时,节省网络流量传输。

2.5 持久化

  • 由于 redis 的数据都存放在内存中,如果没有配置持久化,redis 重启后数据就全丢失了,于是需要开启 redis 的持久化功能,将数据保存到磁盘上,当 redis 重启后,可以从磁盘中恢复数据。
  • redis 提供两种方式进行持久化,一种是 RDB 持久化(原理是将redis在内存中的数据库记录定时 dump到磁盘上的RDB持久化)
  • 另外一种是 AOF(append only file)持久化(原理是将redis的操作日志以追加的方式写入文件)。
  • 持久化似乎和 redis 的速度快并没有直接关系,但是这保证的 redis 数据的安全性和可靠性,也起到数据备份的作用。

2.6 总结

  • 试想单线程是否就无法发挥多核CPU 性能,其实不然,我们可以通过在单机开多个 redis 实例来完善。

  • 单一线程只能用到一个 CPU 核心,所以可以在同一个多核的服务器中,启动多个实例,组成 master-master 或者 master-slave 的形式,耗时的读命令可以完全在 slave 进行,充分发挥 redis 的作用。

  • 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),其他模块也会用到多个线程,使用redis的过程中充分发挥其优势,避免一些不当操作,导致性能下降。

二、redis 特性

1. 具有极高的数据读写速度

数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000 次/s(理论上)

2. 支持丰富的数据类型

支持key-value、 Strings、 Lists、Hashes ( 散列值)、Sets 及Ordered Sets等数据类型操作

数据类型含义
string字符串(可以为整形、浮点和字符型,统称为元素)
list列表(实现队列,元素不唯一-,先入先出原则)
set集合(各不相同的元素)
hashhash散列值( hash的key必须是唯一的 )
set /ordered sets集合/有序集合

3. 支持数据的持久化

可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用

4. 原子性

  • Redis 所有操作都是原子性的,即一起成功,一起失败
  • 事务是一个完整的操作,事务的各元素是不可分的
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败

5. 支持数据备份

master-salve 模式的数据备份

  • Redis 作为基于内存运行的数据库,缓存是其最常应用的场景之一;
  • 除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录
  • 支持key-value、 Strings、Lists、 Hashes(散列值)、 Sets 及Ordered Sets 等数据类型操作。

三、为什么要用Redis?是不是一定要用Redis?

使用Redis,主要考虑性能和并发

1. 性能

我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。

mark

2. 并发

在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。
mark

四、redis 有什么缺点

  • 主要是四个问题
    ① 缓存和数据库双写一致性问题
    ② 缓存雪崩问题
    ③ 缓存击穿问题
    ④ 缓存的并发竞争问题
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发莫的了呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值