rewrite机制:
aof里存放了所有的redis 操作指令,当aof文件达到一定条件或者手动
1.bgrewriteaof命令都可以触发rewrite。
Redis Server接收到客户端发送的BGREWRITEAOF指令请求,如果当前AOF/RDB数据持久化没有在执行,那么执行,反之,等当前AOF/RDB数据持久化结束后执行AOF rewrite
2.自动触发的条件:
在Redis配置文件redis.conf中,用户设置了auto-aof-rewrite-percentage和auto-aof-rewrite-min-size参数,并且当前AOF文件大小server.aof_current_size大于auto-aof-rewrite-min-size(server.aof_rewrite_min_size),同时AOF文件大小的增长率大于auto-aof-rewrite-percentage(server.aof_rewrite_perc)时,会自动触发AOF rewrite.
eg:auto-aof-rewrite-percentage 100 (当前写入日志文件的大小超过上一次rewrite之后的文件大小的百分之100时就是2倍时触发Rewrite)
redis分布式锁
setnx:命令在设置成功时返回 1 , 设置失败时返回 0 。
incr : 原子递增。
多路复用
多路 I/O 复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
redis高性能高吞吐量的原因
1.内存操作
2.单线程
3.多路复用
redis过期策略
1.定期删除+惰性删除
定期删除,redis默认每个100ms抽查删除
惰性删除,get key时,看expire删除
都没删除走内存淘汰策略
2.内存淘汰策略
maxmemory-policy volatile-lru
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,新写入操作会报错
ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。
redis事务
watch->multi->exec/discard->unwatch
watch
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
事务执行条件
如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
如果在一个事务中出现运行错误,那么正确的命令会被执行。
运行错误示例:
由于之前已经设置key为字符串类型,当使用SADD命令时起了冲突,但是,命令的语法并没有错误,是可以执行的,在执行之后才能发现错误。所以,SET key 3 仍然可以执行。但是请注意,redis不支持回滚。
缓存穿透
不存在的key,大量的访问。
1.返回空值
2.使用布隆过滤器
https://baijiahao.baidu.com/s?id=1655304940308056733&wfr=spider&for=pc
引用:
https://blog.csdn.net/chengyan5812/article/details/100787487