最全redis缓存核心知点(原理+图解)

redis缓存核心知点

      • 一、主流应用架构
      • 二、缓存知识考点
      • 三、多路I/O复用模型
      • 四、常用的数据类型
      • 五、消息队列
      • 六、Redis的持久化
        • 6.1 BGSAVE原理
        • 6.2 RBD持久化的缺点
        • 6.3 持久化方式之AOF
        • 6.4 AOF文件重写
        • 6.5 Redis数据的恢复
        • 6.7 RDB和AOF的优缺点
        • 6.8 RDB-AOF混合持久化方式(新版本的默认备份方式)
      • 七、Pipeline及主从同步
        • 7.1 Pipeline的简介
        • 7.2 redis的同步机制
        • 7.3 redis的主从同步原理
        • 7.4 全同步过程
        • 7.5 增量同步过程
        • 7.6 redis sentinel(redis哨兵)
        • 7.7 流言协议Gossip
      • 八、redis集群
        • 8.1 实现原理
        • 8.2 如何从海量数据里快速找到所需
        • 8.4 hash环的数据倾斜问题

一、主流应用架构

最全redis缓存核心知点(原理+图解)_第1张图片

  • 1.穿透查询,缓存层里没有客户端需要的数据,需要穿透缓存层,访问存储层。
  • 2.回种,穿透查询得到数据后,会回写到缓存层,以便下次同样的数据请求可以直接快速从缓存层返回。
  • 3.熔断,如果存储层挂掉或者不提供服务,直接可以从缓存层返回数据。

二、缓存知识考点

2.1 缓存中间件——Memcache和Redis的区别?

Memacache:代码层次类似Hash,简单易用。

  • 1.支持简单数据类型
  • 2.不支持数据持久化存储
  • 3.不支持主从
  • 4.不支持分片,分割数据进行存储

2.2 Redis:主流缓存中间件

  • 1.数据类型丰富
  • 2.支持数据磁盘持久化存储
  • 3.支持主从
  • 4.支持分片

2.3 从海量Key里查询出某一固定前缀的Key

首先,摸清数据规模,问清楚边界。

1.使用Keys对线上业务的影响,Keys pattern:查找所以符合给定模式pattern的key。

  • 1.KEYS指令一次性返回所有匹配的key。
  • 2.健的数量过大会使服务卡顿,对于内存的消耗、redis的服务都会有影响。

2.使用SCAN cursor [MATCH pattern] [COUNT count]

  • 1.SCAN指令可以无阻塞的提取出指定pattern模式的key列表,每次执行都只会返回少量元素,可以用于生产环境,不会带来阻塞服务器的问题。其中cursor为游标。
  • 2.基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。
  • 3.以0作为游标开始一次新的迭代,直到命令返回游标0万次一次遍历。
  • 4.不保证每次执行都返回某个给定数量的元素,支持模糊查询。
  • 5.一次返回的数量不可控,只能是大概率符合count参数。
  • 6.每次返回的是匹配到的数据和匹配到哪的cursor,返回的游标cursor不是递增的,因此会匹配到重复的值,需要外部程序(hash Set)进行去重。分批次遍历,因此花费的时间较keys更长。

2.4 业务:记录每个用户访问网站的次数?

方案:只需拼接用户id和当前日期(精确到日即可)的字符串作为key,每次用户访问该页面,对key进行一次incr操作即可。

2.5 如何通过redis实现分布式锁?

分布式锁是控制分布式系统访问共享资源的一种锁的实现。

分布式锁需要解决的问题:

  • 1.互斥性,任一时刻只能有一个客户端获取锁。
  • 2.安全性,只能由持有该锁的客户端删除。
  • 3.死锁,获取锁的客户端因为各种原因无法释放锁,而导致其他客户端不能获取锁。
  • 4.容错,

方法一:使用setnx、expire实现,当一个客户端A setnx返回1,表示获取锁。另一个客户B setnx返回为0,便会进行阻塞,直到调用expire设置key的生存时间,key过期()时,表示A释放锁。B setxnx返回为1,表示获得锁。虽然两个操作都是原子性,但是组合在一起就是非原子性。缺点:原子性得到不满足。

RedisServer redisServer = SpringUtils.getBean(RedisServer.class);
long status = rediServer.setnx(key,"1");
if (status == 1){
   
  redisServer.expire(key,expire);
  //执行业务
}

方法二:SET key value [EX seconds] [px milliseconds] [NX|XX](EX second:设置键的过期时间为second秒、px milliseconds:设置键的过期时间为milliseconds毫秒、NX:只在键不存在时,才对键进行设置操作,效果与setnx类似、XX:只在键已经存在时,才对键进行设置操作,效果与setnx相反、SET操作成功完成时,返回OK,否则返回nil)。

RedisServer redisServer = SpringUtils

你可能感兴趣的:(数据库,redis,队列,数据库,分布式)