认识Redis
从这个系列开始,就要开始更新Redis的学习历程了,欢迎大家点赞阅读!
目录
1 什么是Redis
2 Redis特性
2.1 速度快
2.2 基于键值对的数据结构
2.3 持久化
2.4 批量执行
2.5 可扩展性
2.6 集群
2.7 高可用性
3 配置Redis
3.1 符号链接
3.2 Redis配置文件
4 启动Redis
5 停止Redis
6 进入redis客户端
1 什么是Redis
Redis是一种基于键值对的NoSQL数据库,数据存储在内存中,可作为数据库、缓存、消息中间件(消息队列,削峰填谷)等许多功能的使用。
由于存储在内存,因此Redis最大的特性就是“快”,基于谷歌给出的各层硬件执行速率:基于内存的是100ns,而基于磁盘的是10000000ns,可见Redis要比MySQL快近5个数量级。为什么需要Redis而不直接定义变量(因为变量也是存储在内存的)?Redis的初衷是作为消息中间件使用,消息中间件用于进程间通信。基于网络,在分布式系统中,由于进程的隔离性,多机间的进程就需要通信,而Redis可以把数据存储在内存中,让多机都可以访问自己内存的数据,因此Redis的应用场景是分布式系统。
然而Redis的缺点是存储容量小,因此常常把Redis和MySQL结合使用。“二八原则”,20%的热点数据能满足80%的访问需求。Redis作为缓存,存储热点数据(满足经常访问的需求),而MySQL作为数据存储的主容器,存储全量数据(全部的数据)。就可以让系统同时满足高性能和大容量存储的特性,不过这也会引发Redis和MySQL的数据一致性问题,后续介绍。
2 Redis特性
2.1 速度快
Redis的速度快(相对于MySQL之类的关系型数据库)主要有以下原因:
(1)存储在内存中。
(2)使用单线程。多线程并不一定可以提高速度,多线程的优势是CPU计算密集型任务,而Redis大多是对内存中的数据存取和修改,不会消耗很多CPU时间,此时频繁加锁解锁和线程间的阻塞唤醒就会成为速度的累赘。
(3)Redis的底层实现简单,核心业务简单,都是简单的操作内存中的数据结构。
(4)Redis在网络方面使用IO多路复用,一个线程管理多个socket。
注意:什么是IO多路复用?客户端服务器结构下,一个服务器会对多个客户端同时服务。基于http协议,客户端访问服务器时,通常建立连接,即使用一个线程并分配一个socket来接收请求。如果有多个客户端同时访问就需要多个线程并分配多个socket来处理。但是同一时间并不是所有的socket都在工作,因此可以用一个线程管理多个socket,这就是IO多路复用。
Linux提供了3套API来控制IO多路复用:select、poll和epoll。现在主要都使用epoll(运行效率最高),Java标准库中提供NIO库来使用epoll进行IO多路复用。epoll就是在IO多路复用机制上增加事件通知/回调机制,即一个事件到来时会通知线程进行执行(对应就是哪个socket中有新到的请求需要处理,在操作系统层面epoll就会通知该socket所属的线程来进行处理)。当然IO多路复用的前提是socket请求不频繁,否则一个线程就处理不过来。
(5)Redis使用C语言编写,C语言更接近底层。(存疑,因为MySQL也是C语言开发的,并不是因为用什么语言导致快慢,而是做的事不同导致的快慢。MySQL主要做了更多复杂的操作,并且从硬盘中读取,因此更慢)
2.2 基于键值对的数据结构
Redis主要基于键值对存储,对于键通常采用String类型,对于值有多种类型:S字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set/zet),同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的数据结构。
2.3 持久化
将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以用两种策略将内存的数据保存到硬盘中。
2.4 批量执行
Redis既支持简单的交互命令来操作,又支持通过脚本语言(Lua)来批量执行命令。
2.5 可扩展性
Redis提供一组API,可以通过C、C++和Rust等编程语言来编写动态链接库(比如Windows的dll文件、Linux的so文件)来扩展Redis的功能,比如支持更多数据结构和命令。
2.6 集群
Redis支持集群,可以通过引入多个主机部署多个Redis节点来实现水平扩展。类似数据库的分库分表,每个节点各自存储部分数据,避免查询压力过大。
2.7 高可用性
Redis支持备份/冗余,使用主从节点,从节点作为主节点的备份,一旦主节点崩溃,从节点将会代替主节点继续运行。
3 配置Redis
安装Redis的过程这里省略(这里使用redis 5),通常是安装在Linux环境下,这里用到的系统是centOS 7。
3.1 符号链接
由于安装目录很深,不便于Redis查找需要的命令和文件,因此配置符号链接。
符号链接类似于快捷方式,该符号链接指向了真正的文件或可执行程序,因此通过该链接就可以方便地操作Redis。
命令:in -s 原文件路径 链接名
通常bin目录下存储的是可执行命令,etc目录下存储的是配置文件。
3.2 Redis配置文件
配置bind的ip为0.0.0.0,表示Redis可以被其他主机访问到。
protected-mode no表示不启动保护模式,允许其他主机连接。
daemonize yes表示设置守护进程(后台进程)方式启动。这样即使终端关闭进程也不会杀死。
dir /var/lib/redis表示Redis的工作目录为该目录,这时候Redis如果创建的数据文件都会存储在该目录下面(首先要确保使用mkdir -p创建了该目录)。
logfile /var/log/redis/redis-server.log是配置Redis的日志目录。
4 启动Redis
使用Redis安装目录下的src/redis-server命令搭配配置文件即可成功启动(../redis.conf表示redis.conf文件在当前目录的上一级目录下):
cd /usr/local/redis-5.0.14/src./redis-server ../redis.conf
如果配置了符号链接,使用符号链接名+配置文件的符合链接名也可以成功启动:
5 停止Redis
查看Redis的pid:ps aux | grep redis
杀死pid对应的进程:kill pid
6 进入redis客户端
由于已经提前配置了进入redis客户端命令的符号链接,因此直接在bin目录下使用符号链接即可:
其他主机连接redis客户端时,需要使用:redis-cli -h { host } -p { port },host是redis所在主机的ip,port是端口号(默认6379)。
注意:Redis的特性最重要的是快,但是快一定是相对的。对比直接操作内存的数据结构,通过Redis来操作内存,实际上是要慢。因为Redis是客户端-服务器系统。我们访问的都是客户端,而客户端和服务器之间通过网络通信。因此使用Redis操作内存多了网络通信的开销,比直接操作内存更慢。
对于可以引入Redis的场合,一定是因为Redis可以解决一些问题。比如作为数据库,Redis可以保证数据不会丢失,关机重启后内存数据会丢失,而Redis有持久化的特性,因此可以保证数据不会丢。作为缓存,Redis的访问速度被MySQL更快,因此存储热点数据更合适。
下篇文章: