视频网站开发需要什么语言,小程序怎么做微网站链接,frontpage网页制作视频教程,七牛云存储 wordpress 缩略图目录 Java全技术栈面试题合集地址Redis篇1.Redis 的数据类型#xff1f;2.Redis 是单进程单线程的#xff1f;3.一个字符串类型的值能存储最大容量是多少#xff1f;4.Redis 的持久化机制是什么#xff1f;各自的优缺点#xff1f;5.redis 过期键的删除策略#xff1f;6.… 目录 Java全技术栈面试题合集地址Redis篇1.Redis 的数据类型2.Redis 是单进程单线程的3.一个字符串类型的值能存储最大容量是多少4.Redis 的持久化机制是什么各自的优缺点5.redis 过期键的删除策略6.Redis 的回收策略淘汰策略?7.为什么 Redis 需要把所有数据放到内存中8.Redis 的同步机制了解么9.Jedis 与 Redisson 对比有什么优缺点10.说说 Redis 哈希槽的概念11.Redis 事务相关的命令有哪几个12.Redis key 的过期时间和永久有效分别怎么设置13.MySQL 里有 2000w 数据redis 中只存 20w 的数据如何保证 redis 中的数据都是热点数据14.Redis 最适合的场景15.缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级16.Redis事务17.RedLock算法18.MySQL与Redis 如何保证双写一致性19.延时双删20.删除缓存重试机制21.读取biglog异步删除缓存22.在生成 RDB期间Redis 可以同时处理写请求么23.布隆过滤器 Java全技术栈面试题合集地址
Java全技术栈面试题合集地址跳转
Redis篇
1.Redis 的数据类型
Redis 支持五种数据类型string字符串hash哈希list列表set集合及 zsetsorted set有序集合)。
String 应用场景共享session、分布式锁计数器、限流。 Hash 应用场景缓存用户信息等。 List 应用场景消息队列文章列表 Set 应用场景用户标签,生成随机数抽奖、社交需求。 Zset 应用场景排行榜社交需求如用户点赞。 Redis 的三种特殊数据类型
GeoRedis3.2推出的地理位置定位用于存储地理位置信息并对存储的信息进行操作。HyperLogLog用来做基数统计算法的数据结构如统计网站的UV。Bitmaps 用一个比特位来映射某个元素的状态在Redis中它的底层是基于字符串类型实现的可以把bitmaps成作一个以比特位为单位的数组
2.Redis 是单进程单线程的
Redis 是单进程单线程的redis 利用队列技术将并发访问变为串行访问消除了传统数据库串行控制的开销。
3.一个字符串类型的值能存储最大容量是多少
512M Redis还支持保存多种数据结构此外单个value的最大限制是1GB.
4.Redis 的持久化机制是什么各自的优缺点 RDBRedis DataBase)持久化方式 是指用数据集快照的方式半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件持久化结束后用这个临时文件替换上次持久化的文件达到数据恢复。 优点 只有一个文件 dump.rdb方便持久化。 容灾性好一个文件可以保存到安全的磁盘。 性能最大化fork 子进程来完成写操作让主进程继续处理命令所以是 IO最大化。使用单独子进程来进行持久化主进程不会进行任何 IO 操作保证了 redis的高性能)。 相对于数据集大时比 AOF 的启动效率更高。 缺点 数据安全性低。RDB 是间隔一段时间进行持久化如果持久化之间 redis 发生故障会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)。 AOF(Append-only file)持久化方式 是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储)保存为 aof 文件。 优点 数据安全aof 持久化可以配置 appendfsync 属性有 always每进行一次命令操作就记录到 aof 文件中一次。通过 append 模式写文件即使中途服务器宕机可以通过 redis-check-aof工具解决数据一致性问题。AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前文件过大时会对命令进行合并重写可以删除其中的某些命令比如误操作的 flushall 缺点AOF 文件比 RDB 文件大且恢复速度慢。数据集大的时候比 rdb 启动效率低。
5.redis 过期键的删除策略
惰性删除:放任键过期不管但是每次从键空间中获取键时都检查取得的键是否过期如果过期的话就删除该键;如果没有过期就返回该键。定期删除:每隔一段时间程序就对数据库进行一次检查删除里面的过期键。至于要删除多少过期键以及要检查多少个数据库则由算法决定。
6.Redis 的回收策略淘汰策略?
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驱逐禁止驱逐数据。
7.为什么 Redis 需要把所有数据放到内存中
Redis 为了达到最快的读写速度将数据都读到内存中并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天redis 将会越来越受欢迎。如果设置了最大使用的内存则数据已有记录数达到内存限值后不能继续插入新值。
8.Redis 的同步机制了解么
Redis 可以使用主从同步从从同步。第一次同步时主节点做一次 bgsave并同时将后续修改操作记录到内存 buffer待完成后将 rdb 文件全量同步到复制节点复制节点接受完成后将 rdb 镜像加载到内存。加载完成后再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
9.Jedis 与 Redisson 对比有什么优缺点
Jedis 是 Redis 的 Java 实现的客户端其 API 提供了比较全面的 Redis 命令的支持Redisson 实现了分布式和可扩展的 Java 数据结构和 Jedis 相比功能较为简单不支持字符串操作不支持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使用者对 Redis 的关注分离从而让使用者能够将精力更集中地放在处理业务逻辑上。
10.说说 Redis 哈希槽的概念
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念Redis 集群有16384 个哈希槽每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽集群的每个节点负责一部分 hash 槽。
11.Redis 事务相关的命令有哪几个
MULTI、EXEC、DISCARD、WATCH
12.Redis key 的过期时间和永久有效分别怎么设置
EXPIRE 和 PERSIST 命令。
13.MySQL 里有 2000w 数据redis 中只存 20w 的数据如何保证 redis 中的数据都是热点数据
Redis 内存数据集大小上升到一定大小的时候就会施行数据淘汰策略。
14.Redis 最适合的场景
会话缓存Session Cache全页缓存FPC队列排行榜/计数器发布/订阅
15.缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
缓存雪崩 由于原有缓存失效新缓存未到期间
可以在原有的失效时间基础上增加一个随机值比如1-5分钟随机缓存标记记录缓存数据是否过期如果过期会触发通知另外的线程在后台去更新实际key的缓存缓存数据它的过期时间比缓存标记的时间延长1倍例标记缓存时间30分钟数据缓存设置为60分钟。这样当缓存标记key过期后实际缓存还能把旧数据返回给调用端直到另外的线程在后台更新完成后才会返回新缓存。
缓存穿透 缓存穿透是指用户查询数据在数据库没有自然在缓存中也不会有。这样就导致用户查询的时候在缓存中找不到每次都要去数据库再查询一遍然后返回空。
将查询结果为null存入redis添加布隆过滤器
缓存预热 1、直接写个缓存刷新页面上线时手工操作下 2、数据量不大可以在项目启动的时候自动进行加载 3、定时刷新缓存
缓存降级 1一般比如有些服务偶尔因为网络抖动或者服务正在上线而超时可以自动降级 2警告有些服务在一段时间内成功率有波动如在95~100%之间可以自动降级或人工降级并发送告警 3错误比如可用率低于90%或者数据库连接池被打爆了或者访问量突然猛增到系统能承受的最大阀值此时可以根据情况自动降级或者人工降级 4严重错误比如因为特殊原因数据错误了此时需要紧急人工降级。 缓存击穿 缓存击穿是指在高并发的情况下当一个缓存失效的同时大量的请求直接访问数据库导致数据库压力过大甚至崩溃。
使用互斥锁或分布式锁在缓存失效的瞬间通过互斥锁或分布式锁来保证只有一个线程去访问数据库其他线程等待该线程从数据库中加载数据并更新缓存后再获取。这样可以避免大量请求同时访问数据库。添加逻辑过期字段并不实际过期当逻辑过期字段到期时去数据库查询并更新缓存和过期时间。
16.Redis事务
Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的 Redis会将一个事务中的所有命令序列化然后按顺序执行。 1.redis 不支持回滚“Redis 在事务失败时不进行回滚而是继续执行余下的命令” 所以 Redis 的内部可以保持简单且快速。 2.如果在一个事务中的命令出现错误那么所有的命令都不会执行 3.如果在一个事务中出现运行错误那么正确的命令会被执行。 1MULTI命令用于开启一个事务它总是返回OK。 MULTI执行之后客户端可以继续向服务器发送任意多条命令这些命令不会立即被执 行而是被放到一个队列中当EXEC命令被调用时所有队列中的命令才会被执行。 2EXEC执行所有事务块内的命令。返回事务块内所有命令的返回值按命令执行的先后顺序排列。当操作被打断时返回空值 nil 。 3通过调用DISCARD客户端可以清空事务队列并放弃执行事务 并且客户端会从事务状态中退出。 4WATCH 命令可以为 Redis 事务提供 check-and-set CAS行为。 可以监控一个或多个键一旦其中有一个键被修改或删除之后的事务就不会执行监控一直持续到EXEC命令
17.RedLock算法
获取当前时间以毫秒为单位。按顺序向5个master节点请求加锁。客户端设置网络连接和响应超时时间并且超时时间要小于锁的失效时间。假设锁自动失效时间为10秒则超时时间一般在5-50毫秒之间,我们就假设超时时间是50ms吧。如果超时跳过该master节点尽快去尝试下一个master节点。客户端使用当前时间减去开始获取锁时间即步骤1记录的时间得到获取锁使用的时间。当且仅当超过一半N/21这里是5/213个节点的Redis master节点都获得锁并且使用的时间小于锁失效时间时锁才算获取成功。如果取到了锁key的真正有效时间就变啦需要减去获取锁所使用的时间。如果获取锁失败没有在至少N/21个master实例取到锁有或者获取锁时间已经超过了有效时间客户端要在所有的master节点上解锁即便有些master节点根本就没有加锁成功也需要解锁以防止有些漏网之鱼。
18.MySQL与Redis 如何保证双写一致性
缓存延时双删删除缓存重试机制读取biglog异步删除缓存
19.延时双删
先删除缓存再更新数据库休眠一会比如1秒再次删除缓存。
这个休眠时间 读业务逻辑数据的耗时 几百毫秒。为了确保读请求结束写请求可以删除读请求可能带来的缓存脏数据。
20.删除缓存重试机制
因为延时双删可能会存在第二步的删除缓存失败导致的数据不一致问题。可以使用这个方案优化删除失败就多删除几次呀,保证删除缓存成功就可以了呀~ 所以可以引入删除缓存重试机制。
写请求更新数据库缓存因为某些原因删除失败把删除失败的key放到消息队列消费消息队列的消息获取要删除的key重试删除缓存操作
21.读取biglog异步删除缓存
以mysql为例
可以使用阿里的canal将binlog日志采集发送到MQ队列里面。然后通过ACK机制确认处理这条更新消息删除缓存保证数据缓存一致性。
22.在生成 RDB期间Redis 可以同时处理写请求么
Redis提供两个指令生成RDB分别是 save和bgsave。
如果是save指令会阻塞因为是主线程执行的。如果是bgsave指令是fork一个子进程来写入RDB文件的快照持久化完全交给子进程来处理父进程则可以继续处理客户端的请求。
23.布隆过滤器
布隆过滤器Bloom Filter是一种空间效率高、查询速度快的数据结构主要用于判断一个元素是否可能属于一个集合。它的主要特点是能够高效地判断一个元素是否在集合中但不能确保元素一定在集合中也就是可能存在一定的误判。 布隆过滤器的基本原理
初始化使用一个长度为m的比特数组初始化所有比特位为0。哈希函数选择k个不同的哈希函数每个哈希函数可以将输入元素映射到比特数组的一个位置。插入对于集合中的每个元素分别经过k个哈希函数得到k个哈希值将对应比特数组的位置置为1。查询对于查询元素同样经过k个哈希函数得到k个哈希值检查对应比特数组的位置如果所有位置都是1则说明元素可能在集合中如果有任意一个位置为0则说明元素一定不在集合中。