redis 通俗易懂的说是个键值对数据库 能够快速响应到客户访问到的内容
1.当作缓存使用 把热点数据存储到内存里 直接访问的redis 速度极快
2.当临时储物柜 数据可设过期自动清理 比如说手机验证码redis 过期自动删除
3.可以进行实时更新 特别快
特性 | Redis | MySQL |
---|---|---|
存储位置 | 内存(快) | 硬盘(慢) |
用途 | 缓存、临时数据 | 永久存储 |
速度 | 微秒级响应 | 毫秒级响应 |
数据类型 | 字符串、列表、哈希等 | 只有表结构 |
1.部署redis中间件:
wget http://download.redis.io/releases/redis-5.0.12.tar.gz
tar -zxf redis-5.0.12.tar.gz -C /data #解压到/data下
mv redis-5.0.12 redis
yum install -y gcc gcc-c++
cd /data/redis
make PREFIX=/data/redis install
ln -sf /data/redis/bin/redis-cli /usr/bin/redis-cli #创建软链接 可以直接redis-cli登入 不用繁琐输入目录启动
mkdir -p /data/redis/{data,etc,logs} #创建 数据存储 配置 日志目录
touch /data/redis/redis.conf
bind 0.0.0.0 #允许所有服务器连接
protected-mode yes #需要密码才能访问
port 6739 # 端口号
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis.pid
loglevel notice
logfile "/data/redis/logs/redis.log" # 日志存放位置
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis/data # 数据存放目录
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes # 是否开启全持久化模式
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
requirepass 123456 # redis密码
maxmemory 2G # 内存上限 做的资源限制
#rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB "
#启动redis /data/redis/bin/redis-server /data/redis/redis.conf
/data/redis/bin/redis-cli -h 127.0.0.1 -p 6739 -a 123456 登入
2.redis介绍
类型:
作为 Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除 了常规的数值或字符串,Redis 的键值还可以是以下形式之一:
Lists (列表) Sets (集合) Sorted sets (有序集合) Hashes (哈希表)
键值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、 并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis 则提供自增等原子 操作。
持久化
通常,Redis 将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据 持久化:使用截图的方式,将内存中的数据不断写入磁盘;或使用类似 MySQL 的日志方式, 记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。
主从同步
Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益
相比需要依赖磁盘记录每个更新的数据库,基于内存的特性无疑给 Redis 带来了非常优秀的 性能。读写操作之间有显著的性能差异。
3.操作简单数据库
设置一个键值对 查看key为name的value 删除 验证键是否存在
4.redis 数据类型及其操作:
4.1strings 类型及操作
string 是最简单的类型 一个key对应一个value
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如 jpg 图片或者序 列化的对象。从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节,
setnx
设置 key 对应的值为 string 类型的 value。如果 key 已经存在,返回 0,nx 是 not exist 的意思。
setex
设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。如图为10s,10s之后查询不到
setrange
设置一个key和vaule 利用setrange命令替换内容 其中2是指从下标为2(包含2)的字符开始替换
mset 利用mset一次设置多个key的值
msetnx
一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值 被设置,但是不会覆盖已经存在的 key
get 获取库中存在key的value
getset 设置库中存在的key的value但是输出旧的value key 不存在的话输出nil
getrange 获取指定key的value的子字符串
mget 一次性获取多个key的value 不存在返回nil
incr 对key的值做加加操作 如果value不是int的话value会返回错误
incrby 和incr类似 加指定值
decr 做减减操作
decrby 减指定值
append 给key的字符串值增加value 返回新字符串的长度
strlen 取指定key的value的长度
4.2hashes类型及操作
5.redis的主从复制
主机:192.168.83.215 6380 从192.168.83.109
主从同步:一个master可有多台slave节点进行同步
主节点配置:conf文件中需要改
从节点配置:
在主机写入内容salve可以看到
同步成功
5.1主从同步原理:
slave节点发送同步请求到master master通过salve节点的认证
然后master节点开启一个进程发送rdb内存快照到slave
slave 使用flushall清除本地缓存 然后接受master的快照
同时master还可以写入数据 新写入的数据通过 replactionfeedslave函数一条条写入到slave中
主从同步存在的问题 :从库无法写入数据 然后主库挂了该怎么解决呢 由此引入了哨兵
5.2redis哨兵
master故障可以实现slave切换从而实现高可用
哨兵会像master和slave发送消息 确认对方是否活着
存在主观和客观下线
如何启动哨兵
修改/data/redis/sentinel.conf 配置文件
protected-mode no #安全模式 要不要输密码
port 26379 #哨兵监控端口
daemonize no #前台运行
sentinel monitor my master 192.168.83.215 6379 1 #被监控的master以及端口 以及有问题后需要决定挂掉的票 数
/data/redis/bin/redis-sentinel /data/redis/sentinel.conf
6.事务
可以一次执行多个命令,是一个命令组,一个事务中,所有命令都会序列化(排队),不会被插队;
一个队列中,一次性,顺序性,排他性的执行一系列命令
三特性
○ 隔离性:所有命令都会按照顺序执行,事务在执行的过程中,不会被其他客户端送来的命令打断
○ 没有隔离级别:队列中的命令没有提交之前都不会被实际的执行,不存在“事务中查询要看到事务里的更新,事务外查询不能看到”这个头疼的问题
○ 不保证原子性:冤有头债有主,如果一个命令失败,但是别的命令可能会执行成功, 没有回滚
三步走
○ 开启multi
○ 入队queued
○ 执行exec
● 与关系型数据库事务相比,
○ multi:可以理解成关系型事务中的 begin
○ exec :可以理解成关系型事务中的 commit
○ discard :可以理解成关系型事务中的 rollback
multi 开启事务 一起执行
discard 放弃之前的操作 恢复原来的值
一句报错,全部取消,恢复到原来的值
追究责任,谁的错,找谁去
7.利用备份恢复配置数据
redis通过rdb快照实现 部分数据持久化 AOF追加日志持久化
通过rdb加aof 实现混合持久化策略
7.1rdb(快照持久化)定时生成数据快照
适合备份和快速恢复 但是可能丢失最后一次快照后的数据
vim redis.conf
save 900 1 # 900秒(15分钟)内至少1个key变更则触发保存
save 300 10 # 300秒(5分钟)内至少10个key变更则触发保存
save 60 10000 # 60秒内至少10000个key变更则触发保存
dbfilename dump.rdb # RDB文件名
dir /data/redis/ # 保存路径
新生成的一个dump.rdb文件
源目标主机
scp /data/redis/dump.rdb root@192.168.83.215:/tmp/
目标主机:先登入 然后shutdown掉
cp /data/redis/dump.rdb /data/redis/dump.rdb.back
Mv /tmp/dump.rdb /data/redis/
sudo systemctl start redis
redis-cli –p 6739 -a 123456 查看内容已经同步
2.aof
vi redis.conf
appendonly yes # 启用AOF
appendfilename "appendonly.aof" # AOF文件名
appendfsync everysec # 每秒同步一次(平衡性能与安全)
# appendfsync always # 每次写操作都同步(最安全,性能最低)
# appendfsync no # 由操作系统决定同步时机(最快,可能丢失数据)
Aof重写策略 移除冗余命令:
Auto-aof-rewrite-percentage 100 #aof文件增长100%时触发重写
Auto-aof-rewrit-min-siza 64 #aof文件最小重写大小auto-
选择不停机(这就是aof的弊端)可能会丢失一些刚写入的数据
源目标主机 :scp /data/redis/appendonly.aof root@192.168.83.215:/tmp/
目标主机:rm –rf /data/redis/dump.rdb
rm –rf /data/redis/appendonly.aof
redis-cli –p 6739 -a 123456 shutdown #关闭服务
mv /tmp/appendonly.aof /data/redis/
vi /data/redis/redis.conf #确保服务开启
然后启动redis 查看数据同步成功
3.混合持久化(rdb+aof)
Vi /data/redis/redis.conf
aof-use-rdb-preamble yes # 开启混合模式(AOF文件前半段是RDB格式,后半段是AOF日志)
源目标主机:通过scp 远传rdb文件和aof文件到目标主机redis目录下
目标主机:停止redis服务
将rdb文件和aof文件导入正确目录下
启动redis服务
数据备份恢复完成