Redis学习

1,数据存储概况
redis是内存数据库,数据结构数据库,kv数据库
内存数据库(性能出色,容量限制于物理内存):
在这里插入图片描述
redis特点
1,单线程的(文件事件分派器队列的消费是单线程的,4.0后有了多线程概念(多线程删除对象),6.0在网络ID处理方面上了多线程,执行命令的核心模块还是单线程)
2,性能出色;
3,支持丰富的数据类型;
4,支持事务。都是原子操作;

Redis支持主从模式
分布式读写分离模型:master用来插入数据,slave提供检索服务。为了避免masterDB的单点故障,集群一般采用两台masterDB做双机热备(备份机心跳诊断工作机运行状况,出现异常则主动接管工作机的工作)或者重新选举新的master节点。
缺点:密集写的场景不适合使用。

哨兵模式:在主从的基础上实现了自动化的故障恢复。
节点分为哨兵节点(特殊的redis节点,不存数据)和数据节点。
应用服务真正交互的是哨兵集群,这样的话,一旦redis集群master出现问题,从节点顶上来,应用服务是无感知的。
优缺点:
1,主从可以自动切换,系统更健壮,可用性更高;
2,当哨兵节点发现redis节点出现问题,可以通过API脚本通知管理员或者上层应用程序。

集群模式:集群的键空间被分割成16384个hash槽,通过hash的方式将数据分到不同的分片上(无中心结构,每个节点和其他节点相连)。

回收策略(内存数据集达到一定大小的时候就会实行数据淘汰策略):
从已设置过期时间的数据集中挑选最近最少使用的数据淘汰;
从已设置过期时间的数据集中挑选将要过期的数据淘汰;
从已设置过期时间的数据集中任意选择数据淘汰;
从数据集中挑选最近最少使用的数据淘汰;
从数据集中任意选择数据淘汰;
禁止淘汰数据。

性能问题
1,master写内存快照:会阻塞主线程工作。
2,master AOF持久化:master最好不做任何持久化工作,如果数据重要,在某个slave开启AOF持久化,策略每秒一次。
3,主从复制的性能问题:集群节点最好在一个局域网。(主从复制最好不用图状结构,采用单链表,如果master(首节点)挂了,直接将第二个节点设为主节点)

适合场景
1,会话缓存;
2,全页缓存;
3,队列(list实现);
4,排行榜/计数器;
5,发布/订阅。

数据持久化
RDB:在某个时刻(三种机制)生成数据快照,进行保存。
三种机制:
1,save触发(会阻塞redis服务器);
2,bgsave触发(创建子进程,异步生成快照数据,快照同时还可以响应客户端请求);
3,自动触发(修改配置文件redis.conf)
优缺点:
1,文件紧凑,全量备份(适用于备份和灾难恢复);
2,异步数据快照;
3,恢复大数据集时比AOF更快;
4,子进程共享父进程的内存,父进程修改内存时子进程不知道,所以在持久化期间修改的数据不会被保存,导致丢失数据。

AOF:将每一个收到的写命令通过write函数追加到文件(AOF文件)中,重启时再次执行AOF文件恢复数据。
问题:持久化文件会越来越大,redis提供了bgrewriteaof命令,将内存数据以命令的方式保存到临时文件中,使用子进程来将文件重写。
三种触发机制:
1,每次修改同步:性能差,数据完整性好;
2,心跳同步(异步操作,可能存在数据丢失);
3,不同no:从不同步;
优缺点:
1,更好的保护数据;
2,AOF文件没有任何磁盘寻址的开销,写入性能高,不易损坏;
3,文件重写不影响客户端读写操作;
4,适合做紧急恢复。
5,AOF文件通常比RDB快照文件更大;
6,AOF开启后写QPS(每秒处理多少请求)会变低(AOF一般配置成每秒同步一次);

数据结构数据库
支持的类型:string,list(双向链表),set(集合),zset(有序集合),hash
注:set一般用来做交并差集,做好友推荐;zset(跳表)一般用来做排行榜。

在这里插入图片描述

zset结构(跳表):多层级有序链表。
通过增加层级提升搜索效率(类比二分查找:在有序数组中每次排除一半的方式进行查找,而链表不能直接这样取一半,所以增加多层结构,用空间换时间来实现)

B树,B+树:多路平衡搜索树
应用:数据库索引(数据库充分利用了磁盘块的原理,数据存储是采用块的形式,每个大小4k,每次IO进行数据读取时,同一个数据块的数据可以一次性读出来。把节点大小限制在磁盘块数据大小,而多茬会降低树的高度,减少IO次数,提高性能)
特点:1,B+树的非叶子节点不存储关键字记录的指针,只进行索引,大大增加节点关键字的数量。
2,每次查询次数都一样(关键字记录的指针都保存在叶子节点)。
3,非叶子节点的子节点数=关键书树
区别:1,B+ 树层级更少,查询更快(特点1);
2,查询更稳定(特点2);
3,排序功能,所有的叶子节点构成一个有序链表,在查询大小区间的数据时更方便,数据进密度很高,缓存命中率比B树高;
4,全节点遍历更快(只需遍历叶子节点)

分布式锁:
加锁过程就是通过Set nx指令来设置值,成功就返回(持有锁),否则循环等待,可以加过期时间,时间一到仍未获得锁则获取失败。删除key值就会释放锁。
重入锁:也叫作递归锁,指的是同一线程内,外层函数获得锁后,内层递归仍可以获取到该锁。
获取:如果获取不到,判断是不是自己的锁,如果是就再次获得锁,并且计数加一;
释放:不能直接释放锁,计数不为0则需要减一,如果为0则释放锁。

缓存穿透:(类似Dos攻击,拒绝服务)一般缓存系统都是按照key值进行查询,如果不存在就去后端系统查询,大量恶意请求一些不存在key的请求操作对后端系统造成很大的压力。
避免方法:
1,对查询结果为空的情况也进行缓存,缓存时间设置短一些;
2,对一定不存在的进行过滤。

缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。
避免方法:
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期
3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值