把数据存储在内存,极高的效率提供读写功能。配合sentinel实现主从,或者集群实现大数据和流量下的分布。redis
string list hash set zset算法
惰性删除:查询的时候发现过时,执行del,而后返回null。对内存不友好 按期删除:后台线程任务按期去删除过时key。对cpu不友好。 redis是采用惰性删除+按期删除,保证了内存和cpu的性能。数据库
RDB 生产RDB文件:对内存中的数据进行持久化 载入RDB文件:对未过时的数据恢复到内存中 save 会阻断用户操做。 bgsave不会阻断用户操做。 自动持久化能够配置时间,好比900秒,1次操做的时候进行、300秒60次操做的时候执行、60秒200次操做的时候执行。缓存
AOF 生产AOF文件:保存执行命令到AOF文件中。当过时key被惰性删除或者按期删除后,写入del key命令。 载入AOF文件:从新一条条执行AOF文件中的命令。 复写AOF文件:随着时间延长,AOF会愈来愈大,因此须要从新生成AOF文件。这种生成方式是经过读取内存中的数据,未过时的数据生成命令存在AOF中。服务器
对于主从模式,持久化数据恢复到内存中的时候,主会只会恢复未过时数据,从全部数据都会进行恢复,从没有惰性删除和按期删除,只会等待主来同步数据。网络
订阅key的操做 订阅某个操做的key并发
127.0.0.1 123 > slaveof 127.0.0.1 456 123成为456的从 全量同步:从向主发送SYNC,主生产RDB,同步给从,同时期间缓冲期产生的命令也同步给从。分布式
部分同步:从断线重连,向主发送PSYNC,主把断线后的命令发给从。复制偏移量高并发
命令同步:彻底同步或者部分同步完成后,主会把命令同步给从。性能
部分同步实现原理:主机器ID+偏移量+复制积压缓冲区
从会每秒一次发送心跳给主保持链接和传递偏移量
能够支持故障转移,从服务器中选出新的主。
setinel监控主,须要经过配置或者命令的方式指定。
setinel和主和从服务器进行链接的时候会建议命令链接、消息链接。
setinel和主创建链接以后,会经过主服务发送的信息获取到从服务器信息并与从服务器创建链接。
setinel经过主和从服务器信息发现其余setinel机器并创建命令链接。
setinel监控到主服务器下线以后,会询问其余setinel服务器是否赞成下线,赞成下线达到阈值则会进行下线。
sentinel如何发现主? 经过setinel配置初始化的主服务器
sentinel如何发现从? 经过主服务器给setinel回复的信息里面自动发现从服务器
sentinel如何创建链接? sentinel会分别创建命令链接和消息链接。
sentinel如何发现其余sentinel? 经过主从服务器发送的消息发现其余sentinel,而且相互创建命令链接。
sentinel如何选出领头sentinel 发现了主服务器下线的sentinel会相互询问,而且把本身做为局部领头。固然选出来的局部领头大于半数,则该局部领头成为全局领头来选举新主,并把从的主改成新主。
sentinel选举出新的主 根据必定规则从里面选出新的主,规则要求就是网络好,数据最新,数据最新经过偏移量发现,而后把主的角色改变。
sentinel把从的旧主改为新的主
sentinel如何发现服务下线? 经过每秒一次的ping命令,服务器没有回复pong达到必定时间认为下线。
sentinel选取领头就是经过raft算法实现的。
setinel可以支持主从,可是没法解决高并发下单机内存过大和qps过大的问题。这种状况下须要redis集群来解决 redis集群每台机器分配若干个槽,0-2的14次方-1个,每台机器负责若干个槽。经过对key的hash值取模计算的方式能得属于哪一个槽,也能得知属于哪一个机器,若是当前机器不是槽所属机器,则会经过move指令让客户端重定向到指定机器。
1.什么是二八定律 数据常被用到的只有20%甚至更少,针对这20%数据作优化效果更好,性价比更高。
2.如何经过redis实现分布式锁?
3.缓存穿透 场景:查询数据库中必定不存在的数据,致使请求直接落db。 解决方案:针对不存在的数据,缓存中存放null。也能够把可能存在的数据放入布隆过滤器,这样能过滤掉必定不存在的数据。
4.缓存雪崩 场景:大量数据缓存key集中过时,致使请求大量落入db 解决方案:缓存过时时间设置的时候增长随机数,热门的数据缓存过时时间能够长一点,冷门数据缓存过时时间短一点、
5.缓存击穿 场景:缓存中热点数据过时,瞬间大量请求落入db。 解决方案:热点数据永不过时,请求db的时候使用分布式锁。