标签:一段 基于 技术 默认 就是 获取 算法 计时 ring
redis是一种支持key-value等多种数据结构的存储系统,可用于缓存,事件发布,消息队列等场景,支持多种数据类型
string、hash、list、set、zset。而且基于内存,可持久化,并且能够通过sentinel哨兵和自动分区cluster实现高可用。
补充:redis中list集合是双端循环列表(双向列表),可以当作队列使用,也能当作堆栈使用。
redis的持久化策略有两种:
RDB模式:定期将内存中的数据进行持久化,实际上就是为内存做快照,备份速度快,但有可能会丢失少量的数据。
AOF模式:可以实时备份,安全性更好,但持久化速度较慢,AOF持久化文件的体积很大,数据恢复时需要耗费大量时间。
RDB模式是默认开启的,若两种模式同时开启优先采用AOF模式。
使用分片可以实现内存数据的动态扩容,每台redis节点中尽可能保存1/n的数据量,防止数据丢失。
缺点是若有一台机器宕机,则整个分片将不能正常运行。
分片中采用的hash一致性算法:
数据如何保存:
1.将节点的ip + 算法确定唯一哈希值,之后在内存中确定节点的位置
2.保存数据时,根据key进行hash运算,确定唯一位置
3.根据当前key的位置顺时针查找最近的node节点进行挂载
该算法的特性: 均衡性:引入虚拟节点,让数据均匀分片
单调性:如果node节点新增,能动态实现数据的迁移
分散性:数据分布在各个节点(解决方案:一般在进行架构设计时,为了避免数据的分散,会要求使用全部的内存空间)
原理:通过哨兵监控主机的状态,获取主机和丛机的信息,通过心跳检测机制,如果3次连接没有响应,则会断定主机宕机,哨兵会从丛机当中选举一台充当主机,
旧的主机修复完成后,会充当丛机等待下次选举。
脑裂: 因为选举机制投票平票导致出现多台主机称之为脑裂。
解决方案:增加节点的个数。
缓存穿透: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。
这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。
解决方案: 利用互斥锁,缓存失效时,先去获取锁,得到锁之后再去请求数据库,没有得到锁的就休眠一段时间。
Redis还有一个高级用法布隆过滤器(Bloom Filter)这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个
Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。
缓存雪崩:在高并发下,大量的缓存key在同一时间失效,导致大量的请求落到数据库上,如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。
解决方案:给缓存失效时间设置加上一个随机值,避免数据集体失效或者做缓存预热。
缓存击穿:缓存击穿是指一个Key,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。
解决方案:设置数据永远不过期。或者加上互斥锁就能搞定了,或者做缓存预热。
标签:一段 基于 技术 默认 就是 获取 算法 计时 ring
原文地址:https://www.cnblogs.com/lmqblogs/p/11811093.html