一、Redis介绍与安装

86 阅读5分钟

Redis缓存数据库

Redis介绍与安装

Redis介绍

背景
常识

Redis的数据是放在内存中的,数据库中的数据是放在磁盘上的。为什么光有数据库还不够,任需要使用Redis,首先要讲解内存与磁盘间的差异。

内存:读取速度是纳秒级别,带宽是几十G

磁盘:读取速度是毫秒级别,带宽是G/M

总结:内存在数据读取以及带宽上都比磁盘有优势。

小tips:磁盘是区分扇形区域的,一个扇形区域512字节,如果每次IO的数据量是512字节,太浪费带宽了,所以规定每次IO的数据量是固定的4KB。

数据库基础知识
  1. 数据库的数据是存放在16KB大小的数据页中;
  2. 索引是提高数据库效率的重要方式,索引数据也是存放在16KB的数据页中;
  3. 索引在内存中以B+树的结构存在。一次数据库操作,首先通过B+树找到存放索引的数据页,然后通过索引定位到磁盘中具体数据的数据页,进而操作数据;
  4. 在建表的时候,指明字段的类型,这是为了明确字段占用的字节数。
  5. 随着数据量的增加,B+树的结构会越来越复杂,对数据库的操作会变慢。而且在高并发的情况下,受到磁盘带宽的影响,效率会下降。

如何解决数据库的效率下降问题,Redis应运而生。

Redis概念

Redis是面向内存操作的k-v类型数据库。其支持的基本数据类型包括:string、list、hashmap、set、zset,特殊数据类型包括:bitmaps、geospatial、hyperloglogs。Redis支持数据磁盘化,并且提供哨兵和集群机制提供高可用性。

Redis与memcache的区别:

  1. Redis支持各种数据类型,而memcache不支持;
  2. redis可以对数据进行更细微的操作,例如读取map类型数据的一个value,但是memcache不支持。Redis这种方式叫做计算向数据移动。

Redis中文网址:redis.cn

Redis英文网址:redis.io

Redis安装

  1. 将redis的源码安装包下载到linux系统的/home/pkg目录下(redis的版本是5.x,如果是5.x之上,redis在后续安装时会出问题,需要注释掉install_server.sh文件中的部分内容才行)。我下载的版本是redis-5.0.14。image.png
  2. tar xf redis-5.0.14解压
  3. 由于redis源码是c语言写的,编译之前要确保linux系统中有c语言编译器,使用yum install gcc命令下载 注意:如果环境中没有gcc,但是执行了make命令,此时会报错。在下载了gcc后,再次执行make命令也不会成功,因为之前的失败的make命令已经在环境中产生了脏数据。所以需要先执行make distclean命令清理,再执行make命令。
  4. 进入/home/pkg/redis-5.0.14目录下,执行make命令
  5. 进入/home/pkg/redis-5.0.14/src目录下,可以看到生成了一些可执行文件
  6. 在/home/pkg/redis-5.0.14目录下执行make install PREFIX=/home/software/redis-5.0.14安装命令。PREFIX指明安装路径 注意:这个命令其实只是将可执行文件从src目录中迁移到了指定目录中
  7. 在linux系统中添加环境变量: vi /etc/profile export REDIS_HOME=/home/software/redis-5.0.14 export PATH=PATH:PATH:REDIS_HOME/bin source /etc/profile
  8. 在/home/pkg/redis-5.0.14/utils目录下,执行./install_server.sh命令 (1)执行此文件后,提示输入进程端口号(默认是6379)、配置文件路径、日志文件路径和持久化路径 (2)执行完后,会在/etc/init.d/文件夹下生成redis_6379.sh脚本 (3)可以在命令行使用service redis_6379 status/start/stop命令操作redis进程 (4)install_server.sh命令执行后,默认启动redis进程,可以使用 ps -fe | grep redis命令查看

IO原理介绍

问题:Redis是单线程的,在高并发的情况下如何保证效率?

回答:网络请求首先是经过操作系统内核的,Redis与内核间是通过epoll交互的。

介绍epoll需要讲解网络IO的发展历史:

  1. 网络IO一开始是处于BIO阶段,即阻塞IO阶段。应用程序调用系统的read方法,等待返回网络响应。整个过程中,线程是堵塞的。
  2. 进入NIO阶段,read方法不再堵塞。但是应用程序需要循环调用此方法。应用程序需要遍历所有IO请求,判断IO是否返回响应,成本是cpu频繁在用户态和内核态间切换。
  3. 进入多路复用阶段。操作系统提供的select、poll、epoll方法,都是多路复用器。例如应用程序调用系统的select方法,此方法将所有的fd(文件描述符,这里可以理解为网络请求)发送给内核,内核判断哪些网络请求可以处理了,把准备就绪的请求个数返回给应用程序,应用程序还是需要遍历所有的fd去处理。poll方法与select相同,唯一的区别是select一次性处理的fd个数上限是1024个,poll没有上限。多路复用器是应用程序调用一次系统方法,就知道了所有IO的状态,比NIO有优势。
  4. epoll阶段。多路复用存在一个问题是如果网络请求特别多,意味着fd数据量很大,每次应用程序需要向内核传递全量的fd数据,非常消耗资源;而且应用程序每调用一次,内核需要遍历一次所有的fd。epoll相当于在内核开辟了一块空间。应用程序调用epoll_create方法,在空间中创建红黑树和链表(epoll_create只会调用一次)。epoll_ctr方法是将fd放到红黑树中,当然也支持修改和删除操作。并且如果哪个fd可以操作了,内核会将其放入链表中。epoll_wait方法是遍历链表,取出可以操作的fd,这个方法会发生堵塞,最好是单独创建一个线程去调用。epoll比select和poll好的地方在于他会返回准备就绪的fd列表,应用程序直接去遍历,效率很高。