redis复习

redis
介绍
redis属于nosql,基于内存(速度快),采用单线程(避免多线程上下文切换的开销),Redis是基于单Reactor模型来设计的事件处理模型,使用IO多路复用技术来监听来自客户端的大量连接。
Redis默认16个数据库,默认使用第0个
注意:redis实例中执行命令模块是单线程,但redis实例中还包含其他模块,模块是多线程的
使用场景
缓存
分布式session
计数器(通过incre来加1,且因为单线程不会出现高并发带来的问题)
消息队列(发布订阅)
排行榜(zset)
数据类型
五种基本数据类型
String字符串(可用于计数器,缓存等)
Hash(本质跟String类似,key-value形式,hash多用于对象存储,String多用于字符串存储(因为String存储序列化后的值,对象这些获取还需要反序列化,效率没有hash高))
List列表(底层是链表。可以当作栈,队列,阻塞队列来使用)
Set集合(值不重复,可以用于且交集,如共同好友等)
ZSet有序集合(相对Set多一个值,ZSet会根据该值排序,可用于排行榜之类的)
ZSet底层
ZSet底层是 压缩列表+跳表。一开始采用压缩列表,当元素个数超过128或者大小大于64字节(可配置),使用跳表。
压缩列表:跟数组类似,只是压缩列表每个元素空间大小不是固定的,通过在每个元素前记录它的长度来实现查找,从而节省内存空间。(由于数组为每个元素分配空间固定,redis可以存储不同数据类型就会导致一些元素的空间并没有占满,浪费内存。所以引出了压缩列表)
跳表
定义:首先是一个有序链表,然后添加多层索引,每层索引数下一层的一半(间隔),使其具有二分查找的功能,各项操作时间复杂度O(logn)
时间复杂度推导:对于具有n 个元素的链表,共logn +1层(进位取整)。因为上一层相对下一层,隔一个取一个元素,大约为下一层的一半,所以总的来说类似二叉树的高度。
1. 删除元素:删除每层该元素。2. 插入元素:对于插入元素建几层索引层数,采取抛硬币的形式。(经过多少次才抛到反面就建多少层索引)
三种特殊数类型
Geospatial(可以添加地理位置(经纬度),可以计算两地间的距离,或者查找某地周围元素,它底层是ZSet,可以使用ZSet相关命令操作Geospatial)
Hyperloglog(可以求并集,可以用于统计网站访问量(同一个用户算一次访问),占用固定12kb内存,就可以统计2^64用户量,有0.81%错误率。如果不允许出错,可以使用set或自定义数据类型)
Bitmap(位存储,只有0,1两个状态,用于统计两个状态的信息,如活跃,不活跃。如使用bitmap记录员工一年打卡记录,可以很快算出打卡天数)
事务
单条命令保持原子性,redis事务是一组命令的集合,不保证原子性(其中异常命令如1除0抛出异常,其他命令正常执行)。命令本身有错事务执行失败。
Redis事务中的监控Watch(乐观锁)
悲观锁:每次修改数据先上锁
乐观锁:先修改数据(还未提交),更新数据时判断是否有人改过该数据,改过就不执行。Redis中watch就是乐观锁。(先监控一个数据,在开启事务,加入命令,执行时判断监控数据是否被修改,修改就会导致执行事务失败)
持久化
含义
redis是内存数据库,如果不将内存中的数据保存到磁盘,一旦出现如断电情况,数据就会丢失
aof
定义:将所有执行过的写命令记录下来,恢复的时候再全部执行一遍(aof默认不开启)
触发机制
配置文件中可以设置
appendfsync always # 每次修改都会 sync。数据完整,但消耗性能
appendfsync everysec # 每秒执行一次 sync,可能会丢失这1s的数据!
appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快!
执行flushall命令
退出redis时
优缺点
优点:如果每次命令都同步,数据完整性会很好
缺点:效率比rdb慢
rdb
定义:在指定间隔内将内存中的数据集快照写入磁盘,恢复时直接读到内存中()
触发机制
配置文件中的Sava规则满足时(如save 900 1表示900秒内,有至少1个内容修改就进行持久化操作。)
执行flushall命令
退出redis时
优缺点 
优点:效率较高,适合大规模数据恢复
缺点:因为是一定间隔时间进行复制,所以数据可能不完整
分布式
发布订阅
含义:是一种消息通信模式,通过一个字典实现,字典键就是一个个频道,字典值就是一个链表(保存所有订阅了该频道的客户端)。比如在某个频道发布一个消息,频道所对应链表的所以客户端都能收到消息。
主从复制
含义
一个主节点,多个从节点,数据复制只能从主节点到从节点,主节点master写为主,从节点slave读为主。可用于数据的备份和恢复,负载均衡(读写分离)。
相关说明
复制原理:每次从机重新连接主机都会进行一次全量复制,正常情况都是进行增量复制(只复制主机中新增加的数据)
如果主机宕机了,可以手动使用slaveof no one让自己变成主机(手动太麻烦,后面引入哨兵模式)
哨兵模式
原理
主机宕机后,自动从从机中选择主机(哨兵是独立的进程,用于监控每个reids服务器是否正常运行。如果发现主机宕机后,就会选择一个新的主机,然后通过发布订阅模式通知其他的从机让他们切换主机)
多哨兵模式
哨兵也可能宕机,所以一般也有多个哨兵,当一个哨兵认为主机服务器不可用时,成为主观下线。当发现主机不可用的哨兵到达一定值时,就会进行failover故障转移操作,通过投票选择一个新的主机。
优缺点
优点:主从复制的优点他都有,自动切换主机更加健壮。
缺点:在线扩容。多哨兵配置麻烦。
缓存问题
缓存穿透
定义
在缓存中查不到,数据库也查不到,大量请求都在持久层数据库时,就造成了缓存穿透。
解决方案
布隆过滤器:一种数据结构,对所有可能查询的参数以hash形象存储,查询前先过滤不符合的查询请求。
缓存空对象:持久层数据库查不到时,将返回的空对象也缓存起来,并设置一个过期时间,后面查询这个值时,就会在缓存中获取了,减少持久层数据库的压力(数据一致性有影响)
缓存击穿
定义
在某个热点key过期的瞬间,大量该值的请求在缓存中查不到,都会涌入数据库。
解决方案
热点词不过期
 加互斥锁:使用分布式锁,对每个key同时只有一个线程去查询,其他该key的查询等待。
