01 Redis安装、配置详解、数据备份与恢复

缓存简介

简介

缓存是为了调节速度不一致的两个或者多个不同的物质的速度,在中间对速度访问较快的一方起到一个加速访问速度较慢的一方的作用,比如cpu的一级,二级缓存是为了保存cpu最近经常访问的数据,内存是保存cpu经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid卡也有缓存,都是为了起到加速cpu访问硬盘数据的目的。

buffer-->写缓冲,一般用于写操作
cache-->读缓存,一般用于读操作

cache的保存位置

客户端:浏览器
内存:本地服务器,远程服务器
硬盘:本机硬盘,远程服务器硬盘

cache的特性

自动过期:给缓存的数据加上有效时间,超出时间后自动过期删除、
过期时间:强制过期,源网站更新图片后cdn是不会更新的,需要强制图片缓存过期
命中率:缓存的读取命中率

用户层缓存

DNS缓存

默认是60秒

火狐

about:cache
Etag标记

CDN缓存

内容分发网络,通过将服务内容分发到全网加速节点,利用全球调度系统使用户能够就近获取,有效的降低访问延迟,提升服务的可用性。

优点
调度准确-将用户调查到最近的边缘节点
性能优化--cdn 专门用于缓存响应速度快
安全相关-抵御公积
节省带宽:犹豫用户请求边缘节点响应,因此大幅度降低源站带宽。

应用层的缓存

nginx、php等web'服务可以设置应用缓存来加速用户请求,另外有些解释型的语言不能直接运行,需要先编译成字节码,但是字节码需要解释器解释为机器码之后才能执行,因此字节码也是一种缓存,有时候会出现程序代码上线后字节码没有更新的现象。

redis

介绍

官网redis.io

Redis和Memcached是非关系型数据库,也称之为NoSQL数据库。基于内存的key-value数据库

对比Memcached

redis支持数据持久化,会把内存数据刷到磁盘中,再次重启的时候,可以将服务器之后的备份文件恢复到内存中继续使用,
redis是单线程的,memcached是多线程的,所以在单机的情况下,没有memcache并发高,但是redis是支持分布式集群的,所以可以很轻松的超过memcached

经典的应用场景

session共享,常见的web集群中的Tomcat或者phpweb服务器的session共享
消息队列:ELK的日志缓存、部分业务的订阅分布系统
计数器:访问排行榜,商品浏览数等和次数相关的数值统计场景
缓存:数据库查询缓存,电商网站商品信息、新闻内容
微博点赞评论等

安装

[root@db01 ~]# yum install redis -y

# 设置开机自启动
[root@db01 ~]# systemctl enable --now redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

# 测试
[root@db01 ~]# redis-cli 
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-1160.24.1.el7.x86_64 x86_64

编译安装

[root@db01 ~]# wget https://download.redis.io/releases/redis-4.0.9.tar.gz
[root@db01 ~]# tar xf redis-4.0.9.tar.gz
[root@db01 ~]# cd redis-4.0.9/
[root@db01 redis-4.0.9]# make prefix=/apps/redis install
[root@db01 redis-4.0.9]# src/redis-server redis.conf
[root@db01 redis]# mkdir /apps/redis/{etc,logs,data,run} -p
[root@db01 redis-4.0.9]# cp redis.conf /apps/redis/etc/
[root@db01 bin]# redis-server ../etc/redis.conf

# 第一个警告
echo "net.core.somaxconn = 512" >> /etc/sysctl.conf
[root@db01 bin]# sysctl -p

# 第二个警告
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
[root@db01 bin]# sysctl -p

# 第三个警告
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled

# 创用户授权
[root@db01 redis]# useradd -u 2020 redis
[root@db01 redis]# chown -R redis.redis /apps/
# service启动
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
# ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
# 设置开机自启动
[root@db01 ~]# systemctl enable --now redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

# 验证启动
[root@db01 redis]# ss -tnl

[root@db01 redis]# vim /apps/redis/etc/redis.conf 
[root@db01 redis]# systemctl restart redis
[root@db01 redis]# ss -tnl
State       Recv-Q Send-Q                       Local Address:Port                                      Peer Address:Port              
LISTEN      0      128                                      *:10051                                                *:*                  
LISTEN      0      511                                      *:6379                                                 *:* 
# 命令
# 本机非密码连接
redis-cli

# 跨主机非密码连接
redis-cli -h [] -p

# 跨主机密码连接
redis-cli -h [] -p

Redis配置文件详解

