1. Redis介绍
1.1. Redis简介
-
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。
-
Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
-
Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。
-
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。
-
Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目。
1.2. Redis的应用场景
Redis在许多实际应用中发挥着重要作用,包括但不限于以下几个方面:
-
缓存层:Redis作为高速缓存层,可以大大提高数据访问的速度和性能,减轻后端数据库的负载。
-
会话管理:Redis提供了存储和管理会话数据的能力,使得分布式系统中的会话管理更加简单和高效。
-
消息队列:Redis的发布/订阅功能和列表数据结构使其成为一个可靠和高性能的消息队列中间件。
-
实时统计和计数器:Redis提供了原子操作和快速的计数功能,适用于实时统计和计数器的场景。
-
分布式锁:Redis的原子操作和分布式特性使其成为实现分布式锁的理想选择。
-
搜索引擎:通过将搜索结果和索引存储在Redis的有序集合中,可以快速实现基于关键字的搜索功能。
1.3. Redis的数据类型
Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等。常常会使用Redis作为MySQL的缓存,因为Redis具备高性能和高并发的特性。
Redis中常见的数据结构有五种,分别是String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合),主要存储得到值和结构的读写如下图所示:
1.4. Redis的数据流程
Redis的数据流程包括写入和读取两个关键过程:
-
写入流程:当客户端发送写入请求时,Redis首先将数据写入内存中的数据结构,然后根据配置的持久化机制,将数据异步或同步地写入磁盘。
-
读取流程:当客户端发送读取请求时,Redis首先检查内存中是否存在所需数据,如果存在,则直接返回给客户端;如果不存在,则根据配置的缓存策略决定是否从磁盘加载数据到内存。
1.5. Redis的高可用性和扩展性
-
Redis 具备高性能
假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快,如果MySQL中数据改变了,只要同步改变Redis中的数据就行,要注意双写一致性问题。 -
Redis 具备高并发
单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。所以,直接访问 Redis 能够承受的请求是远远大于直接访问 MySQL 的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
为了保证Redis的高可用性和扩展性,可以采取以下策略:
- 主从复制:通过设置主从复制机制,可以实现数据的备份和故障转移,提高系统的可用性。
- 哨兵模式:使用Redis Sentinel进行监控和自动故障恢复,确保Redis的高可用性。
- 集群架构:采用Redis Cluster实现分布式数据存储和负载均衡,实现水平扩展。
1.6. Redis服务端和客户端
-
Redis是基于键值对存储的NoSQL数据库,其中的数据是存储在Redis服务器里的。
-
一个Redis服务器可同时与多个客户端创建连接,每个客户端都能像服务器发送命令请求,而服务器在收到命令请求后能向客户端返回结果。
-
可通过redis-cli命令创建客户端。
2. 拉取Redis镜像
2.1. 选择镜像
Docker如果想安装软件 , 必须先到 Docker镜像仓库(dockerhub) 下载镜像。镜像源可以配置成国内的镜像,如:阿里、腾讯。
~]# docker search redis
2.2. 拉取镜像
命令 | 描述 |
---|---|
docker pull redis | 下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis:latest ) |
docker pull redis:xxx | 下载指定版本的Redis镜像 (xxx指具体版本号) |
~]# docker pull redis
2.3. 查看镜像
~]# docker images redis
3. 创建Redis容器
3.1. 在宿主机上创建挂载目录
在宿主机上创建挂载目录用于挂载容器内部数据、配置文件、以及日志。(即redis运行时需要持久化到磁盘的数据)
mkdir -p /usr/local/redis/{log,data,conf}
touch /usr/local/redis/log/redis.log
chmod 777 /usr/local/redis/log/redis.log
3.2. 创建Redis配置文件
配置文件可以到redis官方去下载:https://redis.io/docs/management/config
~]# wget https://raw.githubusercontent.com/redis/redis/7.2/redis.conf /usr/local/redis/conf/
-
修改配置文件中的保护模式
protected-mode默认yes,如果设置为yes,则只允许在本机的回环连接,其他机器无法连接。
-
daemonize
daemonize默认no 为不守护进程模式,docker部署不需要改为yes,docker run -d本身就是后台启动,不然会冲突。
3.3. 创建Redis容器
~]# docker run \
-p 6379:6379 \
--name redis \
-v /usr/local/redis/data:/opt/redis/data \
-v /usr/local/redis/conf/redis.conf:/opt/redis/conf/redis.conf \
-v /usr/local/redis/log/redis.log:/opt/redis/log/redis.log \
-d redis \
redis-server /opt/redis/conf/redis.conf
命令 | 描述 |
---|---|
–-name redis | 启动容器的名字 |
-d | 后台运行 |
-p 6379:6379 | 将容器的 6379(后面那个) 端口映射到主机的 6379(前面那个) 端口 |
–restart unless-stopped | 容器重启策略 |
-v /usr/local/redis/data:/opt/redis/data | 将Redis储存文件夹挂载到主机 |
-v /usr/local/redis/conf/redis.conf:/opt/redis/conf/redis.conf | 将配置文件挂载到主机 |
-d redis:bullseye | 启动哪个版本的 Redis (本地镜像的版本) |
redis-server /opt/redis/conf/redis.conf | Redis 容器中设置 redis-server 每次启动读取 /opt/redis/conf/redis.conf 这个配置为准 |
--appendonly yes | 在Redis容器启动redis-server服务器并打开Redis持久化配置 |
\ | shell 命令换行 |
4. 启动Redis
4.1. 启动Redis
可通过docker [start|stop|restart] redis
控制redis服务器状态
4.3. 查看容器日志
~]# docker logs redis
5. 测试Redis
-
进入Redis容器并查看Redis版本
#进入Redis容器 ~]# docker exec -it redis /bin/bash #查看redis客户端版本 redis-cli --version #查看redis服务端版本 redis-server --version #或者直接在宿主机上执行命令 ~]# docker exec -it redis redis-server -v
-
进入Redis客户端
redis-cli
-
开机启动
docker update --restart=always 容器ID
-
取消开机启动
docker update --restart=no 容器ID
6. 常见问题
6.1. 设置Redis访问密码
启用配置文件中的参数——requirepass,然后重启容器