重庆定制网站建设,棋牌软件开发多少钱,深圳防疫措施优化,鹤山网站建设易搜互联1.redis redis高性能的key-value数据库#xff0c;支持持久化#xff0c;不仅仅支持简单的key-value#xff0c;还提供了list#xff0c;set#xff0c;zset#xff0c;hash等数据结构的存储#xff0c;支持数据的备份#xff08;master-slave模式#xff09;
redis支持持久化不仅仅支持简单的key-value还提供了listsetzsethash等数据结构的存储支持数据的备份master-slave模式
redis性能极高丰富的数据类型原子操作丰富的特性
2.redis数据类型
String-字符串hash-哈希list-列表set-集合 zset-有序集合 3.好处 速度快丰富的数据类型支持事务操作原子性丰富的特性用于缓存消息按key设置过期时间过期后将自动删除
4.memcached与redis区别
存储方式:memcached把数据全部存在内存之中redis可以持久化memcached数据类型简单redis丰富redis速度更快底层模型不同redis直接自己构建了vm机制。
5.redis是单进程单线程的利用队列技术将并发访问变为串行访问消除了传统数据库串行控制的开销
6.一个字符串类型的值能存储最大容量是 512M
7.redis持久化机制是什么优缺点
持久化机制RDB和AOP RDB持久化原理是将Redis在内存中的数据库记录定时dump到磁盘上的RDB持久化 AOF持久化原理是将Redis的操作日志以追加的方式写入文件
rdb和aof
8.常见性能问题和解决方案
master不要写内存快照如果master写内存快照save命令调度rdbSave函数会阻塞主线程的工作当快照比较大时对性能影响非常大会间断性暂停服务如果数据比较重要某个slave开启aop备份数据策略设置为每秒同步为了主从复制的速度和连接的稳定性master和slave最好在同一个局域网尽量避免在压力很大的主库上增加从主从赋值不要用图装结构用单向链表结构更为稳定即master-slave1-slave2,这样方便解决单点故障问题实现slave对master的替换如果master挂了可以立刻启用slave1做master其他不变。
9.redis过期键的删除策略
定时删除设置键的过期时间时创建一个定时器让定时器在键的过期时间来临时立即执行对键的删除操作惰性删除放任键过期不管但每次从键空间获取键时检查取得的键是否过期过期删除不过期返回。定期删除隔一段时间检查一次删除过期键。
10.redis回收策略淘汰策略
volatile-lru从已设置过期时间的数据集中挑选最近最少使用的数据淘汰volatile-ttl从已设置过期时间的数据集中挑选将要过期的数据淘汰volatile-random从已设置过期时间的数据集中任意选择数据淘汰allkey-lru从数据集中挑选最近最少使用的数据淘汰allkey-random从数据集中任意选择数据淘汰no-enviction禁止驱逐数据
使用策略规则
如果数据呈现幂律分布即一部分数据访问频率高一部分低则使用allkeys-lru如果数据呈现平等分布即所有的数据访问频率都相同则使用allkeys-random
11为什么redis需要把所有数据放到内存中
为了达到最快的读写速度将数据都读到内存中并通过异步的方式将数据写入磁盘。
12.redis同步机制
redis可以使用主从同步从从同步。
第一次同步时主节点做一次bgsave并同时将后续修改操作记录到内存buffer。待完成后将rdb文件全量同步到复制节点复制节点接受完成后将rdb镜像加载到内存。加载完成后再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
13.pipeline的好处
可以将多次io往返的时间缩减为一次前提是pipeline执行的指令之间没有因果相关性使用redis-benchmark进行压测的时候可以发现影响redis的qps峰值的一个重要因素是pipeline批次指令的数目。
14.redis集群的原理
redis sentinal着眼于高可用在master宕机时会自动将slave提升为master继续提供服务redis cluster着眼于扩展性单个redis内存不足时使用cluster进行分片存储。
15.redis集群方案什么情况下会导致整个集群不可用
有ABC三个节点的集群在没有复制模型的情况下如果节点b失败了那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。
Redis Sentinel 及 Redis Cluster
16.redis哈希槽的概念
redis集群有16384个哈希槽每个key通过crc16校验后对16384取模来决定放置哪个槽集群的每个节点负责一部分hash槽。集群最大节点个数16384个
17.redis集群的主从复制模型
为了使在部分节点失败或大部分节点无法通信的情况下集群仍然可用所有集群使用了主从复制模型每个节点都会有N-1个复制品。复制方式异步复制
18.redis事务
事务是一个单独的隔离操作事务中的所有命令都会序列化按顺序地执行事务在执行的过程中不会被其他客户端发送来的命令请求所打断。事务是一个原子的操作事务中的命令要么全部被执行要么全部都不执行。事务相关的命令MULTI、EXEC、DISCARD、WATCH
19.redis内存优化
尽可能使用散列表散列表里面存储的数少使用内存非常小尽可能将数据模型抽象到一个散列表里面eg一个用户对象不要为这个用户的名称姓氏邮箱密码设置单独的key而是应该把这个用户的所欲信息存储到一张散列表里面。
20.redis回收进程如何工作
客户端运行新的命令添加新的数据redis检查内存使用情况如果大于maxmemory限制则根据设定好的策略进行回收。
通过不断达到边界然后不断地回收回到边界以下如果一个命令的结果导致大量内存被使用不用多久内存限制就会被这个内存使用量超越。
21.降低redis内存使用情况
如果使用的是32位redis实例可以利用hashlist等集合类型数据。
22.redis内存用完会发生什么
如果达到设置的上限redis的写命令会返回错误信息读命令正常返回或者可以将redis当缓存来使用配置淘汰机制当redis达到内存上限时会冲刷掉旧的内容。
23.mysql里有2000w数据redis中只存20w的数据如何保证redis中的数据都是热点数据
使用redis提供的6中数据淘汰策略redis内存数据集大小上升到一定大小时候就会施行数据淘汰策略。
24.redis最适合的场景
会话缓存全页缓存队列排行榜/计数器发布/订阅
25.假如redis里有1亿个key其中10w个key是以某个固定的已知的前缀开头的如果将他们全部找出来
keys指令可以扫出指定模式的key列表。
但由于redis是单线程的keys指令会导致线程阻塞一段时间线上服务会停顿直到指令执行完毕服务才能恢复。
可以用scan指令可以无阻塞的提取出指定模式的key列表但有一定的重复概率在客户端做一次去重就可以了但整体时间会比直接用keys长。
26.redis做异步队列
一般使用list结构作为队列rpush生产消息lpop消费消息当lpop没有消息的时候适当sleep一会再重试。
不用sleepblpop在没有消息的时候他会阻塞住直到消息到来。
生产一次消费多次使用pub/sub主题订阅者模式可以实现1N的消息队列
pub/sub缺点消费者下线的情况生产的消息会丢失使用专业的消息队列如rabbitMQ
redis实现延时队列使用sortedset拿时间戳作为score消息内容作为key调用zadd来生产消息消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。
Redisson 的分布式延时队列 RedissonDelayedQueue 运行流程
//发送消息
String queueKey
RBlockingDequeObject blockingDeque redissonClient.getBlockingDeque(queueKey);
RDelayedQueueObject delayedQueue redissonClient.getDelayedQueue(blockingDeque);
delayedQueue.offer(value, delay, timeUnit);//获取消息
RBlockingDequeObject blockingDeque redissonClient.getBlockingDeque(queueCode);
redissonClient.getDelayedQueue(blockingDeque);
return (T) blockingDeque.take();redisson 源码里一共创建了三个队列
消息延时队列利用按照到期时间排序的特性可以很快找到下一个要到期的消息客户端内部自己定时到【消息目标队列】取消息顺序队列消息目标队列存放到期的消息供消费端取
流程
发送延迟消息发送的延迟消息会先存在【消息延时队列】和【消息顺序队列】如果【消息延时队列】原本是空的会发布订阅信息提醒有新的消息。
获取延迟消息只需要从【消息目标队列】阻塞的取就行了因为里面都是到期数据。
初始化延时队列判断时间到了把【消息延时队列】里的消息移动到【消息目标队列】里
定时从【消息延时队列】查询最新到期时间定时去把【消息延时队列】里的消息移动到【消息目标队列】里。
如果【消息延时队列】是空的就不会再定时查而是等待发布订阅信息提醒再定时把【消息延时队列】里的消息移动到【消息目标队列】里。
27.redis分布式锁
先拿setnx来争抢锁抢到之后再用expire给锁加一个过期时间防止锁忘记了释放
setnx之后执行expire之前进程意外crash或者要重启维护了会怎么样
set指令的复杂参数可以把setnx和expire合成一条指令用的。
28.解决key冲突
业务隔离key的设计业务模块系统名称关键id针对用户可以加入userid分布式锁场景多个客户端并发写key----客户端拿到锁才能进行操作避免多个客户端竞争该key时间戳key拼接时间戳根据时间戳保证多个客户端的业务执行顺序
29 什么是缓存穿透
缓存穿透一些恶意的请求会故意查询不存在的key请求量很大就会对后端系统造成很大的压力。解决对查询结果为空的情况也进行缓存缓存时间设置短一点或者该key对应的数据insert之后清理缓存。对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中查询时通过该Bitmap过滤。
缓存雪崩
缓存雪崩当缓存服务器重启或者大量缓存集中在某一时间段失效这样在失效的时候会给后端系统带来很大的压力导致系统崩溃。解决在缓存失效后通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存其它线程等待做二级缓存不同的key设置不同的过期时间让缓存失效的时间尽量均匀
30 保证缓存和数据库数据的一致性 淘汰缓存数据如果为较为复杂的数据时进行缓存的更新操作就会变得异常复杂推荐选择淘汰缓存而不是更新缓存。 选择先淘汰缓存再更新数据库假如先更新数据库再淘汰缓存如果淘汰缓存失败那么后面的请求都会得到脏数据直至缓存过期。假如先淘汰缓存再更新数据库如果更新数据库失败只会产生一次缓存穿透相比较而言后者对业务则没有本质上的影响。 延时双删策略 如下场景同时有一个请求A进行更新操作另一个请求B进行查询操作。 请求A进行写操作删除缓存请求B查询发现缓存不存在请求B去数据库查询得到旧值请求B将旧值写入缓存请求A将新值写入数据库
次数便出现了数据不一致问题。采用延时双删策略得以解决。
public void write(String key,Object data){ redisUtils.del(key); db.update(data); Thread.Sleep(100); redisUtils.del(key); } 这么做可以将1秒内所造成的缓存脏数据再次删除。这个时间设定可根据俄业务场景进行一个调节。
数据库读写分离的场景
两个请求一个请求A进行更新操作另一个请求B进行查询操作。
请求A进行写操作删除缓存请求A将数据写入数据库了请求B查询缓存发现缓存没有值请求B去从库查询这时还没有完成主从同步因此查询到的是旧值请求B将旧值写入缓存数据库完成主从同步从库变为新值 依旧采用延时双删策略解决此问题。