关于Redis详细的了解
1 什么是redis
redis是一款用C语言开发以键值对形式存储数据的非关系型数据库
2 redis的优势
性能高 丰富的数据类型 丰富的特性
3 redis的使用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
4 redis的5中数据类
字符串
hash 散列
list 链表
set 集合
zset 有序集合
5 redis持久化
5.1 持久化 将缓存中的数据保存到磁盘中
5.2 redis提供了两种持久化解决方法 Rdb Aof
5.3 Rdb存储
1 在配置文件我们默认Rdb是默认的持久化方式
2 默认的文件名称 dump.rdb
[dʌmp]
3 rdb保存机制
15分钟 修改过1次
5分钟 修改过10次
1分钟 修改过1万次
4 rdb方案的数据存储过程
Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入到硬盘中的临时文件;
当子进程写入完所有数据后会用该临时文件替换旧的RDB文件。
6 Rdb问题
1 一旦redis非法关闭,当数据不符合快照条件时,数据会丢失
2 如果数据不重要,则不必要关心。
3 如果数据不能允许丢失,那么要使用aof方式。
解决方案—手动快照
可以通过SAVE和BGSAVE命令来手动快照,两个命令的区别是前者是由主进程进行快照,
会阻塞其他请求,后者是通过fork子进程快照操作。
7 rdb 存储数据的格式
rdb存储的数据默认是压缩过的数据 ,配置文件中默认属性 rdbcompression yes
8 主从复制
1 为什么使用主从机制: 为了避免单点故障 ,构建读写分离架构,满足读多写少的应用场景
2 redis 主从 主要有 主从复制 主从从复制 目前后者是更好的一种解决方案
3设置主从的操作有两种方式
方式1 在redis.conf中配置 主机 slaveof
方式2 通过slaveof 这是一种临时行为
4 主从复制 主机进行写操作 从机进行读操纵且只能进行读操作
9 哨兵
9 1什么是哨兵
它是一个独立的进程,主要作用是对Redis的系统的运行监控
2 主要功能
监控主数据库和从数据库是否运行正常;
主数据出现故障后自动将从数据库转化为主数据库;
3 多哨兵
多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。
4 从机
从机宕机,哨兵会监控到,并输出日志,
从机之间通过PINGPANG机制半数以上也可以判断出该从机宕机,因此不再同步数据到该从机中
运维人员通过日志等可以第一时间 看到指定节点的从机宕机,那么会修复从机并重亲启动,启动后的从机
会从新加入到集群中,自动完成数据的同步;
5 主机宕机
哨兵监测到主机宕机(6379),会尝试恢复故障
投票选举哨兵的leader
leader选中一个从机(6381),向从机发送 slave of no one 指令,断开主从连接,
将6381升级为master,设置其他从库6380设置为6381的从库
当6379故障恢复重新启动,
将设置为新master6381的从库,同步主库的数据,替换原来的rdb文件
10 redis集群
10.1 redis3.0 之后出现了集群,每个节点并不是存储所有的数据的,这样会出现木桶效应;
10.2 我们采取优化策略是将16384个哈希槽均匀的分布在各个节点中,比如 有3个节点那么 0-5000的哈希槽分布在1节点 5000-10000分布在2节点,其余的分布在3节点
10.3 那么存放的数据如何存入到指定节点中呢?我们需要将存入的key进行crc16算法计算出结果,该结果在与16383求余,最终值一定会得到一个0-16383的值,该值假设是
1500,则该数据将被存入节点1;
10.4 新增节点
配置文件中设置 新节点为master 的slave以及新的端口 6382
手动查询节点情况,发现没有新的槽点,
我们手动将其中一个子节点的曹位分配给新节点,比如将6379的1000个操作分配给新节点
10.5 移除节点
第一步 将这个节点上的所有插槽转移到其他节点上
第二步 使用redis-trib.rb删除节点
11Redis事务
11.1 什么是redis事务
redis事务保证了一组指令在操作时,不被其他操作打断,不能实现某个指令出错,所有的操作回滚;
11.2 redis事务的指令
multi :表示事务的开始
指令1...
指令2....
指令3....
exec: 表示事务的执行
11.3 事务的异常
异常1 可能是内存不够,事务被放弃执行
异常2 语法出现错误,redis可以对语法错误进行检测,显示错误信息的
异常3 如果事务中有部分指令是正确,有部分指令执行后出现错误,redis不会执行回滚操作
12 Jedis在项目中的使用步骤
1.环境搭建
2. 引入Jedis的jar包
3. 建立redis客户端实现类
4. 托付给Spring管理
5.业务逻辑中添加缓存
13 Redis 内存淘汰机制
内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。
Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:
1) noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。 (better)
2) allkeys-lru:在主键空间中,优先移除最近未使用的key。 (better)
3) volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。 (better)
4) allkeys-random:在主键空间中,随机移除某个key。
5) volatile-random:在设置了过期时间的键空间中,随机移除某个key。
6) volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除 (better)
14 redis的穿击
当查询的key在redis中不存在时,我们会去查db,
这种情况如果用户有恶意攻击行为,比如用一个不存在的商品分类去查询redis,必定查不到
这样会触发大量的数据库查询操作,造成数据库很大的并发压力,这种情况称为缓存穿击或缓存穿透,
解决方案: 对第一个查询redis没有并且数据库也没有的key,在redis中设置次key的空值的数据,即可解决
15 Redis雪崩
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
在项目的监控系统中,可以监控一下key的生效和失效时间
代码 redisTemplate.opsForValue().set(“command_”+id, command,10,TimeUnit.SECONDS);
调用监控系统给的接口, redisControlService.saveExpireTime("command_"+id,10,TimeUnit.SECONDS);----见数据保存到 redisinfo(id,key,time,timenit,updatetime,opId)
在我们的监控的系统中会添加一个菜单-----缓存数据管理-----点击菜单会分页显示redisInfo表里的数据 缓存数据的Key 缓存时间 更改时间 更改人
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)