redis安装配置

redis安装配置

redis应用场景

缓存

合理的使用 缓存 能够明显加快访问的速度,同时降低数据源的压力。这也是 Redis 最常用的功能。Redis 提供了 键值过期时间(EXPIRE key seconds)设置,并且也提供了灵活控制 最大内存 和 内存溢出 后的 淘汰策略

排行榜

Redis 提供了 列表(list)有序集合(zset)数据结构,合理的使用这些数据结构,可以很方便的构建各种排行榜系统。

计数器

例如:点赞数加 1,浏览数 加 1。还有常用的 限流操作,限制每个用户每秒 访问系统的次数 等等。Redis 支持 计数功能(INCR key),而且计数的 性能 也非常好,计数的同时也可以设置 超时时间,这样就可以 实现限流。

社交网络

赞/踩,粉丝,共同好友/喜好,推送,下拉刷新等是社交网站必备的功能。

消息队列

Redis 提供的 发布订阅(PUB/SUB)和 阻塞队列 的功能,虽然和专业的消息队列比,还 不够强大,但对于一般的消息队列功能基本满足。

redis的安装

下载解压
1
2
3
cd /usr/local/
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
tar -zxvf redis-4.0.2.tar.gz
编译并安装
1
2
cd /usr/local/redis-4.0.11
make install PREFIX=/usr/local/redis

安装完成时,/usr/local/redis/bin 目录下会生成的几个可执行的文件。

    | 可执行文件 | 作用 |
    |-----------|-------|
    | redis-server | 启动 redis 服务 |
    | redis-cli redis | 命令行客户端 |
    | redis-benchmark | redis 基准测试工具 |
    | redis-check-aof | redis AOF 持久化文件检测和修复工具 |
    | redis-check-dump | redis RDB 持久化文件检测和修复工具 |
    | redis-sentinel | 启动 redis sentinel |

复制 Redis 相关命令到 /usr/local/bin 目录下,这样就可以直接执行这些命令。

1
2
cd /usr/local/redis/bin/
sudo cp redis-cli redis-server redis-sentinel /usr/local/bin
修改Redis配置文件

安装完成之后将 Redis 配置文件拷贝到 /usr/local 下,redis.conf 是 Redis 的配置文件。

1
sudo cp /usr/local/redis-4.0.11/redis.conf /usr/local/

redis 配置文件主要参数解析参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。
daemonize no
# 指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
# redis进程的端口号
port 6379
# 绑定的主机地址
bind 127.0.0.1
# 客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout 300
# redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
# log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
# 设置数据库的数量,默认为0可以使用select <dbid>命令在连接上指定数据库id
databases 16
# 指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件
save <seconds> <changes>
# 指定存储至本地数据库时是否压缩文件,默认为yes即启用存储
rdbcompression yes
# 指定本地数据库文件名
dbfilename dump.db
# 指定本地数据问就按存放位置
dir ./
# 指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof <masterip> <masterport>
# 当master设置了密码保护时,slave服务连接master的密码
masterauth <master-password>
# 设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH<password>命令提供密码,默认关闭
requirepass footbared
# 设置同一时间最大客户连接数,默认无限制。redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
# 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory<bytes>
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no。
appendonly no
# 指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
# 指定更新日志的条件,有三个可选参数 - no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec

设置后台启动
由于 Redis 默认是 前台启动,不建议使用。修改 Redis 配置文件,把 daemonize no 改为 daemonize yes。

1
daemonize yes

设置远程访问
Redis 默认只允许 本机访问,把 bind 修改为 bind 0.0.0.0 此设置会变成 允许所有远程访问。如果想指定限制访问,可设置对应的 IP。

1
bind 0.0.0.0

配置 Redis 日志记录
默认是:logfile “”,改为自定义日志文件路径。

1
logfile /var/log/redis_6379.log

设置 Redis 请求密码,修改后重启服务

1
requirepass "123456"

有了密码之后,进入客户端,就得这样访问:

1
redis-cli -h 127.0.0.1 -p 6379 -a 123456
配置环境变量

新建一个 redis 环境变量文件并写入

1
2
3
4
vim /etc/profile.d/redis.sh
#添加如下内容
PATH=$PATH:/usr/local/redis/bin
export PATH

使配置文件生效

1
source /etc/profile

然后可以运行

1
2
3
redis-server -v
#输出可看到
Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=243d9be1bcedcd4b
注册Redis为系统服务

新建redis服务文件并编辑

1
2
#新建并编辑
vim /usr/lib/systemd/system/redis.service

