Redis
-
使用单线程的多路IO复用模型。多个socket可能会并发产生不同的操作,IO多路复用程序监听多个socket,将产生的事件放入队列中排队,事件分派器每次用队列中取出一个事件,交给对应的事件处理器处理
-
String,List,Hash,Set,ZSet 端口号:6379
-
过期时间:
- 定期删除:每隔100ms随机抽取设置了过期时间的key,检查是否过期
- 惰性删除:查询key时,检查是否过期,然后删除
- 内存淘汰:如果定期删除没删除掉,还未进行惰性删除,redis在内存耗尽后会出发内存淘汰
-
内存淘汰:
- lru:最近最少淘汰(allkey全部数据,volatile设置过期时间数据)
- ttl:将要过期数据淘汰(volatile)
- random:随机淘汰(allkey,volatile)
- no-eviction:不进行淘汰
- lfu:最不经常使用数据淘汰(allkey,volatile)
-
持久化机制:
- RDB:快照(在a秒后如果有b个key发生变化,创建快照)
- AOF:追加文件(每执行一条更改指令或每秒,追加到硬盘的aof文件)
- 混合持久化:aof重写时直接把rdb卸载aof文件的开头
-
缓存雪崩怎么办:
缓存一时间大面积的失效,所以后面的请求落到数据库,造成短时间承受大量请求崩掉
- 事前:选择合适的内存淘汰策略,尽量保证整个redis高可用性
- 事中:hystrix限流&降级,避免mysql崩
- 事后:利用redis持久化机制保存的数据尽快恢复
-
缓存穿透怎么办:
由于大量不在缓存中的请求导致请求直接落在数据库上
- 做好参数校验,不合法的参数直接抛出异常
- 缓存无效key,设置较短过期时间
- 布隆过滤器:把所有可能存在请求的值都放在布隆过滤器中,只相应其中的值
-
缓存击穿怎么办:
由于redis缓存过期导致在过期时间大量请求落在数据库上
- 使用Redis分布式锁,让对数据库的重复查询操作变为1次
- 使用jvm锁,每台数据库只查询一次
-
并发竞争key
多个系统对同一个key进行操作,执行顺序的不同导致结果不同
使用Redis、Zookeeper分布式锁
-
双写一致性
读请求和写请求串行到一个内存队列中,导致吞吐量大幅降低
-
主从复制
存数据库的为主服务器,可以是树形结构。只有主服务器可以进行写操作,所有从服务器进行数据同步。先全量复制(快照)再增量复制(aof)
-
哨兵模式
在主从复制的基础上,哨兵引入了主节点的自动故障转移。当出现故障时,通过投票机制选择新的master。哨兵会不断检查主节点和从节点是否运作正常,由一个或多个哨兵节点,不存储数据。
-
集群模式
数据分区将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis集群引入的hash槽,集群的每个分片负责一部分hash槽,每个分片又实现了主从复制
-
除了做缓存还可以实现什么功能?Session