目录
一、什么是Redis?
二、Redis如何实现高可用
三、缓存与数据库不一致问题
四、Redis持久化方式
五、6种淘汰策略
六、缓存穿透和缓存雪崩
七、Redis实现分布式锁
八、Redis.conf 配置文件详解
九、常用命令
一、什么是Redis?
Redis:C语言实现的、数据存储在内存中的、开源的、键值对(key-value)数据库软件。
1.它通过提供多种键值数据结构来适应不同场景下的存储需求,目前Redis支持的键值数据结构有:
- 字符串(String)类型
- 哈希(hash)类型
- 列表(list)类型
- 集合(set)类型
- 有序集合(zset)类型
- 位图(GEO)
- 基于概率的
Redis GEO:存储地理位置信息,并进行操作
Redis Stream:针对发布 / 订阅,它提供了消息的持久化 和 主从复制功能,能访问任何时刻的数据,并记住每个客户端的访问位置,保证消息不会丢失。
2.Redis的功能
- 缓存
- 分布式锁
- 数据持久化
- 消息队列
3.Redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品数据等等)。(最多使用)
- 任务队列(秒杀、抢购、买票等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
4.Redis 和 memcached区别
- 支持的数据类型、速度、持久化、灾难恢复
5.Jedis
- 是Redis 官方推荐的面向Java的客户端,提供了很多操作接口。
- redisson与Jedis区别:分布式,功能简单,不支持字符串、排序、事务、管道、分区等。
6.Spring-data-redis
- 是Spring大家族的一部分,提供了一个高度封装的 “RedisTemplate类”,对Jedis客户端中大量的API进行了封装。
二、Redis如何实现高可用
1.搭建集群:解决单机Redis内存资源有限的问题。
2.主从复制:一个主服务器和多个从服务器,从服务器中备份着主服务器的数据。使充分利用CPU、IO资源。主服务器可以进行读写操作,当发生写操作的时候自动将数据同步到从服务器,而从服务器一般是只读的,并接收主服务器同步过来的数据,达到读写分离。
主节点写,从节点 只能读
作用:数据备份、故障恢复、负载均衡、高可用
3.哨兵机制:负责监控、提醒、自动故障转移。
4.限流降级
5.数据预热:提前统计哪些数据需要频繁使用,启动时预加载进Redis
Redis集群(Master、Slave):最少 一主二从,默认情况下,每台Redis都是主节点。一般情况只配置从机(认老大)。
- 全量复制:重新连接到主机,同步操作 进行全量复制。
- 增量复制:都启动着,从机是增量复制
哨兵模式:自动选举 主节点
哨兵配置文件 —— sentinel.conf
三、缓存与数据库不一致问题
- 先删除 Redis,再写 MySQL,再删除 Redis(可重试)。
- 先更新数据库,再删除缓存。
- 并发场景下,可以将删除缓存、修改数据库、读取缓存等操作放到队列中,实现串行化操作。
四、Redis持久化方式
持久化:就是把内存的数据写到磁盘中去,防止服务器宕机导致数据丢失。
Redis提供的两种持久化方式:
Redis服务器默认开启RDB,关闭AOF;如果AOF开启,优先使用AOF
- RDB:默认,指定时间间隔对数据快照存储。
- AOF:每收到一个写命令都通过write函数追加到文件。将所有 写的操作命令 都记录下来,文件不断追加、文件会越来越大
RDB持久化:
1、触发机制
(1)满足 save条件。 save 60 1 :当时间到60秒时,如果redis发生了至少1次变化,则执行bgsave。
save命令会阻塞Redis服务器进程。
bgsave命令只有执行fork操作创建子进程会阻塞一会儿,子进程来负责创建RDB文件。
(2)执行 flushall 命令
(3)正常关机退出
都会自动生成一个dump.rdb
2、如何恢复rdb文件
把rdb文件 放到Redis启动目录,启动的时候就会恢复数据
config get dir //获取启动目录
五、6种淘汰策略
redis默认的内存淘汰策略是noeviction,内存不足时,写入直接报错
- volatile-lru:从设置了过期时间的数据集中,选择 最近最少使用的 数据释放;
- allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择 最近最少使用的 数据释放;
volatile-lfu:从设置了过期时间的数据集中,选择 访问频率最少 的数据进行淘汰
allkeys-lfu:从所有数据中选取 访问频率最少 的数据进行淘汰;
- volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放;
- allkeys-random:从所有数据中 随机选择 一个数据进行入释放;
- volatile-ttl:从设置了过期时间的数据集中,选择 马上就要过期的 数据进行释放操作;
- noeviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误。
相关算法实现:
(1)缓存过期淘汰算法:使用 HashMap 或者 concurrentHashMap实现。
(2)LRU算法 最近最少使用的 实现:按访问时间;继承LinkedHashMap = HashMap + 双向链表。重写removeEldestEntry()方法。
import java.util.LinkedHashMap;
import java.util.Map;public class LRUCache<K, V> extends LinkedHashMap<K, V> {public LRUCache(int initialCapacity, float loadFactor) {//accessOrder为true,表示双向链表中的元素按照访问的先后顺序排列super(initialCapacity, loadFactor, true);}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > initialCapacity * loadFactor;}
}
LFU算法 访问频率最少 实现:访问次数+访问时间;缓存对象里加个 访问次数字段,重写个compareTo方法。
六、缓存穿透和缓存雪崩
缓存穿透:大量查不到(布隆过滤器、设置空对象)
缓存击穿:量太大、缓存过期(设置热点数据永不过期、加分布式锁)
缓存雪崩:Redis宕机、缓存集体失效(Redis高可用)
七、Redis实现分布式锁
八、Redis.conf 配置文件详解
经常修改 端口、pid 名字、log 文件名、dump.rdb 名
- 网络:绑定的IP、端口设置、保护模式
- 通用:设置以守护进程方式后台运行、指定pid文件、日志级别、日志文件名、默认数据库数量16、是否显示logo
- 快照(持久化):Redis 是内存数据库,不持久化到磁盘 那么断电数据就会丢失。设置持久化条件(指定时间间隔)、是否压缩rdb文件、rdb文件保存的目录 (dump.rdb、 appendonly.aof)
- 主从复制
- 安全:设置密码
- 客户端限制:设置能连上Redis的最大客户端数量、配置最大内存、内存满了的处理策略(清理策略)
- AOF配置:默认使用rdb方式持久化、不开启aof模式,在大部分情况下rdb 完全够用。持久化文件名、同步 设置
九、常用命令
命令:
(1)ping
(2)config get requirepass
(3)config set requirepass "密码"
(4)auth 密码(5)config get dir //获取启动目录
(6)save / bgsave //会在Redis安装目录生成 dump.rdb文件,即备份文件。//后台创建备份文件
(7)redis-benchmark -n 1000 -q //同时执行1000个请求来检测性能(-c: 指定并发连接数)(8)info replication //查看当前主机信息(角色、从机数量)
(9)SLAVEOF IP 端口 //给从机配置主节点,关机失效。最好在配置文件配置
(10)SLAVEOF no one //主节点宕机,让自己变成主节点(11)publish / subscribe //发布订阅
dbfilename dump.rdb //配置RDB文件名
appendonly yes //开启AOF(持久化的主流方式,实时性更好)
appendfilename "appendonly.aof" //配置AOF文件名称