缓存雪崩
定义
在某个时间段,缓存集中过期,或者reids宕机。
解决方案
redis集群
加互斥锁:使用分布式锁,对每个key同时只有一个线程去查询,其他该key的查询等待
数据预热:正式部署前,将可能大量访问的数据先访问一边,让它加载到缓存中去。
数据一致性(持久层和缓存数据同步)
定义
如正常情况:A先修改完数据库–>A修改缓存–>B修改数据–>B修改缓存。(可能发生:A先修改完数据库–>B修改数据–>B修改缓存–>A修改缓存)
解决
加锁(影响效率)
同步删除:修改数据库后删除缓存(问题:1. 并发场景(a线程查,初始缓存空,然后从数据库查,还没来得及写缓存,此时b线程更新数据,然后删除缓存过后a线程才写入缓存,这时缓存为脏数据。)。2. 缓存删除失败的时候)
延迟双删:删除缓存,修改数据库,延迟一会再删除缓存(问题:1.延迟需要时间,高并发场景性能较低。2. 在读写分离情况下,由于数据同步需要时间,从库可能读到脏数据)
利用MQ异步重试机制:保证缓存删除成功,实现最终一致性即可。(问题:耦合性比较高,每个修改数据地方都需要发消息到MQ。解决:通过主从复制机制,mysql从机监听binlog日志,发生修改时再发消息到MQ)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值