认识Redis

从这个系列开始,就要开始更新Redis的学习历程了,欢迎大家点赞阅读!

目录

[1 什么是Redis](#1 什么是Redis)

[2 Redis特性](#2 Redis特性)

[2.1 速度快](#2.1 速度快)

[2.2 基于键值对的数据结构](#2.2 基于键值对的数据结构)

[2.3 持久化](#2.3 持久化)

[2.4 批量执行](#2.4 批量执行)

[2.5 可扩展性](#2.5 可扩展性)

[2.6 集群](#2.6 集群)

[2.7 高可用性](#2.7 高可用性)

[3 配置Redis](#3 配置Redis)

[3.1 符号链接](#3.1 符号链接)

[3.2 Redis配置文件](#3.2 Redis配置文件)

[4 启动Redis](#4 启动Redis)

[5 停止Redis](#5 停止Redis)

[6 进入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文件在当前目录的上一级目录下):

bash 复制代码
        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更快,因此存储热点数据更合适。

下篇文章:

Redis常用命令使用https://blog.csdn.net/sniper_fandc/article/details/149139133?fromshare=blogdetail&sharetype=blogdetail&sharerId=149139133&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link