一、Redis概述
1.1Redis简介
Redis( Remote Dictionary Server ),远程字典服务,支持网络,可基于内存亦可基于持久化的日志型、NoSQL开源内存数据库,提供多种语言的API。 Redis 之所以称之为字典服务,是因为 Redis 是一个 key-value 存储系统。支持存储的 value 类型很多,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型)等。
1.2Redis的用途
Redis在生产环境中最多的场景是做数据缓存,即客户端从DBMS中查询到的数据先写入到Redis中,后续无论哪个客户端访问数据,直接读取Redis中的数据即可,减少了查询速率,减轻了DBMS的压力。
根据Redis缓存的数据与DBMS中的数据同步性划分,缓存可换分为两类:
- 实时同步缓存:要求缓存中的数据必须与DBMS中的数据一致,DBMS中的数据发生白变更,缓存中的数据立即消失。
- 阶段性同步缓存:没有必要与DBMS中的数据保持一致,相差不大即可。(实现:为缓存中添加生存时长属性)
1.3Redis的特性
- 性能极高:Redis的读的速度可以达到11W次/s,写的速度可以达到8W次/s。有这么高的性能,有以下几点原因:
- Redis的所有操作都是在内存中发生的。
- Redis是用C语言开发的。
- Redis的源码非常精细。
- 简单稳定:Redis的源码很少,早起版本只有2W行左右,从3.0版本开始,增加了集群功能,代码变为5W行左右。
- 持久化: Redis 内存中的数据可以进行持久化,其有两种方式:RDB 与 AOF。
- 高可用集群:Redis提供了高可用的主从集群功能,可以确保系统安全性。
- 丰富的数据类型:Redis是一个K-V存储系统,支持存储的Value类型很多,包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash(哈希类型), 还有 BitMap、HyperLogLog、Geospatial 类型 。
- BitMap:一般用于大数据量的二值性统计 。
- HyperLogLog:其实是 Hyperlog Log,用于对数据量超级庞大的日志做去重统计。
- Geospatial:地理空间,其主要用于地理位置相关的计算。
- 强大的功能:Redis提供数据过期功能,发布/订阅功能 ,简单事务功能,还支持Lua脚本扩展功能。
- 客户端语言广泛: :Redis提供了简单的 TCP 通信协议,编程语言可以方便地的接入 Redis。 所以,有很多的开源社区、大公司等开发出了很多语言的 Redis 客户端。
- 支持ACL权限控制: 从 Redis6 开始引入了 ACL 模块,可以 为不同用户定制不同的用户权限。 ( ACL,Access Control List,访问控制列表,是一种细粒度的权限管理策略,可以针对任意用户与组进行权限控制。目前大多数 Unix 系统与 Linux 2.6 版本已经支持 ACL了)
- 支持多线程IO模型: Redis 之前版本采用的是单线程模型,从 6.0 版本开始支持了多线程模型。
1.4Redis的IO模型
Redis 处理客户端请求所采用 的处理架构,称为 Redis 的 IO 模型。不同版本的 Redis 采用的 IO 模型是不同的。
1.4.1单线程模型
对于Redis3.0之前的版本,Redis的IO模型采用是单线程模型,即所有客户请求都由一个线程来完成。
Redis的单线程模型采用多路复用技术。
每个客户端若要想Redis提交请求,都需要与Redis建立一个Socket连接,并向事件分发器注册一个事件,一旦该事件发生,就表明该连接已经就绪,而一旦就绪,事件分发器( 之所以称为事件分发器,是因为它会根据不同的就绪事件,将任务交由不同的事件处理 器去处理。 )就会感知到,然后获取客户端通过该连接发送的请求,并由事件分发器绑定的这个唯一的线程来处理,如果该线程还在处理多个任务,则将该任务写到任务列表中,等待线程处理。
优点:可维护性高,性能高。不存在并发读写的情况,所以不存在执行顺序的不确定性,不存在线程切换开销,不存在死锁问题,不存在为了数据安全而进行的加锁/解锁开销。
缺点:性能受到影响,而且单线程只能使用一个处理器,所以会形成处理器浪费。
1.4.2混合线程模型
从Redis4.0版本开始,Redis中就开始加入多线程元素,处理客户端请求还是单线程模型,但对于一些比较耗时但不影响对客户端的的响应操作,就由后台其他线程来完成。比如,持久化,对AOF的rewritr,对失效连接的清理等。
1.4.3多线程模型
从Redis6.0版本,才是真正意义上的多线程模型,因为其对于客户端请求的处理采用多线程模型。
多线程IO模型中的“多线程”仅用于接收,解析客户端的请求,然后把解析出来的请求写到任务队列中,而对具体任务(命令)的处理仍然是由主线程来处理。这样做用户无需考虑线程安全问题,无需考虑事务控制,无需考虑像 LPUSH/LPOP 等命令的执行顺序问题 。
优点:结合了单线程和多线程的优点,避开的它们的不足。
缺点:不是真正意义上的多线程,因为真正处理任务的线程仍然是单线程,所以对其性能还是有点影响。
二、Redis安装和配置
2.1安装前的准备工作
2.1.1安装gcc
由于 Redis 是由 C/C++语言编写的,而从官网下载的 Redis 安装包是需要编译后才可安装的,所以对其进行编译就必须要使用相关编译器。对于C/C++语言的编译器,使用最多的是gcc与gcc-c++,而这两款编译器在 CentOS7中是没有安装的,所以首先要安装这两款编译器。
GCC,GNU Compiler Collection,GNU 编译器集合。
2.1.2下载Redis
redis 的官网为: http://redis.io。点击下面的链接可以直接进行下载。
2.1.3上传到Linux
将下载好的压缩包上传到 Linux 的/opt/redis目录中。
2.2安装Redis
2.2.1解压Redis
将 Redis 解压到/opt/redis 目录中。
2.2.2编译
编译过程是根据 Makefile 文件进行的,而 Redis 解压包中已经存在该文件了。所以可以 直接进行编译了。
进入到解压目录中,然后执行编译命令 make。
当看到如下提示时,表示编译成功。
2.2.3安装
在 Linux 中对于编译过的安装包执行 make install 进行安装。
可以看到,共安装了三个组件:redis 服务器、客户端与一个性能测试工具 benchmark。
2.2.4查看bin目录
安装完成后,打开/usr/local/bin 目录,可以看到出现了很多的文件。
通过 echo $PATH 可以看到,/usr/local/bin 目录是存在于该系统变量中的,这样这些命令就可以在任意目录中执行了。
2.3Redis启动与停止
2.3.1前台启动
在任意目录执行 redis-server 命令即可启动 Redis。这种启动方式会占用当前命令行窗口。
再开启一个会话窗口,可以查看到当前的 Redis 进程,默认端口号为 6379。
通过 Ctrl + C 命令可以停止 Redis 。
2.3.2命令式后台启动
使用nohub命令,最后再添加一个&符,可以使要启动的程序在后台以守护进程方式运行。这样的好处是,进程启动后不会占用一个会话窗口,且其还会在当前目录,即运行启动命令的当前目录中创建一个nohup.out文件用于记录Redis的操作日志。
2.3.3配置式后台启动
使用nohup命令可以使Redis后台启动,但每次都要键入nohup与&符,比较麻烦。可 以通过修改Linux中Redis的核心配置文件redis.conf达到后台启动的目的。redis.conf文件在Redis的安装目录根下。
将daemonize属性值由 no 改为 yes,使 Redis 进程以守护进程方式运行。
修改后再启动 Redis,就无需再键入 nohup 与&符了,但必须要指定启动所使用的 Redis 配置文件 。
2.3.4Redis的停止
通过 redis-cli shutdown 命令可以停止 Redis。
2.4连接前的配置
Redis 是一个内存数据库服务器,就像 MySQL 一样,对其操作也需要通过客户端进行。 若要使远程主机上的客户端能够连接并访问到服务端的 Redis,则服务端首先要做如下配置。
2.4.1绑定客户端IP
Redis 可以通过修改配置文件来限定可以访问自己的客户端 IP。
以上设置后,只允许当前主机访问当前的 Redis,其它主机均不可访问。所以,如果不想限定访问的客户端,只需要将该行注释掉即可。
2.4.2关闭保护模式
默认保护模式是开启的。其只允许本机的客户端访问,即只允许自己访问自己。但生产中应该关闭,以确保其它客户端可以连接 Redis。
2.4.3设置访问密码
为 Redis 设置访问密码,可以对要读/写 Redis 的用户进行身份验证。没有密码的用户可以登录 Redis,但无法访问。
2.4.3.1密码设置
密码的设置位置在 redis.conf 配置文件中。默认是被注释掉的,没有密码。
没有通过密码登录的用户,无法读/写 Redis。
2.4.3.2使用密码
对于密码的使用,有两种方式:登录时未使用密码,则访问时先输入密码;登录时直接使用密码登录,访问时无需再输入密码。
- 登录时未使用密码
- 登录时使用密码
- 结束服务时使用密码
2.4.4禁止/重命名命令
flushall 与 flushdb。它们都是用于直接删除整个 Redis 数据库的。若让用户可以随便使用它们,可能会危及数据安全。Redis 可以通过修改配置文件来禁止使用这些命令,或重命名这些命令。以下配置,禁用了 flushall 与 flushdb 命令。
2.5Redis客户端分类
Redis 客户端也像 MySQL 客户端一样有多种类型:命令行客户端、图形界面客户端、Java 代码客户端。
2.5.1命令行客户端
Redis 提供了基本的命令行客户端。打开命令行客户端的命令为 redis-cli。
- -h 指定连接的Redis服务器的IP
- -p 指定连接的Redis的端口号
若连接的是本机 Redis,且端口号没有改变,保持默认的 6379,则-h 与-p 选项可以省略不写。
2.5.2图形界面客户端
- Redis Desktop Manage : 官网为:RedisInsight - The Best Redis GUI
- RedisPlus : RedisPlus 是为 Redis 可视化管理开发的一款开源免费的桌面客户端软件,支持 Windows 、 Linux、Mac 三大系统平台,RedisPlus 提供更加高效、方便、快捷的使用体验,有着更加现代化的用户界面风格。 官网地址为:RedisPlus: RedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows 、Linux 、Mac三大系统平台,RedisPlus提供更加高效、方便、快捷的使用体验,有着更加现代化的用户界面风格。
2.5.3Java 代码客户端
所谓 Java 代码客户端就是一套操作 Redis 的 API,其作用就像 JDBC 一样,所以 Java 代码客户端其实就是一个或多个 Jar 包,提供了对 Redis 的操作接口。 对 Redis 操作的 API 很多,例如 jdbc-redis、jredis 等,但最常用也是最有名的是 Jedis。
未完待续。。。。。。