概况
redis == remote Dictionary Server (远程字典服务)
基于内存的KV键值对内存数据库
作用:
-
分布式缓存,与MySQL共同配合
-
Redis -- 内存 MySQL -- 磁盘
-
Redis -- NoSQL MySQL -- SQL
-
-
内存存储 和 持久化(RDB+AOF)
-
Redis支持一部将内存中的数据写入硬盘
-
宕机 -- 可自行恢复
-
-
高可用:单机、主从、哨兵、集群
-
缓存穿透、击穿、雪崩
-
分布式锁
-
队列
优势:读写速度快(秒杀系统);数据类型丰富;可持久化;支持数据备份(主从)
启动 redis-server(启动redis服务器)
连接 redis-client (redis客户端)
redis-cli -a 111111 -p 6379
,其中 -a == auth 授权,-p == port 端口号
helloworld
Redis十大数据类型
-
String
-
List
-
Hash
-
Set 无序无重复
-
ZSet (Sorted Set)
-
GeoSpatial
-
HyperLogLog 基数统计 -- 淘宝首页点击率
-
bitmap Redis 位图 -- 01010111 -- 打卡记录
-
bitfiled Redis 位域 -- 多个比特位域
-
Stream Redis 流 -- 类似于:消息中间件
报错:
尝试重启 Redis
-
找到redis相关进程
ps -ef | grep redis
-
kill -9 2820
-
重启 redis-server 与 redis-cli
Redis持久化
redis -- 内存数据库 -- 断电/宕机 --》 持久化
RDB: Redis Database(数据快照)
AOF: Append Only File(依次追加)
RDB
自动保存:在配置文件中设置
手动保存:bgsave 和 save
save -- 采用主进程进行数据备份,阻塞其他服务
bgsave -- background save 新建一个进行数据备份,不阻塞其他服务
优点:RDB文件适合大规模恢复;灾难恢复;提高了Redis性能
缺点:突然断电,来不及保存
检查修复rdb文件
禁用快照:命令行方式 + 配置文件方式
stop-writes-on-bgsave-error
: bgsave出错时是否停止写入,default: yes
rdbconpression
: 存储到磁盘中的snapshot,是否进行压缩处理,default: yes
rdbchecksum
: 使用CRC64算法检验,以得到最大的性能提升,default: yes
rdb-del-sync-files
: 未执行持久化时,删除RDB文件,default: no
AOF -- Append Only File(依次追加)
概念:以日志的形式追加写操作,只记录 增删改 命令
在配置文件中,设置 开启 appendonly yes
AOF保存的是appendonly.aof
文件
三种写回策略
-
always:同步写回,IO操作多,资源耗费大
-
everysec:默认,每个1s进行写入
-
no(写入内存缓冲区,操作系统决定合适将缓冲区的内容写入磁盘)
AOF配置文件
-
修改为 yes
-
保存机制(是指三种保存机制)
-
配置 .aof 文件名(dir + dirname)
-
redis 7 -- base; incr; manifest(清单文件) 三种AOF文件
正常恢复
异常恢复:AOF文件错误,无法连接;redis-check-aof --fix filename
优点:三种写入策略(最差情况,丢失1s数据);追加日志;AOF文件可以自动重写机制(Log Rewritting);AOF文件易于理解和阅读+恢复(记录每一条操作,删除错误记录即可)
缺点:AOF文件大(记录每一条操作),同步相较于RDB慢
AOF重写机制
-
只保留可恢复的最小指令集
-
自动执行:配置文件(上次的大小1倍 && 文件大小64MB)
-
手动执行:
bgrewriteaof
RDB + AOF 混合持久化
两文件同时存在时,以AOF为准,恢复时加载AOF;若AOF不存在,则加载RDB
RDB:指定时间间隔;适用于备份数据库,快照;全量持久化
AOF:以操作记录保存到文件中;实时;增量持久化
纯缓存模式
只进行数据缓存,而不进行持久化
禁用RDB save ""
;禁用AOF appendonly no
;但仍可手动进行持久化存储
Redis 事务
一次操作执行一组命令,所有命令序列化(队列中),按顺序串行执行
discard, exec, multi, watch key, unwatch
-
正常执行:multi ...... exec
-
放弃执行:multi ...... discard
-
全部失败:
exec
前输入错误命令,全部失败 -
部分执行失败:
exec
后出现错误,则当前出错命令失败,其他成功 -
Watch 监控:(乐观锁)监控数据是否被修改;被监控的 key 修改,全部执行失败
Redis 事务 VS 关系型数据库事务:
-
事务一致性
-
无回滚操作
Redis 管道
解决RTT往返时间长,造成资源消耗较大的问题
操作步骤:
-
将命令写入
.txt
文件 -
执行
原生批处理命令 VS pipeline
原子性 非原子性
只能执行一种命令 可以批处理
服务端自身 服务端与客户端交互
pipeline vs 事务
非原子性 原子性
多条命令以批处理方式执行 多条命令以队列方式处理
不阻塞其他命令 会阻塞其他命令
Redis 发布订阅
发布 -- publishe;订阅 -- subscribe
轻量级队列,消息中间件
Redis 复制(replica)
Redis 哨兵(sentinel)
Redis 集群(cluster)
SpringBoot 集成 Redis
总体概述
Jedis(老项目使用) -- lettuce(采用一段时间后,被springboot整合) -- RedisTemplate(常用)