Redis总结

Redis总结

一.redis快的原因

1.redis的数据是存在内存中的

2.redis的线程模型为io多路复用模型。

将事件放到队列中,文件分派器将事件分发给事件处理器

3.单线程避免了上下文的切换

二.基本数据类型

string list set hash zset

三.持久化方式

rdb:n秒内M个个改动,会自动保存一次数据集
aof:

1.appendfsync always 每次有新命令都fsync一次 会追加到aof文件中

2.appendfsync everysec 每秒fsync一次

3.appendfsync no:从不 fsync ,将数据交给操作系统来处理

AOF重写

AOF文件里可能有太多没用指令,所以AOF会定期根据内存的最新数据生成aof文件

如下两个配置可以控制AOF自动重写频率

auto-aof-rewrite-min-size 64mb   //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
auto-aof-rewrite-percentage 100  //aof文件自上一次重写后文件大小增长了100%则再次触发重

当然AOF还可以手动重写,进入redis客户端执行命令bgrewriteaof重写AOF
注意,AOF重写redis会fork出一个子进程去做,不会对redis正常命令处理有太多影响

redis4.0支持混合持久化
开启混合持久化后,redis会在rewrite的时候,会将这一刻之前的内存的数据做rdb快照处理
。将rdb快照内容和增量的aof存在一起,都写入新的aof文件中。所以在redis重启的时候,可以先
加载rdb文件再重放增量的aof日志

四.主从集群哨兵

主从

1.全量负责
slave节点会想master节点发sync命令,master收到命令后,会通过bgsave生成最新的rdb快照
持久化期间,把这段时间修改数据集的请求缓存在内存中,等持久化完毕后,master会把这份rdb文件
发送给slave,slave接收到后,加载到缓存中,然后master在把之前放在内存中的命令发送给slave.

2.增量复制
2.8 增量复制之后master和slave断开后支持部分负责2.8版本之后master会在内存中创建一个负责数据的队列,用来缓存一段时间内的数据。master和slave都会维护复制的数据的下标offset和master进程的id当网络断开连接后,slave会请求master继续进行未完成的复制,。如果offset太旧不在master的缓存内,或者master进程的id改变了会进行一次全量复制。

集群

/redis‐cli ‐c ‐h ‐p (‐a访问服务端密码,‐c表示集群模式,指定ip地址和端口号)
/usr/local/redis‐5.0.3/src/redis‐cli ‐a mypassword ‐c ‐h 11.22.33.44 ‐p 8080

集群选举原理
当slave发现自己的master变成fail状态后,会进行选举 如下:
1.将自己记录的集群currentEpoch +1,并进行广播
2.其他节点收到消息后,只有主节点会响应,回条ack的消息,对每个epoch只会发一次
3,slave收到超过半数master的ack后会变成新的master

哨兵

哨兵架构下,客户端第一次访问,从哨兵中找出redis的主节点,后续直接访问这个主节点,如果
redis主节点发生变化,哨兵会将新的主节点通知给client端。

五.高并发下可能会产生的问题

缓存穿透:查询一个根本不存在的数据,导致每次都要查存储库
解决方案:
1.缓存空对象 cache.set(key, storageValue)
 if (storageValue == null) {
 cache.expire(key, 60 * 5);
 }
2.布隆过滤器
布隆过滤器就是一个大型的位数组和几个不一样的无偏 hash 函数。所谓无偏就是能够把元素的 hash 值算得
比较均匀。

缓存失效:由于大批缓存同时失效可能会导致大量请求这时候全都达到db上
1.失效时间设置为过期时间+一个随机值
2.查询同一个key时加锁,使得只有一个请求能进来,其他的等一会。

缓存雪崩:缓存雪崩指的是缓存层支撑不住或宕掉后, 流量会像奔逃的野牛一样, 打向后端存储层

  • 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
  • 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
  • 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据

六.redis过期键清除策略

1.惰性删除:当get 一个已经过期的key时,会直接删掉这条数据
2.定期删除: redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,过期就删除
当已用内存超过maxmemory时会走内存淘汰机制
noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值