bind 0.0.0.0 # 监听地址
protected-mode yes # 安全模式,要配置监听地址,或者密码,否则报错
tcp-keepalive 300 # tcp会话保持时间
daemonize no # 开启的话就后台运行
pidfile /apps/redis/run/redis_6379.pid # pid文件存放路径
databases 16 # 数据库的个数
always-show-logo no # 不显示log
save 900 1 # 900秒内有一个key发生变化就设置快照,这三个是或的关系
save 300 10
save 60 10000
stop-writes-on-bgsave-error no # 快照失败停止写入,千万不要开
dbfilename dump6379.rdb # 备份数据的文件名
dir "/apps/redis/data" # 备份的目录
rdbcompression yes # 持久化rdb文件时是否压缩,权衡下,看cpu
rdbchecksum yes # 是否校验完整性
slave-serve-stale-data yes # 设置为yes,从库会继续响应客户端请求
slave-read-only yes # 设置从库是否为只读
repl-diskless-sync no # 是否使用socket复制数据,无盘同步。磁盘较慢,网络较快的时候用yes
repl-diskless-sync-delay 5 # 同步的延迟时间,单位是秒,降低dump的资源消耗的
repl-ping-slave-period 10 # ping的间隔,ping主库的
repl-timeout 60 # 超时时间
repl-backlog-size 1mb # 复制缓冲区的内存大小
repl-backlog-ttl 3600 # 多次时间master没有slave连接,就清空backlog缓冲区,可以配小一点
requirepass "123456" # 密码
rename-command del "linux12" # 改高危命令做重命名
maxclients 10000 # 最大连接客户端
maxmemory <bytes> # 最大内存,推荐为设置服务器的最大内存数的一半,单位是字节
appendonly no # aof
appendfilename "appendonly.aof" # aof文件名,和rdb共享一个目录
# appendfsync always
appendfsync everysec
# appendfsync no
auto-aof-rewrite-min-size 64mb # 重写的最小文件大小
auto-aof-rewrite-percentage 100 # 允许超过的百分比
aof-load-truncated yes # 是否加载末尾异常的文件,也要改成yes
aof-use-rdb-preamble no
slowlog-log-slower-than 10000 # 超过这个时间的慢查询(毫秒)
slowlog-max-len 128 # 一共记录多少条

Redis持久化

虽然是内存的高性能数据库,但是是可以通过一定的策略保存到硬盘上,从而实现数据持久保存的目的

RDB模式

是基于时间的快照,其默认只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能丢失上次快照到当前时间点之间未做快照的数据

# 注释掉配置文件
# 关掉aof
save ""

#save 900 1
#save 300 10
#save 60 10000

dbfilename dump6379.rdb # 文件名
dir "/apps/redis/data" # 存储的目录
# 使用脚本备份,加入定时任务
#!/bin/bash
redis-cli -h `hostname -i` -a 123456 bgsave
DATE=`date +%F_%T`
sleep 3 # 备份要时间
mv /apps/redis/data/dump6379.rdb /data/redis/${DATE}.rdb

# 恢复数据,将这个备份的文件,移动到/apps/redis/data,改名为dump6379.rdb
# 重启redis,启动的时候加载到内存中去,数据恢复

优点

rdb快照保存了某个时间点的数据,可以通过脚本执行bgsave(非阻塞)或者save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题的时候可以恢复到不同的时间点的版本,可以最大化IO的性能,因为父进程在保存RBD文件的时候唯一要做的是fork出一个子进程,然后操作都是这个子进程去执行,父进程无需任何的IO操作,RBD在大量数据比如几个G的数据,恢复的速度比AOF的快

缺点

不能实时保存数据,会丢失自上一次执行RDB备份到当前的内存数据,数据量非常大的时候,可能是秒级甚至是分钟级,取决于磁盘的IO性能

AOF模式

一般也不用开,配个RDB就足够你用了,了解就行。

AOF:按照操作顺序,依次将操作添加到指定的日志文件当中,特点是数据的安全性比较高,缺点就是有些操作会被重复记录。

AOF和RDB一样,使用了写时复制机制,AOF默认为每秒钟fsync一次,即将执行的命令保存到AOF文件当中,这样即使redis服务器发生故障的话,顶多就丢失一秒的数据。

优缺点

AOF文件大小要大于RDB文件

默认每秒执行一次

Redis的数据类型

字符串

192.168.15.201:6379> set key1 value1
OK
192.168.15.201:6379> TYPE key1
string

# 增
192.168.15.201:6379> set key1 value1
# 改
192.168.15.201:6379> set key1 value2
# 查
192.168.15.201:6379> get key1 
# 删
192.168.15.201:6379> del key1

# 设置过期时间
ex 30,单位秒

# 批量
mset
mget

# 追加
append key value
原文地址:https://www.cnblogs.com/zhaokunhao/p/15177977.html