Redis 缓存数据库
文章目录
- 一、Redis是什么?
- 1.1 Redis特征
- 1.2 Redis架构
- 1.3 Redis优势
- 1.4 Redis应用场景
- 二. Redis下载和安装
- 2.1 Windows
- 2.2 Linux
- 2.3 Linux中docker安装
- 三. 启动Redis方式
- 3.1,前台启动(不推荐)
- 3.2,后台启动(不推荐)
- 3.3,开机自启(推荐)
- 四. Redis客户端
- 1,命令行客户端
- 2,图形化客户端
- 五. Redis的使用
- 5.1 redis-cli 命令
- 5.2 key相关命令
- 5.3 DB相关命令
- 5.4 String
- 5.5 List
- 5.6 Set
- 5.7 哈希 hash
- 5.8 有序集合 (sorted set / zset)
- 六. Redis主从复制
- Redis主从复制配置方法
- 思维导图
- 七. 哨兵模式
一、Redis是什么?
Redis(Remote Dictionary Server)译为“远程字典服务”,它是一款基于内存实现的键值型 NoSQL 数据库, 通常也被称为数据结构服务器,这是因为它可以存储多种数据类型,比如 string(字符串),hash(哈希散列),list(列表),set(集合)和 sorted set(有序集合)等。
Redis 是由意大利人 Salvatore Sanfilippo 使用 C语言编写,它遵守 BSD 开源协议,并且对多种编程语言提供了良好的 API 支持,比如 Java,C/C++,C#,PHP,JavaScript,Perl,Python,Ruby 等。
自 2010 年 3 月 15 日起,Redis 的开发工作由 VMware(威睿)公司主持。关于 Redis 数据库下载和安装,目前官方网站,只提供了 Linux 版本的下载安装包。
注意,Windows 系统可以下载安装非官方的 Redis 版本,不过其使用性能远不如 Linux 系统。
Redis官网(https://redis.io/)`
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 于2009使用 C 语言编写。
Redis 遵守 BSD 协议,实现了免费开源,其最新版本是 6.20,常用版本包括 3.0 、4.0、5.0。自 Redis 诞生以来,它以其超高的性能、完美的文档和简洁易懂的源码广受好评,国内外很多大型互联网公司都在使用 Redis,比如腾讯、阿里、Twitter、Github 等等。
与 SQL 型数据库截然不同,Redis 没有提供新建数据库的操作,因为它自带了 16 (0—15)个数据库(默认使用 0 库)。在同一个库中,key 是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用 key 来标识 value,当想要检索 value 时,必须使用与 value 相对应的 key 进行查找。
Redis 数据库没有“表”的概念,它通过不同的数据类型来实现存储数据的需求,不同的数据类型能够适应不同的应用场景,从而满足开发者的需求。
1.1 Redis特征
● 键值(key-value)型,value支持多种不同数据结构,功能丰富
● 单线程,每个命令具备原子性
● 低延迟,速度快(基于内存、IO多路复用、良好的编码)。
● 支持数据持久化
● 支持主从集群、分片集群
● 支持多语言客户端
1.2 Redis架构
Redis体系架构主要分为两个部分:
● Redis服务端
● Redis客户端
客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并且起到管理数据的作用。
1.3 Redis优势
下面对 Redis 的优势进行了简单总结:
● 性能极高:Redis 基于内存实现数据存储,它的读取速度是 110000次/s,写速度是 81000次/s;
● 多用途工具: Redis 有很多的用途,比如可以用作缓存、消息队列、搭建 Redis 集群等;
● 命令提示功能:Redis 客户端拥有强大的命令提示功能,使用起来非常的方便,降低了学习门槛;
● 可移植性:Redis 使用用标准 C语言编写的,能够在大多数操作系统上运行,比如 Linux,Mac,Solaris 等。
1.4 Redis应用场景
Redis 用来缓存一些经常被访问的热点数据、或者需要耗费大量资源的内容,通过把这些内容放到 Redis 中,可以让应用程序快速地读取它们。例如,网站的首页需要经常被访问,并且在创建首页的过程中会消耗的较多的资源,此时就可以使用 Redis 将整个首页缓存起来,从而降低网站的压力,减少页面访问的延迟时间。
我们知道,数据库的存储方式大体可分为两大类,基于磁盘存储和基于内存存储。磁盘存储的数据库,因为磁头机械运动以及系统调用等因素导致读写效率较低。Redis 基于内存来实现数据存取,相对于磁盘来说,其读写速度要高出好几个数量级。下表将 Redis 数据库与其他常用数据库做了简单对比:
Redis 基于内存来实现数据的存储,因此其速度非常快。但是我们知道,计算机的内存是非常珍贵的资源,所以 Redis 不适合存储较大的文件或者二进制数据,否则会出现错误,Redis 适合存储较小的文本信息。理论上 Redis 的每个 key、value 的大小不超过 512 MB。
总得来说,上述数据库各有优势,当我们选用数据库时,也要因地制宜,选择一款与业务场景最相符合的数据库。
二. Redis下载和安装
2.1 Windows
虽然 Redis 官方网站没有提供 Windows 版的安装包,但可以通过 GitHub 来下载 Windows 版 Redis 安装包,
github下载地址:https://github.com/redis/redis/releases。
注意:Windows 安装包是某位民间“大神”根据 Redis 源码改造的,并非 Redis 官方网站提供。
打开上述的下载链接,Redis 支持 32 位和 64 位的 Window 系统,大家根据个人情况自行下载,如图所示:
2.2 Linux
1,下载
https://redis.com.cn/download.html
https://redis.io/
linux 通过命令下载
wget https://download.redis.io/releases/redis-6.2.6.tar.gz # 下载
如果没有wget命令
yum install -y wget # 安装
2,c语言编译环境
[root@192 ~]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
执行 gcc --version
如果没有则需要安装gcc
yum install -y gcc tcl
如果报错:Cannot find a valid baseurl for repo: base/7/x86_64
解决方案:
cannot find a valid baseurl for repo:base/7/x86_64错误通常是由于网络连接问题、DNS设置问题或YUM仓库配置问题引起的。通过检查并修复网络连接、更新DNS设置、修改YUM仓库配置或使用可靠的镜像源,如阿里云镜像源,可以解决这个问题
使用阿里云或其他国内镜像源
1.更新YUM仓库源为阿里云镜像源:
sudo nano /etc/yum.repos.d/CentOS-Base.repo
将内容替换为以下内容
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
保存文件并退出。
清理并重建缓存
sudo yum clean all
sudo yum makecache
sudo yum update
3,安装
将下载好的redis.tar包放入/usr/redis目录(也可以放入其他目录),并解压。
解压:
[root@192 ~]# cd /opt/redis/
[root@192 redis]# ls
redis-6.2.6.tar.gz
[root@192 redis]# tar -zxvf redis-6.2.6.tar.gz
...
[root@192 redis]# ls
redis-6.2.6 redis-6.2.6.tar.gz
解压完成后,进入目录,并在目录下执行make命令(只是编译好)。
[root@192 redis]# cd redis-6.2.6
[root@192 redis-6.2.6]# make
注:【如果没有准备好C语言编译环境,make 会报错—Jemalloc/jemalloc.h:没有那个文件】。
解决方法:运行make distclean,然后再redis目录下再此执行make命令。
● 跳过make test 继续执行:make install。
● 以上执行完毕后,进入安装目录:/usr/local/bin 下查看是否安装成功
该目录为Redis默认的安装目录 有redis相关的内容则安装成功
4,Redis常用指令
进入/usr/local/bin 目录下后,可以执行以下指令:
1、redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
2、redis-check-aof:修复有问题的AOF文件
3、redis-check-dump:修复有问题的dump.rdb文件
4、redis-sentinel:Redis集群使用
5、redis-server:Redis服务器启动命令
6、redis-cli:客户端,操作入口
5,测试
启动服务redis-server
[root@192 redis-6.2.6]# cd /usr/local/bin/
[root@192 bin]# ls
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
[root@192 bin]# redis-server
67273:C 24 Apr 2024 18:48:10.567 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
67273:C 24 Apr 2024 18:48:10.567 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=67273, just started
67273:C 24 Apr 2024 18:48:10.567 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
67273:M 24 Apr 2024 18:48:10.569 * Increased maximum number of open files to 10032 (it was originally set to 1024).
67273:M 24 Apr 2024 18:48:10.569 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 67273
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
67273:M 24 Apr 2024 18:48:10.574 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
67273:M 24 Apr 2024 18:48:10.574 # Server initialized
67273:M 24 Apr 2024 18:48:10.574 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
67273:M 24 Apr 2024 18:48:10.574 * Ready to accept connections
启动客户端链接
[root@192 ~]# /usr/local/bin/redis-cli
127.0.0.1:6379> set name admin
OK
127.0.0.1:6379> get name
"admin"
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
安装成功!
2.3 Linux中docker安装
1,拉取redis镜像
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker pull redis
查看镜像
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis latest 7614ae9453d1 2 years ago 113MB
mysql latest 3218b38490ce 2 years ago 516MB
nacos/nacos-server latest bdf60dc2ada3 2 years ago 1.05GB
2,下载配置文件
https://redis.io/docs/latest/operate/oss_and_stack/management/config/
如果之前用linux下载方式安装了reids 也可以直接复制redis.conf配置文件
3,创建Docker容器
接下来就是要将redis 的配置文件进行挂载,以配置文件方式启动redis 容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)
1)、挂载 redis 的配置文件
2)、挂载 redis 的持久化文件(为了数据的持久化)。
本人的配置文件是放在
liunx 下redis.conf文件位置:/usr/redis/myredis/redis.conf
liunx 下redis的data文件位置 : /usr/redis/myredis/data
创建容器
docker run -p 6379:6379 --name redis -v /usr/redis/myreids/redis.conf:/etc/redis/redis.conf -v /usr/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker run -p 6379:6379 --name redis -v /usr/redis/myreids/redis.conf:/etc/redis/redis.conf -v /usr/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
3caef72f5f45b7ca6175b99ad5081a3e48a327560cd2be078e1be484105068f4
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3caef72f5f45 redis "docker-entrypoint.s…" 5 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
b70e5dd54e4e nacos/nacos-server "bin/docker-startup.…" 8 days ago Up 8 days 0.0.0.0:8848->8848/tcp, :::8848->8848/tcp, 0.0.0.0:9848-9849->9848-9849/tcp, :::9848-9849->9848-9849/tcp nacos
2fae66209fb4 mysql:latest "docker-entrypoint.s…" 9 days ago Up 9 days 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
检查日志
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker logs redis
1:C 24 Apr 2024 11:12:30.551 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 24 Apr 2024 11:12:30.551 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 24 Apr 2024 11:12:30.551 # Configuration loaded
1:M 24 Apr 2024 11:12:30.551 * monotonic clock: POSIX clock_gettime
1:M 24 Apr 2024 11:12:30.552 * Running mode=standalone, port=6379.
1:M 24 Apr 2024 11:12:30.552 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 24 Apr 2024 11:12:30.552 # Server initialized
1:M 24 Apr 2024 11:12:30.552 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 24 Apr 2024 11:12:30.552 * Ready to accept connections
创建成功
4,测试 Redis
- 输入指令:docker exec -it redis bash,进入容器内。
- 输入指令:redis-cli,运行 redis 客户端。
- 输入指令:ping,显示 PONG 代表测试成功!
[root@iZf8z89pv77t13an9qqmcrZ ~]# docker exec -it redis bash
root@3caef72f5f45:/data# redis-c
redis-check-aof redis-check-rdb redis-cli
root@3caef72f5f45:/data# redis-cli
127.0.0.1:6379> ping
PONG
链接成功
5,开放防火墙端口
输入指令:firewall-cmd --zone=public --add-port=6379/tcp --permanent,开放防火墙指定端口。
输入指令:firewall-cmd --reload,重新加载防火墙。
三. 启动Redis方式
Redis的启动方式有很多种,例如:前台启动、后台启动、开机自启
3.1,前台启动(不推荐)
这种启动属于前台启动,会阻塞整个会话窗口,窗口关闭或者按下CTRL + C则Redis停止。不推荐使用。
安装完成后,在任意目录输入redis-server命令即可启动Redis
[root@192 /]# redis-server
104367:C 24 Apr 2024 19:28:59.187 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
104367:C 24 Apr 2024 19:28:59.187 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=104367, just started
104367:C 24 Apr 2024 19:28:59.187 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
104367:M 24 Apr 2024 19:28:59.189 * Increased maximum number of open files to 10032 (it was originally set to 1024).
104367:M 24 Apr 2024 19:28:59.189 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 104367
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
104367:M 24 Apr 2024 19:28:59.192 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
104367:M 24 Apr 2024 19:28:59.192 # Server initialized
104367:M 24 Apr 2024 19:28:59.192 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
104367:M 24 Apr 2024 19:28:59.194 * Ready to accept connections
3.2,后台启动(不推荐)
如果要让Redis以后台方式启动,则必须修改Redis配置文件,配置文件所在目录就是之前我们解压的安装包下
后台启动,程序会在后台运行,不影响前台页面。
- 因为我们要修改配置文件,因此我们需要先将原文件备份一份
进入redis目录
[root@192 /]# cd /opt/redis/
[root@192 redis]# ls
redis-6.2.6 redis-6.2.6.tar.gz
[root@192 redis]# cd redis-6.2.6
[root@192 redis-6.2.6]# cp redis.conf redis.conf.bak
[root@192 redis-6.2.6]# ls
00-RELEASENOTES CONTRIBUTING INSTALL README.md runtest runtest-sentinel tests
BUGS COPYING Makefile redis.conf runtest-cluster sentinel.conf TLS.md
CONDUCT deps MANIFESTO redis.conf.bak runtest-moduleapi src
- 然后修改redis.conf文件中的一些配置
# 允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0
#bind 127.0.0.1 -::1
bind 0.0.0.0
# 守护进程,修改为yes后即可后台运行
# daemonize no
daemonize yes
# 密码,设置后访问Redis必须输入密码
# requirepass foobared
requirepass 123456
Redis其他常用配置
# 监听的端口
port 6379
# 工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录
dir .
# 数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15
databases 1
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件,默认为空,不记录日志,可以指定日志文件名
logfile "redis.log"
- 启动Redis
[root@192 redis-6.2.6]# redis-server redis.conf
[root@192 redis-6.2.6]# redis-cli
127.0.0.1:6379> ping
PONG
- 查看Redis服务是否启动
查看6379(为redis的端口号)端口号是否被占用
[root@192 redis-6.2.6]# netstat -lntup | grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 109620/redis-server
查看redis服务进程情况,这里拿redis服务举例,其他服务查询更改名字即可
[root@192 redis-6.2.6]# ps -ef|grep redis
root 109620 1 0 19:35 ? 00:00:00 redis-server 127.0.0.1:6379
root 110931 52524 0 19:36 pts/0 00:00:00 grep --color=auto redis
显示tcp的端口和进程等相关情况
[root@192 redis-6.2.6]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1110/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1341/master
tcp 0 0 0.0.0.0:8001 0.0.0.0:* LISTEN 17171/docker-proxy
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 109620/redis-server
tcp6 0 0 :::22 :::* LISTEN 1110/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1341/master
tcp6 0 0 :::8001 :::* LISTEN 17178/docker-proxy
tcp6 0 0 :::33060 :::* LISTEN 127688/mysqld
tcp6 0 0 :::3306 :::* LISTEN 127688/mysqld
tcp6 0 0 ::1:6379 :::* LISTEN 109620/redis-server
停止Redis服务
# 通过kill命令直接杀死进程
kill -9 redis进程id
# 利用redis-cli来执行 shutdown 命令,即可停止 Redis 服务,
# 因为之前配置了密码,因此需要通过 -a 来指定密码
redis-cli -a 132537 shutdown
[root@192 redis-6.2.6]# kill -9 109620
[root@192 redis-6.2.6]# redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
[root@192 redis-6.2.6]# redis-cli shutdown
[root@192 redis-6.2.6]# redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
3.3,开机自启(推荐)
我们也可以通过配置来实现开机自启
● 首先,新建一个系统服务文件
/etc/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/opt/redis/redis-6.2.6/src/redis-server /opt/redis/redis-6.2.6/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
然后重载系统服务
systemctl daemon-reload
- 现在,我们可以用下面这组命令来操作redis了
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
重启后启动redis和停止redis 注:重启Linux命令 reboot
[root@192 ~]# netstat -lntup | grep 6379
[root@192 ~]# systemctl start redis
[root@192 ~]# netstat -lntup | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 990/redis-server 0.
[root@192 ~]# systemctl stop redis
[root@192 ~]# netstat -lntup | grep 6379
[root@192 ~]#
- 执行下面的命令,可以让redis开机自启
[root@192 ~]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service.
- 重启后查看redis端口或进程
[root@192 ~]# netstat -lntup | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 925/redis-server 0.
说明已经开机启动了
四. Redis客户端
安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括:
● 命令行客户端
● 图形化桌面客户端
● 编程客户端
1,命令行客户端
Redis安装完成后就自带了命令行客户端:redis-cli,使用方式如下:
redis-cli [options] [commonds]
● 其中常见的options有:
○ -h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1
○ -p 6379:指定要连接的redis节点的端口,默认是6379
○ -a 132537:指定redis的访问密码
● 其中的commonds就是Redis的操作命令,例如:
○ ping:与redis服务端做心跳测试,服务端正常会返回pong
○ 不指定commond时,会进入redis-cli的交互控制台:
因为我们设置了密码 123456 所以进入客户端需要密码
[root@192 ~]# redis-cli
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
以上是没有密码登录,所以认证失败
[root@192 ~]# redis-cli -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
上面Redis客户端连接服务是会报警告,说这样不安全
[root@192 ~]# redis-cli -p 6379
127.0.0.1:6379> auth 123456 #认证
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
2,图形化客户端
● Redis Desktop Manager。适用于大数据量,支持在Linux、Windows和Mac平台运行。它提供了全面的数据操作功能,并支持通过SSH隧道连接。13
● Another Redis Desktop Manager。这是一个更快、更稳定、功能强大的Redis桌面客户端工具,同样支持跨平台运行。12
● RedisInsight。这是Redis官方的桌面客户端工具,能够对Redis的内存、连接数、命中率以及正常运行时间进行监控。它内置了对Redis模块的支持,并且是唯一支持Redis Cluster的GUI工具。
还有很多,看个人喜好
我用的是Another Redis Desktop Manager
五. Redis的使用
5.1 redis-cli 命令
redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <hostname> Server hostname (default: 127.0.0.1). ip地址
-p <port> Server port (default: 6379). 服务器端口号
-s <socket> Server socket (overrides hostname and port).
-a <password> Password to use when connecting to the server. 密码
-u <uri> Server URI. url格式的地址
-r <repeat> Execute specified command N times.
-i <interval> When -r is used, waits <interval> seconds per command.
It is possible to specify sub-second times like -i 0.1.
-n <db> Database number. 指定数据库
-x Read last argument from STDIN.
-d <delimiter> Multi-bulk delimiter in for raw formatting (default: \n).
-c Enable cluster mode (follow -ASK and -MOVED redirections).
--raw Use raw formatting for replies (default when STDOUT is
not a tty).
--no-raw Force formatted output even when STDOUT is not a tty.
--csv Output in CSV format.
--stat Print rolling stats about server: mem, clients, ... 统计数据 连续输出
--latency Enter a special mode continuously sampling latency.
If you use this mode in an interactive session it runs
forever displaying real-time stats. Otherwise if --raw or
--csv is specified, or if you redirect the output to a non
TTY, it samples the latency for 1 second (you can use
-i to change the interval), then produces a single output
and exits. 延时统计
--latency-history Like --latency but tracking latency changes over time.
Default time interval is 15 sec. Change it using -i.
--latency-dist Shows latency as a spectrum, requires xterm 256 colors.
Default time interval is 1 sec. Change it using -i.
--lru-test <keys> Simulate a cache workload with an 80-20 distribution.
--replica Simulate a replica showing commands received from the master.
--rdb <filename> Transfer an RDB dump from remote server to local file. 导出rdb文件
--pipe Transfer raw Redis protocol from stdin to server.
管道模式
--pipe-timeout <n> In --pipe mode, abort with error if after sending all data.
no reply is received within <n> seconds.
Default timeout: 30. Use 0 to wait forever.
管道超时
--bigkeys Sample Redis keys looking for big keys.
--hotkeys Sample Redis keys looking for hot keys.
only works when maxmemory-policy is *lfu.
--scan List all keys using the SCAN command.获取服务器所有的键
--pattern <pat> Useful with --scan to specify a SCAN pattern.
正则表达式 用于scan命令中
--intrinsic-latency <sec> Run a test to measure intrinsic system latency.
The test will run for the specified amount of seconds.
--eval <file> Send an EVAL command using the Lua script at <file>.
--ldb Used with --eval enable the Redis Lua debugger.
--ldb-sync-mode Like --ldb but uses the synchronous Lua debugger, in
this mode the server is blocked and script changes are
not rolled back from the server memory.
--cluster <command> [args...] [opts...]
Cluster Manager command and arguments (see below).
--verbose Verbose mode.
--no-auth-warning Don't show warning message when using password on command
line interface.
5.2 key相关命令
keys pattern # 查找键 支持通配符 * ,? [] [^]
* 表示任意多个字符
? 表示任意单个字符
[] 表示多个值中满足一个即可
[^] 表示只有不是其中的一个即可
exists key # 判断某个key是否存在 1:true, 0:false
type key # 查看你的key是什么类型
del key # 删除指定的key数据
# 根据value选择非阻塞删除,仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作
unlink key
# 查看还有多少秒过期,-1表示永不过期,-2表示已过期
ttl key
# 10秒钟:为给定的key设置过期时间
expire key seconds
move key db # 将键移到指定的库
persist key # 移除键的过期时间,变成永久
pttl key # 以毫秒的单位显示过期时间
RENAME key newkey #修改 key 的名称
5.3 DB相关命令
dbsize # 查看当前数据库中有多个key
select index # 切换数据库 总共有16个数据 从0-15
flushdb # 清空d当前数据库
flushall # 清空所有数据库
5.4 String
set key value [EX seconds|PX milliseconds|EXAT timestamp]
EX 过期时间单位秒
PX 过期时间单位毫秒
EXAT 过期时间 时间戳类型 set s1 s1 EXAT 1714093689
如果键相同则会覆盖之前的内容
get key # 获取对应键的值
mset key value [key value ...] #批量存键和值
mget key [key ...] #批量获取
incr key #对整数数字类型的字符串自增每次+1
incrby key increment # 指定自增的步长
incrbyfloat key increment # 对键键增加小数
decr key # 对整数值的字符串进行自减 -1
decrby key decrement # 指定自减多少
setnx key value # 添加键值对,如果键存在则不添加,否则添加
setex key seconds value # 添加键值对,并指定过期时间
getrange key start end # 获取键的值,指定了范围
strlen name # 返回字符串的长度
append key value # 对键的值进行追加,若果键不存在则添加新的键
getset key value # 对键设置新的值,同时返回该键旧值
5.5 List
lpush key element [element ...] # 向列表左侧添加元素
如果列表不存在则会创建
rpush key element [element ...] # 向列表右侧添加元素
lindex key index # 获取列表对应下标的元素
lrange key start end # 列出列表中从start到end的元素
lpop key [count] # 移除并返回列表左侧的count个元素,没有则返回nil
rpop key [count] # 移除并返回列表右侧的count个元素,没有则返回nil
blpop
lpushx key element [element ...] # 向已存在列表左侧添加元素
如果列表不存在则添加失败
linsert key BEFORE|AFTER pivot element
# 在列表的元素前或者后插入元素 pivot 支点
# linsert list1 before c d 向列表list1中c元素的前面添加元素d
llen key # 返回列表的长度
lrem key count element # 移除列表元素count个
lset key index element # 设置具体下标所在的元素值,替换原来的元素
ltrim key start stop # 列表元素修剪,不在返回内的元素都会移除
ltrim list1 1 0 # 清空列表
5.6 Set
sadd key member [member ...] # 添加set成员
srem key member [member ...] # 移除set成员
scard key # 返回set集合中的成员个数
sismember key member # 判断成员是否在set集合中
smembers key # 获取set集合中所有的元素
sinter key [key ...] # 获取多个集合中的交集
交集:指的是多个集合中公共拥有的,你有我也有
sdiff key1 [key2 ...] # 获取key1与key2的差集
差集:key1的元素减去key2中同时拥有的元素,key1减去key1和key2两个集合
共同拥有的成员
sunion key [key ...] # 获取多个集合中的并集
并集:所有的成员
5.7 哈希 hash
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:
(HSET key field value): 将哈希表 key 中的字段 field 的值设为 value
(HGET key field): 获取存储在哈希表中指定字段的值
(HDEL key field):删除存储在哈希表中的指定字段
(HKEYS key): 获取哈希表中所有字段
(HVALS key):获取哈希表中所有值
hset 1 name zhangsan
=》表示 设置 key为1的哈希表,key里面filed的值为name,filed对应的值为zhangsan(可以把filed看成属性,然后把value看成属性值)
hget 1 name
=》表示 获取 存储在key为1的哈希表里面的字段为name的值
hdel 1 name
=》表示删除存储在key为1的哈希表中里面的字段名为name的字段
hkeys 1
=》表示获取key为1的哈希表的所有字段
hvals 1
=》表示获取key为1的哈希表里面的所有字段的值
5.8 有序集合 (sorted set / zset)
集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素(使用例子:各种排行榜)
六. Redis主从复制
Redis主从复制配置方法
Docker环境下的Redis主从复制设置
为了在Docker环境中成功配置Redis主从复制,需先理解基本概念以及具体的操作流程。
基本概念解释
主从复制意味着将一台Redis服务器的数据同步至其他Redis实例。此过程涉及两个角色:一个是作为数据源的主节点(master),另一个是从主节点接收更新副本的从节点(slave)。这种架构允许读取负载均衡,并提供了一定程度上的冗余保障
创建网络连接以便容器间通信
确保所有参与复制的Redis服务能够相互通信至关重要。为此,建议创建专用的Docker网络来促进这些交互:
docker network create redis-network
启动主服务器
启动一个名为redis-master的服务端口映射到主机6379端口上,并将其加入之前建立好的自定义网络中去:
docker run -d --name redis-master -p 6379:6379 --network redis-network redis
这一步骤建立了整个集群的核心——即存储实际键值对的地方
修改配置文件支持远程访问
为了让后续添加的从机可以正常连通主机,需要调整默认不允许外部链接的安全策略。可以通过编辑已有的配置文件或者挂载新的配置文件方式完成这项工作。这里给出一种基于后者的方法示例:
vim /home/docker/redis6379/conf/redis.conf
在此文件内部找到有关绑定地址的部分(bind)取消其注释状态并将值设为空白表示接受来自任何地方请求;另外还需开启认证机制以增强安全性(如果适用的话)
添加并初始化第一个从属节点
现在准备就绪向系统引入首个辅助成员了。执行如下指令部署新实例同时指定它所依赖的目标对象名称为先前提到过的那个“master”。
docker run -d --name redis-slave1 --link redis-master:master \
--network redis-network \
-e REDIS_MASTER_HOST=master \
-e REDIS_MASTER_PORT=6379 \
-p 6380:6379 \
redis redis-server --slaveof master 6379
上述命令不仅完成了容器本身的创建工作还指定了必要的环境变量用于告知子进程应当追随哪台机器成为自己的上级领导单位。
扩展更多跟随者
如果有需求进一步扩大规模只需重复上面的过程更改相应参数比如暴露不同对外监听接口即可轻松达成目的。
思维导图
七. 哨兵模式
尚未完全,感兴趣的可以参考这位大佬传送门