柚子快报邀请码778899分享:缓存 redis简单总结

http://yzkb.51969.com/

数据类型

string、list、set、hash、zset

持久化方式

RDB:redis会单独fork一个子进程,每隔一段时间,将缓存中的数据写入一个临时文件中,持久化完成后,使用临时文件替换上一次持久化的文件 可以选择x秒内,y个key发生变化,执行保存

AOF:按照日志形式保存每一次写操作 可以选择,每产生一次写操作就保存、每秒保存一次、永不保存

性能高

基于内存 单线程(基于内存、CPU不是瓶颈、单线程实现简单、避免了多线程上下文切换) IO多路复用(事件驱动) 数据结构进行了优化

原子性

单线程模型、基于事务或lua脚本

事务

redis有事务,通过MULTI和EXEC命令实现

缓存一致性

延时双删策略:删除缓存1—>更新数据库—>删除缓存2,删除缓存2可能会存在失败情况,可以通过监听binlog日志尝试删除 设置过期时间

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

缓存击穿:一些设置了过期时间的key,在未来某一时间会被高并发的访问,但是在此之前过期了。导致大量的请求被发到数据库 解决方案:使用分布式锁 或 Zookeeper的临时顺序访问节点

缓存穿透:查询一个不存在的key,缓存不存在,去查询数据库,数据库返回null,但是缓存不保存null的key,当有大量的这种key进行查询是,可能会造成数据库挂掉 解决方案:使用布隆过滤器 或 不存在的key也放入缓存中

缓存雪崩:同一时间大量的key过期,导致大量请求发送到数据库,造成不可用 解决方案:key的过期时间加随机数,降低key的过期时间重复率

主从模式

redis单节点会造成单点故障,而且读写不能分离,服务器请求量比较大时,存在IO瓶颈 主从模式主要结构为一个主节点,多个从节点,从节点还可以有自己的从节点。通过复制功能,将主节点的数据同步到从节点。优点:读写分离;缺点:没有容错和恢复,主节点故障需要手动切换

哨兵模式

1、在主从模式的基础上,增加sentinel节点,解决主从模式不能容错和自动回复的缺点。 2、哨兵节点也存在单点故障,所以需要多个哨兵节点。 3、哨兵节点 每10s会向所有的主从节点发送INFO命令,用来及时发现从节点; 每2s向所有的主从节点发送自己的信息和监控信息,用来及时发现新的哨兵节点; 每1s向所有的主从节点和其他sentinel节点发送PING命令,用来检测节点是否存活。 4、当某个哨兵节点向主从节点发送ping命令后,在配置时间内未回复,则将此节点标记为主观下线,并通过is-master-down-by-addr命令询问其他sentinel节点是否是主观下线,当超过配置数量的哨兵节点都将此节点标记为主观下线后,此节点被标记为客观下线,如果此节点是主节点,INFO命令的频率由10s一次改为1s一次,然后进行故障切换。选出sentinel leader,由sentinel leader节点进行故障转移(一般会选择复制偏移量最大且优先级较高的从节点作为新的主节点),(通过发布订阅模式 或 slaveof命令)通知其他从节点更新主节点配置信息 5、对于客户端来说,链接redis集群时,首先连接的是sentinel节点,通过sentinel节点查询主节点的地址,当发生故障转移后,sentinel节点会将最新的主节点地址告知客户端

集群模式

哨兵模式下,写操作还是单机的、每个节点存储的数据相同、故障转移期间服务不可用 集群模式为去中心化、数据分片存储 推荐3主3从,采用虚拟哈希槽分区而非一致性hash算法,每个主节点维护一部分hash槽和对应的键值数据 目前比较成熟的集群方案实现: 客户端分片ShardedJedis:使用一致性哈希算法 代理分片Twemproxy: Codis:

数据过期清除策略

定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除 惰性删除:定期删除可能导致很多过期的key 到了时间并没有被删除掉。这时就要使用到惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且过期了,是的话就删除。

某个key过期后,定期删除没删除成功,也没再次去访问key(惰性删除也没生效)。大量过期的key堆积在内存中,导致redis的内存块耗尽,那么就应该采用内存淘汰机制。

内存淘汰策略

LRU(Least Recently Used)算法:最少使用,跟最后一次使用的时间有关; 在数据的头部记录了数据上一次访问的时间(24bit);需要进行数据淘汰时,会拉取N(可配置)个数据作为候选集合,删除最后一次访问时间戳最小的数据。以后在需要淘汰数据时,需要先挑选最后一次访问时间戳小于候选集合中最小时间戳的数据进入集合,如果达到了N,就进行删除

LFU(Least Frequently Used)算法:最不频繁使用,跟使用的频率(访问次数+访问时间段)有关 在数据的头部记录了数据上一次访问的时间(16bit)和访问次数(8bit) 由于可能一个数据以前被访问次数超级高以后不会被访问,造成使用次数很高,无法通过LFU淘汰,所以使用16bit来记录访问时间、8bit来记录访问次数。 随机采样N个key,检查递减时间,如果距离现在超过 N 分钟(可配置),则递减或者减半(如果访问次数数值比较大)。

volatile-ttl:在设置了过期时间的键值对中,移除即将过期的键值对。 volatile-random:在设置了过期时间的键值对中,随机移除某个键值对。 volatile-lru:在设置了过期时间的键值对中,移除最近最少使用的键值对。 volatile-lfu:在设置了过期时间的键值对中,移除最近最不频繁使用的键值对

allkeys-random:在所有键值对中,随机移除某个key。 allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。 allkeys-lfu:在所有的键值对中,移除最近最不频繁使用的键值对

柚子快报邀请码778899分享:缓存 redis简单总结

http://yzkb.51969.com/

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。