Redis学习(2)-- Redis入门

Redis入门

Redis是什么

Redis(Remote Dictionary Server),远程字典服务。是一个开源的使用ANSI C语言编写的,支持网络,基于内存亦可持久化的日志型,Key-Value数据库,并提供多种语言的API。免费和开源,是当下最热门的NoSQL技术之一,也被称为结构化数据库。

Redis能做什么

  1. 内存存储,持久化(rdb,aof)
  2. 效率高,可以用于高速缓存
  3. 发布订阅系统
  4. 地图信息分析
  5. 计时器,计数器(浏览量)

Redis特性

  1. 多样的数据类型
  2. 持久化
  3. 集群
  4. 事务

测试性能

redis-benchmark是一个压力测试工具

Redis基本知识

redis默认有16个数据库,默认使用的是第0个数据库,可以使用select进行切换。

select num #选择数据库
keys * #查看当前数据库所有key
flushdb #清空当前数据库
flushall #清空全部数据库

redis曾经是单线程的

核心:redis是将所有数据都放在内存中的,所以说使用单线程去操作效率就是最高的,多线程数据耗时操作,对于内存来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存情况下,这就是最佳方案。

redis 6.0之后的版本抛弃了单线程模型这一设计,原本使用单线程运行的Redis也开始选择性使用多线程模型。

  1. 为什么Redis一开始选择使用单线程模型?
  2. 为什么Redis在6.0之后加入了多线程?

不管是单线程或者多线程都是为了提升Redis的开发效率,因为Redis是一个基于内存的额数据库,还要处理大量的外部网络请求,不可避免的要进行多次IO。

为什么使用单线程

(1)IO多路复用

在这里插入图片描述

FD是一个文件描述符,意思是表示当前文件处于可读、可写还是异常状态。使用 I/O 多路复用机制同时监听多个文件描述符的可读和可写状态。你可以理解为具有了多线程的特点。

一旦受到网络请求就会在内存中快速处理,由于绝大多数的操作都是纯内存的,所以处理的速度会非常地快。也就是说在单线程模式下,即使连接的网络处理很多,因为有IO多路复用,依然可以在高速的内存处理中得到忽略。

(2)基于内存,单线程状态下效率依然高

多线程能够充分利用CPU的资源,但对于Redis来说,由于基于内存速度那是相当的高,能达到在一秒内处理10万个用户请求,如果一秒十万还不能满足,那我们就可以使用Redis分片的技术来交给不同的Redis服务器。这样的做饭避免了在同一个 Redis 服务中引入大量的多线程操作。

而且基于内存,除非是要进行AOF备份,否则基本上不会涉及任何的 I/O 操作。这些数据的读写由于只发生在内存中,所以处理速度是非常快的;用多线程模型处理全部的外部请求可能不是一个好的方案。

为什么引入多线程

Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。之所以这么设计是不想因为多线程而变得复杂,需要去控制 key、lua(一种轻量级脚本语言)、事务,LPUSH/LPOP(redis语法:将一个或多个值插入到列表头部(左边)、移出并获取列表的第一个元素(左边)) 等等的并发问题。

加入多线程 IO 之后,整体的读流程如下:

  1. 主线程负责接收建连请求,读事件到来(收到请求)则放到一个全局等待读处理队列
  2. 主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程,然后主线程忙等待(spinlock 的效果)状态
  3. IO 线程将请求数据读取并解析完成(这里只是读数据和解析并不执行)
  4. 主线程执行所有命令并清空整个请求等待读处理队列(执行部分串行)

上面的这个过程是完全无锁的,因为在 IO 线程处理的时主线程会等待全部的 IO 线程完成,所以不会出现 data race 的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值