精通redis缓存从入门到实战

237 阅读4分钟

1、redis的数据类型

是一个键值(key=>value)对集合

2、redis的单线程还是多线程

redis的单线程

3、redis的五种数据类型应用的场景

3.1、String-字符串

底层:int,embstr,raw

应用场景:

缓存功能

计数

共享session

限速

3.2、Hash-哈希

底层:ziplist(压缩列表)、hashtable(哈希表)

应用场景:

存储用户信息

3.3、List-列表

底层:ziplist(压缩列表)、linkedtable(链表)

应用场景:

消息队列

文章列表


3.4、Set-集合

底层:intset(整数集合)、hashtable(哈希表)

应用场景:

标签


3.5、Zset-有序集合

底层:ziplist(压缩列表)、skiplist(跳跃表)

应用场景:

排行榜

 

4、redis缓存穿透、缓存击穿、缓存雪崩

4.1、redis缓存穿透

  缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。

解决方案:

4.1.1、 缓存空对象

       缓存空对象:是指在持久层没有命中的情况下,对key进行set (key,null)

       缓存空对象会有两个问题:第一,value为null 不代表不占用内存空间,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象

4.1.2、 布隆过滤器拦截

        在访问缓存层和存储层之前,将存在的key用布隆过滤器提前保存起来,做第一层拦截,

4.2、缓存雪崩

  由于缓存层承载着大量请求,有效地保护了存储层,但是如果缓存层由于某些原因不可用(宕机)或者大量缓存由于超时时间相同在同一时间段失效(大批key失效/热点数据失效),大量请求直接到达存储层,存储层压力过大导致系统雪崩。

4.3、缓存击穿

解决方案:

4.3.1、 缓存空对象

       缓存空对象:是指在持久层没有命中的情况下,对key进行set (key,null)

      缓存空对象会有两个问题:第一,value为null 不代表不占用内存空间,空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。第二,缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象

4.3.2、布隆过滤器拦截

        在访问缓存层和存储层之前,将存在的key用布隆过滤器提前保存起来,做第一层拦截,

解决方案: blog.csdn.net/womenyiqila…

5、redis分布式互斥锁

 永不过期

 

6、redis的分布式锁

 实现的详情:zhuanlan.zhihu.com/p/148411382

7、redis的事务

 

5、Redis的高可用

5.1、redis分布式事务的原理

 

5.2、Redis的集群

主从模式: 可以实现读写分离,数据备份。但是并不是「高可用」的

用户可以通过 SLAVEOF 命令或者配置的方式,让一个服务器去复制另一个服务器即成为它的从服务器。

哨兵模式: 可以看做是主从模式的「高可用」版本,其引入了Sentinel对整个Redis服务集群进行监控。但是由于只有一个主节点,因此仍然有写入瓶颈。

Cluster模式 :redis cluster采用无中心结构,节点间使用gossip协议进行通信。不仅提供了高可用的手段,同时数据是分片保存在各个节点中的,可以支持高并发的写入与读取。当然实现也是其中最复杂的。

5.3、Redis的数据一致性如何保证?

6、redis高并发具备的注意事项

7、redissession

8、一级缓存以及二级缓存的实现

9、redis怎么实现mq的功能

redis中已经实现了publish-subscribe,订阅者(Subscriber)可以订阅自己感兴趣的频道(Channel),发布者(Publisher)可以将消息发往指定的频道(Channel),正式通过这种方式,可以将消息的发送者和接收者解耦。另外,由于可以动态的Subscribe和Unsubscribe,也可以提高系统的灵活性和可扩展性。

10、缓存实践

10.1、秒杀系统如何设计

10.2、redis的排行榜实现思路

 利用Zset-有序集合, blog.csdn.net/m0_37459380…

10.3、redis更具不同的数据类型入不同的db,怎么实现的

10.4、redis线程池