添加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
#注意自己redis-server和redis.conf的存放路径
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis.conf --supervised systemd
#下边会创建redis-shutdown
ExecStop=/usr/local/redis/libexec/redis-shutdown
Type=notify
User=muzili
Group=muzili
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

:不添加LimitNOFILE=65536启动可能会提示:

1
2
3
1894:M 17 Nov 14:16:46.645 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
1894:M 17 Nov 14:16:46.645 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
1894:M 17 Nov 14:16:46.645 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.

重新加载systemctll配置

1
systemctl daemon-reload

新建redis关闭文件并编辑

1
2
3
4
mkdir /usr/local/redis/libexec
touch /usr/local/redis/libexec/redis-shutdown
chmod 755 /usr/local/redis/libexec/redis-shutdown
vim /usr/local/redis/libexec/redis-shutdown

添加内容,# 去掉[[:\blank:]]中的\

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash
#
# Wrapper to close properly redis and sentinel
test x"$REDIS_DEBUG" != x && set -x
# 确定好自己redic-cli的目录
REDIS_CLI=/usr/local/bin/redis-cli
# redis.conf的名字
SERVICE_NAME="$1"
if [ -z "$SERVICE_NAME" ]; then
SERVICE_NAME=redis
fi
# Get the proper config file based on service name
CONFIG_FILE="/usr/local/$SERVICE_NAME.conf"
# Use awk to retrieve host, port from config file
# 去掉[[:\blank:]]中的\
HOST=`awk '/^[[:\blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
PORT=`awk '/^[[:\blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
PASS=`awk '/^[[:\blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
SOCK=`awk '/^[[:\blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
# Just in case, use default host, port
HOST=${HOST:-0.0.0.0}
if [ "$SERVICE_NAME" = redis ]; then
PORT=${PORT:-6379}
else
PORT=${PORT:-26739}
fi
# Setup additional parameters
# e.g password-protected redis instances
[ -z "$PASS" ] || ADDITIONAL_PARAMS="-a $PASS"
# shutdown the service properly
if [ -e "$SOCK" ] ; then
$REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
else
$REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
fi
可以启动关闭服务查看新加脚本是否成功

启动服务

1
systemctl start redis  或者 service redis start

关闭服务

1
systemctl stop redis  或者 service redis stop

服务状态

1
systemctl status redis  或者 service redis status
启动问题

a.提示:

1
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
2
3
4
#执行如下命令
echo "net.core.somaxconn = 1024" >> /etc/sysctl.d/99-sysctl.conf
#接着执行如下命令使其生效
sysctl -p

b.提示:

1
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
2
3
4
#执行如下命令
echo "vm.overcommit_memory = 1" >> /etc/sysctl.d/99-sysctl.conf
#接着执行如下命令使其生效
sysctl -p

c.提示:

1
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.

解决办法:

1
2
3
4
5
6
#在/etc/rc.d/rc.local 文件里添加
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
#保存执行
chmod +x /etc/rc.d/rc.local

主从复制

注意:配从不配主

先查看防火墙设置,假如防火墙开启,开放redis端口

查看开放的端口

1
sudo firewall-cmd --list-ports

开放自己想开放的端口

1
sudo firewall-cmd --zone=public --add-port=6379/tcp --permanent
进入从服务器 的 redis-cli 模式
1
redis-cli -p 6379

从服务器配置主服务器

1
slaveof 192.168.31.44 6379

分别查看主、从服务器的配置情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#命令
info replication
#主服务器返回信息
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.31.134,port=6379,state=online,offset=1862,lag=0
master_replid:a45b5866dd55b1551ddbaa9d6741af1f2d4e6979
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1862
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1862
#从服务器返回信息
# Replication
role:slave
master_host:192.168.31.44
master_port:6379
master_link_status:up###如果为down,1.查看防火墙状态,是否开放了端口。2.主服务器是否有密码,从服务器配置了主服务器的密码吗
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:966
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a45b5866dd55b1551ddbaa9d6741af1f2d4e6979
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:966
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:953
repl_backlog_histlen:14

以上配置缺点:
假如从机挂了,就需要重新配置连接,主机挂了,从机待机,主机恢复自动连接
假如从机挂了不想再配置,那就直接配置redis.conf配置文件(配从不配主)

1
2
3
4
#找到slaveof <masterip> <masterport>去掉注释
slaveof 192.168.31.44 6379
#主机配置了密码,从机配置主机设置的密码,找到masterauth <master-password>去掉注释
masterauth 123456

配置完重启。
从机变为主机

1
slaveof no one

redis安装配置
http://www.muzili.ren/2022/06/11/redis安装/
作者
jievhaha
发布于
2022年6月11日
许可协议