redis总结

Redis的过期策略  默认直接报错  LRU(最近最少使用) random随机 ttl根据过期时间进行淘汰  LFU最长时间没有使用过的数据清理掉(但是偶尔使用就会侥幸一直存在)
AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
save 900 1 如果900秒内有1条Key信息发生变化,则进行快照  出发的是bgsave
save 阻塞主进程,不接受外界请求
bgsave fork子进程,只是创建时阻塞 但是更消耗内存
rdb存在丢失数据的风险性!!!    bgsave判断是否有子进程,有返回,无fork子进程创建rdb,dump文件
aof appendonly  no系统决定多久写回磁盘  Everysec1秒 always马上写回磁盘  append加入到aof_buf中,指定策略flush到aof文件中,定时rewrite重写压缩文件

主从模式,主节点挂掉就没了  slave通过sync向master发送同步请求,第一次全量,后续增量
哨兵Sentinel模式,Sentinel没秒一次ping,如果一次认为主观下线,其他监视这个master的Sentinel同步判断就认为下线,选举其他为master
集群模式cluster

主节点挂了,Redis分布式锁可能会有哪些问题呢? 
分布式锁算法:Redlock 当且仅当超过一半(N/2+1,这里是5/2+1=3个节点)的Redis master节点都获得锁,
可能获取到的锁信息还没同步到slave,所以这个锁可能多个获取 主从

MySQL与Redis 如何保证双写一致性
1.先删除缓存,再更新数据库,休眠一会(比如1秒),再次删除缓存    可能更新久,还是老数据,如果第二次删除缓存失败呢,脏数据,就只有等过期了。
2.删除尝试机制,可以循环或者中间件
3.读取biglog异步删除缓存  采集binlog代表更新好了删除缓存。

set key value nx|xx  px|ex time原子操作 
jedis内部封装 但是不能控制过期时间  看门狗10秒一次
redisson  看门狗watch dog 续签  lock.lock(); 与 lock.tryLock();  方法如果带有入参,则不会执行看门狗模式,即不会分布式锁续时。 默认的加锁时间为 30s 就是害怕业务时间太长!!
事务
watch指令类似于乐观锁,在事务提交时,如果watch监控的多个KEY中任何KEY的值已经被其他客户端更改,则使用EXEC执行事务时,事务队列将不会被执行
redis事务不保证隔离性和原子性 
批量操作在发送 EXEC 命令前被放入队列缓存,并不会被实际执行!!
multi  exec  discard  unwatch 
编译性错误),则执行EXEC命令时,所有命令都不会执行
运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

hashmap的时间复杂度 1 n logn 数据 链表 红黑树

explain 结果字段 id table partitions分区
select_type 表示的执行计划的对应的查询是什么类型,常见的查询类型主要包括普通查询simple、联合查询union以及子查询PRIMARY等
type ref命中的索引是二级索引不是唯一索引 联合索引的最左侧 range  Index与ALL 其实都是读全表,区别在于index是遍历索引树读取
possible_keys key key_len
rows列显示MySQL认为它执行查询时必须检查的行数。行数越少,效率越高!
iltered 这个是一个百分比的值,表里符合条件的记录数的百分比
extra 额外信息 Using index temporary where filesort

redis zookeeper kafka es mysql集群 seata 分布式锁
string 底层都是字节数组形式存储 SDS(len capacity大小 flag content数组byte)
hash hset key filed value   value只能存储字符 就是一个hashmap结构
list  朋友圈点赞列表,评论列表  双向压缩链表ziplist+quicklist最前节点(包含头节点和尾节点指针+总个数)  3.0结构  所以时间复杂度是o1 解决了之前的链表碎片化内存,zplist可存多个值
set sadd   hashtable底层
zset 实现排行榜 每个value赋予一个score权重,用来实现排序    zset组合了hash和skipList跳表    时间复杂度为O(logN) 链表本身是on,跳表为了解决增上改查的效率
skiplist跳表就是在score有序链表上建索引,即每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引。这种链表加多级索引的结构,就是跳表。 

在这里插入图片描述

缓存穿透: 缓存和数据库中都没有的数据     过滤器拦截 命名规范
缓存击穿: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)并发用户特别多  分布式锁就是只让一个线程构建缓存,其他线程等待构建缓存的线程执行完  永远不过期  接口限流与熔断,降级

开关控制!!!
限流 ngnix + lua + redis 这种方式,redis 存计数值  或则定时失效 队列也行

熔断hystrix配置 HystrixCommand 把RPC接口封装到HystrixCommand里面
每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。
circuitBreaker.requestVolumeThreshold //滑动窗口的大小,默认为20 
circuitBreaker.sleepWindowInMilliseconds //过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟 
circuitBreaker.errorThresholdPercentage //错误率,默认50%

降级 当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。 
/@HystrixCommand 默认开启了线程池隔离方式 ,服务降级,服务熔断
HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallbackMethod")
 

redis-server redis.conf  6379
redis-cli.exe 客户端工具

RedisTemplate jedis Serializable对象序列化

基于内存运行,性能高效
单进程单线程模型
丰富的数据类型
操作具有原子性
持久化
多路I/O复用模型,是非阻塞I/O

key不要太长,尽量不要超过1024字节  key也不要太短,太短的话,key的可读性会降低 在一个项目中,key最好使用统一的命名模式
String类型、哈希类型、列表类型、集合类型和顺序集合类型ZSet   能存储图片、视频等多种类型, 最大长度支持512M
redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果!!!原子性
redis中的lists在底层实现上并不是数组,而是链表!! 删除很快

击穿:第一次访问  恶意访问不存在的key      Key过期   而必须向DB发起一次请求的行为, 称为“Redis击穿”
服务器启动时, 提前写入  规范key的命名, 通过中间件拦截 对某些高频访问的Key,设置合理的TTL或永不过期
雪崩:大批量的数据都到了过期时间,从而导致查询数据量巨大,引起数据库压力过大甚至down机
热点数据永不过期  过期时间设置随机  


redis持久化  RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。!!!!!!
RDB:某个时间点上的数据集  一定时间dump redis存储的数据生成快照并存储到磁盘,fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储dump.rdb
save 300 10  #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照
整个Redis数据库将只包含一个文件  而且会阻塞,导致停顿很久  文件太大,回复起来很慢   还可能丢数据!!!来不及dump

AOF;redis执行过的所有写、删除操作,查询操作不会记录,指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
AOF 文件的体积通常要大于 RDB 文件的体积  aof!!!!!!(在中国数据安全是最重要的)选择这个
appendonly yes       
appendfsync always     #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。
redis-check-aof –fix进行修复  
fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件

同步原理:从会向主发出SYNC指令,主会调用bgsave命令生成子线程到rdb文件,新来的命令会缓存内存中,然后把rdb文件发给多个从,从读取文件到内存中
在2.8之后,redis支持了效率更高的增量同步策略,这大大降低了连接断开的恢复成本。采用偏移量replication offset


1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
QUEUED的字样,这表示我们在用MULTI组装事务时,每一个命令都会进入到内存队列中缓存起来,如果出现QUEUED则表示我们这个命令成功插入了缓存队列,在将来执行EXEC时,这些被QUEUED的命令都会被组装成一个事务来执行。
Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

扫出指定模式的key列表
keys指令会导致线程阻塞一段时间/scan指令可以无阻塞的提取指令模式的key列表
set指令有个非常复杂的参数是可以同时把setnx和expire合成一条指令来用
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值