数据结构:字符串、集合、hash、zset和set
底层数据结构:简单动态字符串、链表、字典、跳跃表、整数集合、压缩列表
简单动态字符串:开辟已知大小的空间。value被删除时,先不进行空间回收,惰性空间释放
链表:双端、五环、带链表长度计数器和多态
字典:采用hash数据结构,hash冲突的解决方案是链地址法
触发扩容的条件:
1、服务器目前没有执行BGSAVE命令或者BGREWRITEAOF命令,并且负载因子大于等于1
2、服务器目前正在执行BGSAVE命令或者BGREWRITEAOF命令,并且负载因子大于等于5
渐进式rehash:
扩容和收缩操作不是一次性、集中完成的,是分多次、渐进式完成的。
跳跃表:
整数集合:
压缩列表:
原理:压缩列表并不是对数据利用魔种算法进行压缩,而是将数据按照一定规则编剧在一定连续的内存区域,目的是节省内存
持久化:
持久化方式:RDB和AOF
RDB方式:(默认)
数据存储:二进制数据
AOF方式:(需要开启配置)
数据存储:命令操作
三种配置方式:
# appendfsync always
appendfsync everysec(默认)
# appendfsync no
Redis架构模式:
单机版:
特点:简单
问题:1、内存容量有限 2、处理能力有限 3、无法高可用
主从复制:
特点:1、master/slave角色 2、master/slave数据相同 3、降低master读压力在转交从库
问题:无法保证高可用,没有解决master写的压力
哨兵:
分布式系统中监控redis主从服务器,并在主服务器下线时自动进行故障转移。三个特性:监控、提醒和自动故障迁移
特点:1、高可用 2、监控哥哥节点 3、自动故障迁移
问题:主从模式,切换需要时间、丢数据
集群:
特点:1、五中心架构 2、数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布 3、可扩展性 4、高可用性
5、实现故障自动failover,节点直接统统gossip协议交换状态信息
redis slot槽点:16384个哈希槽
一致性哈希:
原理:0~2的32次-1的桶空间,通过hash算法银蛇到环上
虚拟节点:
解决的问题:服务器节点太少时,容易因为节点分布不均匀而造成数据倾斜问题
缓存穿透、缓存击穿和缓存雪崩
缓存穿透:
问题:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源
解决方案:1、布隆过滤器 2、将key缓存下来,并设置失效时间
缓存击穿:
问题:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到魂村,
这个时间大并发的请求可能会瞬间把后端DB压垮
解决方案:使用互斥锁(mutex key)。SETNX,只有不存在的时候才设置,可以利用它来实现锁的效果
缓存雪崩:
问题:当缓存服务器重启或者大量缓存在某一个时间段失效,这样在失效的时候,也会给后端系统带来很大压力
解决方案:使用锁或队列、设置过期标志更新缓存、未key设置不同的缓存失效时间
三种key过期策略:
定时删除:
含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,瑞key删除
优点:保证内存被尽快释放
缺点:
若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要花时间删除这些key
定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器长生),性能影响严重
惰性删除:
含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null
优点:删除操作只发生在数据库去除key的时候发生,而且只删除当前key,对CPU时间占用比较少
缺点:若大量的key在超出时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄漏
定期删除:
含义:每隔一段时间执行一次删除过期key操作
优点:
通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理“定时删除”的缺点
定时删除过期key--处理“惰性删除”的缺点
难点:
合理设置删除操作的执行时长和执行频率
缓存淘汰策略:
问题:内存空间用满,需要如何处理?
答:缓存淘汰策略
volatile-lru ->只限于设置了expire的部分,有限删除最近使用(less recently uesd, LRU)的key
allkeys-lru -> 所有key通用,随机删除一部分key
volatile-lfu -> 只限于设置了expire的部分,有限删除最少使用(less frequently uesd, LFU)的key
allkeys-lfu -> 删除所有的key
volatile-random -> 随机删除所有设置有效时间的key
allkeys-random -> 随机删除所有的key
volatile-ttl -> 删除过期时间最近的key
noeviction -> (默认策略)对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)