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…