#官方地址 https://redis.io/docs/install/install-redis/install-redis-on-linux/#导入key [root@ubuntu2204 ~]#curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg #生成对应仓库配置文件 [root@ubuntu2204 ~]#echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list #查看生成的文件 [root@ubuntu2204 ~]#ls /etc/apt/sources.list.d redis.list[root@ubuntu2204 ~]#apt update #查看版本 [root@ubuntu2204 ~]#apt list -a redis #安装最新版 [root@ubuntu2204 ~]#apt -y install redis #指定版本安装,注意:因为依赖关系可能会失败 [root@ubuntu2204 ~]#apt -y install redis=6:7.2.4-1rl1~jammy1
范例:内置仓库
[root@ubuntu2204 ~]#apt list redis [root@ubuntu2004 ~]#apt -y install redis
编译安装
#Redis 源码包官方下载链接: http://download.redis.io/releases/ #官方的安装方法: https://redis.io/docs/getting-started/installation/install-redis-from-source/
范例: 编译安装
#安装依赖包 [root@centos8~]#yum -y install gcc make jemalloc-devel#如果支持systemd需要安装下面包 [root@ubuntu2204 ~]#apt update && apt -y install make gcc libjemalloc-dev libsystemd-dev [root@ubuntu2004 ~]#apt update && apt -y install make gcc libjemalloc-dev libsystemd-dev [root@ubuntu1804 ~]#apt update && apt -y install make gcc libjemalloc-dev libsystemd-dev [root@centos8 ~]#yum -y install gcc jemalloc-devel systemd-devel [root@centos7 ~]#yum -y install gcc jemalloc-devel systemd-devel#下载源码 [root@centos8 ~]#wget http://download.redis.io/releases/redis-6.2.4.tar.gz [root@centos8 ~]#tar xvf redis-6.2.4.tar.gz#编译安装 [root@centos8 ~]#cd redis-6.2.4/ #如果支持systemd,需要执行下面 [root@centos8 redis-6.2.4]#make -j 2 USE_SYSTEMD=yes PREFIX=/apps/redis install #如果不支持systemd,执行下面 [root@centos8 redis-6.2.4]#make -j 2 PREFIX=/apps/redis install #指定redis安装目录#配置环境变量 [root@centos8 ~]#echo 'PATH=/apps/redis/bin:$PATH' >> /etc/profile [root@centos8 ~]#. /etc/profile#目录结构 [root@centos8 ~]#tree /apps/redis/ /apps/redis/ └── bin├── redis-benchmark├── redis-check-aof├── redis-check-rdb├── redis-cli├── redis-sentinel -> redis-server└── redis-server#准备相关目录和配置文件 [root@centos8 ~]#mkdir /apps/redis/{etc,log,data,run} #创建配置文件、日志、数据等目录#默认配置文件有问题,需要修改 [root@centos8 redis-6.2.4]#cp redis.conf /apps/redis/etc/
前台启动 Redis
#前台启动 redis [root@centos8 ~]#redis-server /apps/redis/etc/redis.conf
创建 Redis 用户和设置数据目录权限及修改默认配置文件
[root@centos8 ~]#useradd -r -s /sbin/nologin redis #设置目录权限 [root@centos8 ~]#chown -R redis.redis /apps/redis/
#修改配置(如果是dpkg安装的,去查找配置文件位置) #[root@ubuntu redis]#dpkg -L redis-server| grep 'redis\.conf' [root@ubuntu redis]#vim /apps/redis/etc/redis.conf #修改配置内容 bind 0.0.0.0 #支持所有其他主机访问 logfile "/path/redis.log" #日志路径,示例:logfile "/apps/redis/log/redis_6379.log" dir ./ #数据路径。快照文件保存路径,示例:dir "/apps/redis/data" pidfile /var/run/redis_6379.pid #pid文件路径,可以修改为/apps/redis/run/redis_6379.pid protected-mode yes #redis3.2之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问127.0.0.1:6379,可以远程连接,但当访问将提示警告信息并拒绝远程访问,redis-7版本后,只要没有密码就不能远程访问 [root@ubuntu redis]#systemctl restart redis
创建 Redis 服务 Service 文件
[root@centos8 ~]#vim /lib/systemd/system/redis.service [Unit] Description=Redis persistent key-value database After=network.target[Service] ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd ExecStop=/bin/kill -s QUIT $MAINPID #此行可省略 Type=notify #如果支持systemd可以启用此行 User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 LimitNOFILE=1000000 #指定此值才支持更大的maxclients值(redis支持更多并发连接) [Install] WantedBy=multi-user.target
Redis 通过Service方式启动
[root@centos8 ~]#systemctl daemon-reload [root@centos8 ~]#systemctl start redis
#ubuntu新版内核该参数已为4096,满足511,不用修改 #rocky系统进行修改 [root@rocky ~]# sysctl -a |grep somaxconn net.core.somaxconn = 128 [root@rocky ~]# vim /etc/sysctl.conf net.core.somaxconn = 4096 #加载 [root@rocky ~]# sysctl -p net.core.somaxconn = 4096
overcommit_memory
内核参数说明: 官方建议设成1
内核参数overcommit_memory 实现内存分配策略,可选值有三个:0、1、2 0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则内存 申请失败,并把错误返回给应用进程 1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何 2 表示内核允许分配超过所有物理内存和交换空间总和的内存
范例:
[root@rocky ~]# vim /etc/sysctl.conf vm.overcommit_memory = 1 [root@rocky ~]# sysctl -p
transparent hugepage
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 警告:您在内核中启用了透明大页面(THP,不同于一般4k内存页,而为2M)支持。 这将在Redis中造成延迟 和内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never> /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在 重启后保留设置。禁用THP后,必须重新启动Redis。
注意:Ubuntu22.04默认值满足要求,不再有此告警 (rocky要改)
范例:
#查看默认值 [root@ubuntu2204 ~]#cat /sys/kernel/mm/transparent_hugepage/enabled always [madvise] never#ubuntu开机配置(ubuntu满足,不用配,这里只是演示) [root@ubuntu2004 ~]#cat /etc/rc.local #!/bin/bash echo never > /sys/kernel/mm/transparent_hugepage/enabled [root@ubuntu2004 ~]#chmod +x /etc/rc.local#CentOS开机配置(这个命令重启就没了,所以要开机自启) [root@centos8 ~]#echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local #该文件默认没执行权限,需要加上 [root@centos8 ~]#chmod +x /etc/rc.d/rc.local
[root@ubuntu ~]#apt update && apt install -y docker.io #dockerhub官网上搜redis,通过tag找一个版本,这里找了一个alpine系统的 [root@ubuntu ~]#docker pull redis:7.2.4-alpine3.19 [root@ubuntu2204 ~]#docker run -d -p 6379:6379 --name myredis redis:7.2.4-alpine3.19 #指定连接密码 [root@ubuntu2204 ~]#docker run -d -p 6379:6379 --name myredis redis:7.2.4-alpine3.19 --requirepass 123456#数据持久化目录在容器/data下,可以用卷或挂载的方式挂在宿主机上保证容器被删,数据还在
另外这样的好处,可以利用到多核cpu的性能
也可以使用redis多实例,不同端口的方式实现
测试环境中经常使用多实例,需要指定不同实例的相应的端口,配置文件,日志文件等相关配置
范例: 以编译安装为例实现 redis 多实例
[root@ubuntu ~]#vim /lib/systemd/system/redis6379.service [Unit] Description=Redis persistent key-value database After=network.target[Service] ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6379.conf --supervised systemd ExecStop=/bin/kill -s QUIT $MAINPID Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 LimitNOFILE=1000000[Install] WantedBy=multi-user.target[root@ubuntu ~]#vim /lib/systemd/system/redis6380.service ... [Service] ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6380.conf --supervised systemd ...[root@ubuntu ~]#vim /lib/systemd/system/redis6381.service ... [Service] ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6381.conf --supervised systemd ...[root@ubuntu ~]#cd /apps/redis/etc [root@ubuntu etc]#cp redis.conf redis6379.conf [root@ubuntu etc]#vim redis6379.conf dbfilename dump6379.rdb [root@ubuntu etc]#sed 's/6379/6380/g' redis6379.conf > redis6380.conf [root@ubuntu etc]#sed 's/6379/6381/g' redis6379.conf > redis6381.conf [root@ubuntu etc]#systemctl daemon-reload [root@ubuntu etc]#systemctl enable --now redis6379 redis6380 redis6381
#如果是dpkg安装的,去查找配置文件位置 [root@ubuntu redis]#dpkg -L redis-server| grep 'redis\.conf' #如果按照上面编译安装的配置路径 /apps/redis/etc/redis.conf bind 0.0.0.0 #支持所有其他主机访问 port 6379 #监听端口,默认6379/tcp tcp-backlog 511 #三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列长度 timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时 tcp-keepalive 300 #tcp 会话保持时间300s logfile "/path/redis.log" #日志路径,示例:logfile "/apps/redis/log/redis_6379.log" loglevel notice #日志级别 databases 16 #设置数据库数量,默认:0-15,共16个库 requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生产建议设置 maxclients 10000 #Redis最大连接客户端 maxmemory <bytes> #redis使用的最大内存,单位为bytes字节,0为不限制,建议设为物理内存一半,8G内存的计算方式8(G)*1024(MB)1024(KB)*1024(Kbyte),需要注意的是缓冲区是不计算在maxmemory内,生产中如果不设置此项,可能会导致OOM rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之 dbfilename dump.rdb #快照文件名 dir ./ #数据路径。快照文件保存路径,示例:dir "/apps/redis/data" pidfile /var/run/redis_6379.pid #pid文件路径,可以修改为/apps/redis/run/redis_6379.pid protected-mode yes #redis3.2之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问127.0.0.1:6379,可以远程连接,但当访问将提示警告信息并拒绝远程访问,redis-7版本后,只要没有密码就不能远程访问
#默认为本机无密码连接 redis-cli #远程客户端连接,注意:Redis没有用户的概念 redis-cli -h <Redis服务器IP> -p <PORT> -a <PASSWORD> --no-auth-warning
查看redis状态(内存使用情况,最大限制,当前连接数,最大连接数)
[root@ubuntu etc]#redis-cli info
动态修改redis参数 (临时生效,重启就失效了)
#如果还要永久生效,那就把配置文件也改了 [root@ubuntu ~]#redis-cli #获取所有redis参数 127.0.0.1:6379> config get * #获取最大客户端数量 127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "10000" #修改参数 127.0.0.1:6379> config set maxclients 77777 OK #修改密码 127.0.0.1:6379> config set requirepass 123456#Redis5.0有些设置无法修改,Redis6.2.6版本支持修改bind 127.0.0.1:6379> CONFIG SET bind 127.0.0.1 (error) ERR Unsupported CONFIG parameter: bind
[root@centos8 ~]#vim /etc/redis.conf slowlog-log-slower-than 10000 #单位为us,指定超过1us即为慢的指令,默认值为10000us127.0.0.1:6379> SLOWLOG LEN #查看慢日志的记录条数 (integer) 14 127.0.0.1:6379> SLOWLOG GET [n] #查看慢日志的最近n条记录,默认为10 1) 1) (integer) 14 2) (integer) 1544690617 #第2)行表示命令执行的时间戳,距离1970-1-1的秒数,date -d +@1544690617 可以转换 3) (integer) 4 #第3)行表示每条指令的执行时长 4) 1) "slowlog"127.0.0.1:6379> SLOWLOG RESET #清空慢日志
1.RDB:Redis DataBase
2.AOF:AppendOnlyFile
执行save后,会生成dump.rdb文件。即使redis服务重启,也会自动加载现有数据 dump.rdb(文件大,启动会慢些) #先备份为temp-主进程号.pid,完成后再覆盖dump.rdb,temp文件就没了 注意: save 指令使用主进程进行备份,而不生成新的子进程,但是也会生成临时文件temp-<主进程 PID>.rdb文件 (主进程也就是处理用户请求的进程,且是单行程,其他命令像访问会排队等待) 实际生产中,不会采用save来做文件持久化,耽误用户访问,而采用bgsave(后台)bgsave会单独开一个子进程进行备份,先备份为temp-子进程号.pid,完成后再覆盖dump.rdb,temp文件就没了。不影响原来的主线程 #如果备份中途停电或者失败了,也不会覆盖影响原来的dump.rdb
2.4.1.2 RDB 相关配置
#在配置文件中的 save 选项设置多个保存条件,只有任何一个条件满足,服务器都会自动执行 BGSAVE 命 令 #Redis7.0以后支持写在一行,如:save 3600 1 300 100 60 10000,此也为默认值 save 900 1 #900s内修改了1个key即触发保存RDB save 300 10 #300s内修改了10个key即触发保存RDB save 60 10000 #60s内修改了10000个key即触发保存RDB dbfilename dump.rdb dir ./ #编泽编译安装时默认RDB文件存放在Redis的工作目录,此配置可指定保存的数据目 录 stop-writes-on-bgsave-error yes #当快照失败是否仍允许写入,yes为出错后禁止写入,建议为no rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之 rdbchecksum yes #是否对备份文件开启RC64校验,默认是开启
范例:RDB 相关配置 (自动触发bgsave)
[root@ubuntu2004 ~]#redis-cli config get save 1) "save" 2) "3600 1 300 100 60 10000" #默认 #支持动态修改,注意:需要添加双引号 127.0.0.1:6379> config set save "30 3" #30s超过3次就备份 OK 127.0.0.1:6379> config get save 1) "save" 2) "60 3"#直接修改配置文件 [root@ubuntu2004 ~]#vim /apps/redis/etc/redis.conf sav3 30 3#禁止持久化(系统不自动持久化,用户还是可以手动持久化) 127.0.0.1:6379> config set save "" [root@ubuntu2004 ~]#vim /apps/redis/etc/redis.conf save ""#注意:通过redis-cli info查看rdb_bgsave_in_progress:0,如果0表示完成了 [root@ubuntu ~]#redis-cli info|grep rdb_bgsave_in_progress rdb_bgsave_in_progress:0 #脚本可以通过此方法bgsave后查看是否备份完成
2.4.1.3 实现 RDB 方法
1.save: 同步,不推荐使用,使用主进程完成快照,因此会阻塞其它命令执行 2.bgsave: 异步后台执行,不影响其它命令的执行,会开启独立的子进程,因此不会阻赛其它命令执行 3.配置文件实现自动保存: 在配置文件中制定规则,自动执行bgsave
范例: 手动备份RDB文件的脚本
#配置文件 [root@centos7 ~]#vim /apps/redis/etc/redis.conf save "" dbfilename dump_6379.rdb dir "/data/redis" appendonly no #脚本 [root@centos8 ~]#cat redis_backup_rdb.sh #!/bin/bash #******************************************************************** #Author: wangxiaochun #QQ: 29308620 #Date: 2020-10-21 #FileName: redis_rdb.sh #URL: http://www.wangxiaochun.com #Description: The test script #Copyright (C): 2020 All rights reserved #******************************************************************** BACKUP=/backup/redis-rdb DIR=/data/redis FILE=dump_6379.rdb PASS=123456color () {RES_COL=60MOVE_TO_COL="echo -en \\033[${RES_COL}G"SETCOLOR_SUCCESS="echo -en \\033[1;32m"SETCOLOR_FAILURE="echo -en \\033[1;31m"SETCOLOR_WARNING="echo -en \\033[1;33m"SETCOLOR_NORMAL="echo -en \E[0m"echo -n "$1" && $MOVE_TO_COLecho -n "["if [ $2 = "success" -o $2 = "0" ] ;then${SETCOLOR_SUCCESS}echo -n $" OK " elif [ $2 = "failure" -o $2 = "1" ] ;then ${SETCOLOR_FAILURE}echo -n $"FAILED"else${SETCOLOR_WARNING}echo -n $"WARNING"fi${SETCOLOR_NORMAL}echo -n "]"echo }redis-cli -h 127.0.0.1 -a $PASS --no-auth-warning bgsave result=`redis-cli -a $PASS --no-auth-warning info Persistence |grep rdb_bgsave_in_progress| sed -rn 's/.*:([0-9]+).*/\1/p'` #result=`redis-cli -a $PASS --no-auth-warning info Persistence |awk -F: '/rdb_bgsave_in_progress/{print $2}'` until [ $result -eq 0 ] ;dosleep 1result=`redis-cli -a $PASS --no-auth-warning info Persistence |awk -F: '/rdb_bgsave_in_progress/{print $2}'` done DATE=`date +%F_%H-%M-%S`[ -e $BACKUP ] || { mkdir -p $BACKUP ; chown -R redis.redis $BACKUP; } scp $DIR/$FILE $BACKUP/dump_6379-${DATE}.rdb backup-server:/backup/color "Backup redis RDB" 0#执行 [root@centos8 ~]#bash redis_backup_rdb.sh Background saving started Backup redis RDB [ OK ][root@centos8 ~]#ll /backup/redis-rdb/ -h total 143M -rw-r--r-- 1 redis redis 143M Oct 21 11:08 dump_6379-2020-10-21_11-08-47.rdb