wordpress多站点开启,网站建设怎么添加图片上去,wordpress 培训小程序,展览公司网站模板目录 一、基础
1、Redis 是什么
2、说一下你对redis的理解
3、Redis 为什么这么快#xff1f;
4、项目中如何使用缓存#xff1f;
5、为什么使用缓存#xff1f;
6、Redis key 和value 可以存储最大值分别多是多少#xff1f;
7、Redis和memcache有什么区别#xf…目录 一、基础
1、Redis 是什么
2、说一下你对redis的理解
3、Redis 为什么这么快
4、项目中如何使用缓存
5、为什么使用缓存
6、Redis key 和value 可以存储最大值分别多是多少
7、Redis和memcache有什么区别
8、说说redis常用应用场景
二、数据类型
1、redis有哪些数据类型分别适用于什么场景
2、说说Redis底层数据结构
三、架构
1、redis 持久化机制
2、redis集群高可用
1Replication-Sentinel哨兵模式
2Redis-Cluster集群模式
3、redis事务怎么理解
4、redis的过期策略及内存淘汰机制
1.过期策略
2.内存淘汰机制
5、布隆过滤器是什么
6、如何保证数据库和缓存数据的一致性
1.延时双删
2.采用canal组件监控MySQL的binlog日志把更新后的数据同步到redis里面
3.基于 RocketMQ 的可靠性消息通信来实现最终一致性。
7、redis 分布式锁如何实现
四、场景
1、缓存穿透、缓存击穿、缓存雪崩
2缓存击穿
3缓存雪崩
2、怎么使用redis实现消息队列
3、什么是bigkey有什么影响
4、怎么处理热key?
5、缓存预热怎么做呢
6、Redis里面有1亿个key其中有10w个key是以某个固定的已知的前缀开头的如何将它们全部找出来 一、基础
1、Redis 是什么
Redis是一个开源的基于内存的也可进行持久化的使用C语言编写的键值对存储数据库。
2、说一下你对redis的理解
1Redis 是一个高性能的基于 Key-Value 结构存储的 Nosql 开源数据库
2目前市面上绝大部分公司都采用 Redis 来实现分布式缓存从而提高数据的检索效率
3Redis 之所以这么流行主要有几个特点
它是基于内存存储在进行数据 IO 操作时能够 10WQPS 提供了非常丰富的数据存储结构如 String、List、Hash、Set、ZSet 等。 Redis 底层采用单线程实现数据的 IO所以在数据算法层面并不需要要考虑并发安全性所以底层算法上的时间复杂度基本上都是常量 (4) Redis 虽然是内存存储但是它也可以支持持久化避免因为服务器故障导致数据丢失的问题
基于这些特点Redis 一般用来实现分布式缓存从而降低应用程序对关系型数据库检索带来的性能影响。除此之外Redis 还可以实现分布式锁、分布式队列、排行榜、查找附近的人等功能为复杂应用提供非常方便和成熟的解决方案
3、Redis 为什么这么快
1基于内存实现
2高效的数据结构
SDS 简单动态字符串
Redis 是用 C 语言开发完成的但在 Redis 字符串中并没有使用 C 语言中的字符串而是用一种称为SDSSimple Dynamic String的结构体来保存字符串。 哈希表(字典)
Redis 作为 k-v 型内存数据库所有的键值就是用字典来存储。字典就是哈希表比如 HashMap通过 key 就可以直接获取到对应的value。而哈希表的特性在O1时间复杂度就可以获得对应的值。
跳表
作为 Redis 中特有的数据结构-跳跃表其在链表的基础上增加了多级索引来提升查找效率。这是跳跃表的简单原理图每一层都有一条有序的链表最底层的链表包含了所有的元素。这样跳跃表就可以支持在 O(logN) 的时间复杂度里查找到对应的节点。 下面这张是跳表真实的存储结构图 网上对跳表的各种理论讲解都比较多,其基本原理为添加多级索引来加快查找速度实现OlogN)的时间复杂度 通过随机函数确定节点插入到几级索引中来防止跳表退化为单链表。
双向链表
列表 List 更多是被当作队列或栈来使用的。队列和栈的特性一个先进先出一个先进后出。双向链表很好的支持了这些特性。 压缩列表
ziplist 是 Redis 为了节约内存而开发的是由一系列特殊编码的连续内存块(而不是像双端链表一样每个节点是指针)组成的顺序型数据结构 如下图 压缩列表是经过特殊编码专门为了提升内存使用效率设计的。所有的操作都是通过指针与解码出来的偏移量进行的。并且压缩列表的内存是连续分配的遍历的速度很快
3IO多路复用
4合理的线程模型单线程避免线程上下文切换、IO多路复用
5渐进式rehash、缓存时间戳 4、项目中如何使用缓存
变动频率低、查询频率高的数据做缓存减轻DB压力
5、为什么使用缓存
高性能数据库查询耗时缓存查询极快
高并发mysql单机QPS 2000左右redis轻松几万
6、Redis key 和value 可以存储最大值分别多是多少 key 的大小上限为 512M,但一般建议 key 大小不要超过 1KB这样既可以节约存储空间又有利于 Redis 进行检索 value 的最大值也是 512M。对于 String 类型value 值上限为 512M而集合、链表、哈希等 key 类型单个元素 value 上限也为 512M
7、Redis和memcache有什么区别 Redis 支持复杂的数据结构
Redis 相比 Memcached 来说拥有更多的数据结构能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作 Redis 会是不错的选择。 Redis 原生支持集群模式
在 Redis3.x 版本中便能支持 cluster 模式而 Memcached 没有原生的集群模式需要依靠客户端来实现往集群中分片写入数据。 性能对比
由于 Redis 只使用单核而 Memcached 可以使用多核所以平均每一个核上 Redis 在存储小数据时比Memcached 性能更高。而在 100k 以上的数据中Memcached 性能要高于 Redis。虽然Redis 最近也在存储大数据的性能上进行优化但是比起 Memcached还是稍有逊色
8、说说redis常用应用场景 缓存 排行榜 计数器 分布式会话 分布式锁 社交网络 消息队列 位操作
二、数据类型
1、redis有哪些数据类型分别适用于什么场景
String
这是最简单的类型就是普通的 set 和 get做简单的 KV 缓存。场景缓存、计数、限流等
set college szu
Hash
这个是类似 map 的一种结构这个一般就是可以将结构化的数据比如一个对象前提是这 个对象没嵌套其他的对象给缓存在 Redis 里然后每次读写缓存的时候可以就操作 hash里的某个字段。场景用户信息、商品信息等
hset person name bingo
hset person age 20
hset person id 1
hget person name
person {
name: bingo,
age: 20,
id: 1
}
List
Lists 是有序列表这个可以玩儿出很多花样。
比如可以通过 list 存储一些列表型的数据结构类似粉丝列表、文章的评论列表之类的东西。
比如可以通过 lrange 命令读取某个闭区间内的元素可以基于 list 实现分页查询这个是很
棒的一个功能基于 Redis 实现简单的高性能分页可以做类似微博那种下拉不断分页的东
西性能高就一页一页走
# 0开始位置-1结束位置结束位置为-1时表示列表的最后一个位置即查看所有。
lrange mylist 0 -1
比如可以搞个简单的消息队列从 list 头怼进去从 list 尾巴那里弄出来。
lpush mylist 1
lpush mylist 2
lpush mylist 3 4 5
# 1
rpop mylist
Set
Sets 是无序集合自动去重可以基于 set 玩儿交集、并集、差集的操作。常用于进行标签管理等 #-------操作一个set-------
# 添加元素
sadd mySet 1
# 查看全部元素
smembers mySet
# 判断是否包含某个值
sismember mySet 3
# 删除某个/些元素
srem mySet 1
srem mySet 2 4
# 查看元素个数
scard mySet# 随机删除一个元素
spop mySet
#-------操作多个set-------
# 将一个set的元素移动到另外一个set
smove yourSet mySet 2
# 求两set的交集
sinter yourSet mySet
# 求两set的并集
sunion yourSet mySet
# 求在yourSet中而不在mySet中的元素
sdiff yourSet mySet
Sorted Set
Sorted Sets 是排序的 set去重但可以排序写进去的时候给一个分数自动根据分数排序。排行榜。
zadd board 85 zhangsan
zadd board 72 lisi
zadd board 96 wangwu
zadd board 63 zhaoliu 2、说说Redis底层数据结构
Redis有动态字符串(sds)、链表(list)、字典(ht)、跳跃表(skiplist)、整数集合(intset)、压缩列表(ziplist) 等底层数据结构。 Redis并没有使用这些数据结构来直接实现键值对数据库而是基于这些数据结构创建了一个对象系统来表示所有的key-value 我们常用的数据类型和编码对应的映射关系 三、架构
1、redis 持久化机制
1Redis 的持久化机制
Redis 的持久化机制有RDB、AOF、混合持久化RDBAOFRedis 4.0引入。RDB 和 AOF 都是 Redis 里面提供的持久化机制RDB 是通过快照方式实现持久化、AOF 是通过命令追加的方式实现持久化
RDB
RDB 持久化机制会根据快照触发条件把内存里面的数据快照写入到磁盘以二进制的压缩文件进行存储 RDB 快照的触发方式有很多比如 执行 bgsave 命令触发异步快照执行 save 命令触发同步快照同步快照会阻塞客户端的执行指令。 根据 redis.conf 文件里面的配置自动触发 bgsave 主从复制的时候触发 AOF
AOF持久化机制是近乎实时的方式来完成持久化的就是客户端执行一个数据变更的操作Redis Server 就会把这个命令追加到 aof 缓冲区的末尾然后再把缓冲区的数据写入到磁盘的 AOF 文件里面至于最终什么时候真正持久化到磁盘是根据刷盘的策略来决定的 为了避免追加的方式导致 AOF 文件过大的问题Redis 提供了 AOF 重写机制(如图也就是说当 AOF 文件的大小达到某个阈值的时候就会把这个文件里面相同的指令进行压缩 AOF三种策略
为了控制Redis服务器在遇到意外停机时丢失的数据量Redis为AOF持久化提供了appendfsync选项这个选项的值可以是always,everysec或者noappendfsync always总是写入aof文件并通过事件循环磁盘同步即使Redis遭遇意外停机时最多只丢失一事件循环内的执行的数据 appendfsync everysec每一秒写入aof文件并完成磁盘同步即使Redis遭遇意外停机时最多只丢失一秒钟内的执行的数据 appendfsync no服务器不主动调用fdatasync,由操作系统决定任何将缓冲区里面的命令写入到硬盘里这种模式下服务器遭遇意外停机时丢失的命令的数量是不确定的
2RDB和AOF 比较 RDB 是每隔一段时间触发持久化因此数据安全性低AOF 可以做到实时持久化数据安全性较高 RDB 文件默认采用压缩的方式持久化AOF 存储的是执行指令所以 RDB 在数据恢复的时候性能比 AOF 要好
3混合持久化
只发生于 AOF 重写过程。使用了混合持久化重写后的新 AOF 文件前半段是 RDB 格式的全量数据后半段是 AOF 格式的增量数据。
2、redis集群高可用
Redis高可用常见的有三种方式
1Replication-Sentinel哨兵模式
Redis sentinel 是一个分布式系统中监控 redis 主从服务器并在主服务器下线时自动进行故障转移。 Redis sentinel 其中三个特性 监控Monitoring
Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 提醒Notification
当被监控的某个 Redis 服务器出现问题时 Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 自动故障迁移Automatic failover
当一个主服务器不能正常工作时 Sentinel 会开始一次自动故障迁移操作。
哨兵本身也有单点故障的问题可以使用多个哨兵进行监控哨兵不仅会监控redis集群哨兵之间也会相互监控。
每一个哨兵都是一个独立的进程作为进程它会独立运行。 特点 保证高可用 监控各个节点 自动故障迁移
缺点 主从模式切换需要时间丢数据 没有解决 master 写的压力
Redis哨兵系统是怎么实现自动故障转移的
1.认定主节点主观下线
因为每隔2s哨兵节点会给主节点发送PING命令如果在一定时间间隔内都没有收到回复那么哨兵节点就认为主节点主观下线。
2.认定主节点客观下线
哨兵节点认定主节点主观下线后会向其他哨兵节点发送sentinel is-master-down-by-addr命令获取其他哨兵节点对该主节点的状态当认定主节点下线的哨兵数量达到一定数值时(这个阀值是Sentinel配置中quorum参数的值通常我们设置为哨兵总节点数的1/2)就认定主节点客观下线。
3.进行领导者哨兵选举
认定主节点客观下线后,各个哨兵之间相互通信选举出一个领导者哨兵由它来对主节点进行故障转移操作。
选举使用的是Raft算法基本思路是所有哨兵节点A会向其他哨兵节点发送命令申请成为该哨兵节点B的领导者如果B还没有同意过其他哨兵节点那么就同意A成为领导者最终得票超过半数以上的哨兵节点会赢得选举如果本次投票没有选举出领导者哨兵那么就开始新一轮的选举直到选举出哨兵节点实际开发中最先判定主节点客观下线的哨兵节点一般就能成为领导者。 领导者哨兵进行故障转移
领导者哨兵节点首先会从从节点中选出一个节点作为新的主节点。选择的规则是 1.首先排除一些不健康的节点。下线的断线的最近5s没有回复哨兵节点的INFO命令的与旧的主服务器断开连接时间较长的 2.然后根据优先级复制偏移量runid最小来选出一个从节点作为主节点。
向这个从节点发送slaveof no one命令让其成为主节点通过slaveof 命令让其他从节点成为它的从节点将已下线的主节点更新为新的主节点的从节点将其他从节点的复制目标改为新的主节点将旧的主服务器改为从服务器。
2Redis-Cluster集群模式
redis在3.0上加入了 Cluster 集群模式实现了 Redis 的分布式存储也就是说每台 Redis 节点上存储不同的数据。
cluster模式为了解决单机Redis容量有限的问题将数据按一定的规则分配到多台机器内存/QPS不受限于单机可受益于分布式集群高扩展性。
RedisCluster 是 Redis 的亲儿子它是 Redis 作者自己提供的 Redis 集群化方案。
相对于 Codis 的不同它是去中心化的如图所示该集群有三个 Redis 节点组成 每个节点负责整个集群的一部分数据每个节点负责的数据多少可能不一样。这三个节点相 互连接组成一个对等的集群它们之间通过一种特殊的二进制协议相互交互集群信息。 如上图官方推荐集群部署至少要 3 台以上的master节点最好使用 3 主 3 从六个节点的模式。
Redis Cluster 将所有数据划分为 16384 的 slots它比 Codis 的 1024 个槽划分得更为精细每个节点负责其中一部分槽位。槽位的信息存储于每个节点中它不像 Codis它不 需要另外的分布式存储来存储节点槽位信息。 Redis Cluster是一种服务器Sharding技术(分片和路由都是在服务端实现)采用多主多从每一个分区都是由一个Redis主机和多个从机组成片区和片区之间是相互平行的。
Redis Cluster集群采用了P2P的模式完全去中心化。
3 主 3 从六个节点的Redis集群Redis-Cluster Redis 集群是一个提供在多个Redis节点间共享数据的程序集。下图以三个master节点和三个slave节点作为示例。 Redis 集群有16384个哈希槽每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽如图中slots所示。
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用所以集群使用了主从复制模型每个节点都会有1-n个从节点。例如master-A节点不可用了集群便会选举slave-A节点作为新的主节点继续服务。
3、redis事务怎么理解
multi 开启事务
exec 提交事务
discard 回滚事务
4、redis的过期策略及内存淘汰机制
1.过期策略 定期删除每隔 100ms 就随机抽取一些设置了过期时间的 key检查其是否过期如果过期就删除 惰性删除获取 key 的时候如果此时 key 已经过期就删除不会返回任何东西
2.内存淘汰机制 noeviction: 当内存不足以容纳新写入数据时新写入操作会报错 allkeys-lru移除最近最少使用的 key allkeys-random随机移除某个 key volatile-lru在设置了过期时间的键空间中移除最近最少使用的 key volatile-random在设置了过期时间的键空间中随机移除某个 key volatile-ttl设置了过期时间的键空间中有更早过期时间的 key 优先移除
5、布隆过滤器是什么
布隆过滤器可以理解为一个有误差的set结构使用布隆过滤器来判断元素是否存在其中时如果返回结果是存在实际可能存在也可能不存在返回结果不存在时实际结果肯定是不存在。
布隆过滤器实际上是一个大型的位数组添加key时通过几个hash函数对key计算得到多个hash值将每个hash值与布隆过滤器的位数组的size取模得到下标然后将数组中这些下标位置的值都设置为1。
创建key为userid的布隆过滤器0.01是误判率10000是初始大小
127.0.0.1:6379 bf.reserve userid 0.01 100000
调用exist指令判断181920是否存在于布隆过滤器如果返回0不存在那么说明一定不存在如果返回1代表可能存在也可能不存在。
127.0.0.1:6379 bf.add userid 181920 (integer) 1布隆过滤器也有一些缺点 它在判断元素是否在集合中时是有一定错误几率因为哈希算法有一定的碰撞的概率。 不支持删除元素。
6、如何保证数据库和缓存数据的一致性
1.延时双删 先删除缓存 更新数据库 线程等待 N秒等待时间根据具体业务来判断 再删除缓存
2.采用canal组件监控MySQL的binlog日志把更新后的数据同步到redis里面 更新数据库 更新redis的数据 canal组件从binlog加载数据然后同步到redis
3.基于 RocketMQ 的可靠性消息通信来实现最终一致性。 7、redis 分布式锁如何实现
1、加锁时要设置过期时间SET lock_key unique_value EX expire_time NX
2、操作共享资源
3、释放锁Lua脚本先GET判断锁是否归属自己再DEL释放锁
集群模式Redlock实现高可靠的分布式锁
让客户端和多个独立的Redis实例依次请求加锁如果客户端能够和半数以上的实例成功地完成加锁操作那么我们就认为客户端成功地获得分布式锁了否则加锁失败。
https://blog.csdn.net/fuzhongmin05/article/details/119251590
四、场景
1、缓存穿透、缓存击穿、缓存雪崩
1缓存穿透
缓存穿透是指查询一个根本不存在的数据缓存层和持久层都不会命中。
解决方案参数校验、缓存空对象及布隆过滤器
2缓存击穿
在缓存失效的瞬间有大量线程来重建缓存造成后端负载加大甚至可能会让应用崩溃。
解决方案永不过期或分布式互斥锁
3缓存雪崩
缓存层宕机或者大量缓存同时失效请求直接到达存储层存储层压力过大导致系统雪崩。
解决方案缓存高可用、避免缓存同时失效及采用多级缓存 2、怎么使用redis实现消息队列 基于List的LPUSHBRPOP实现 基于Zset PUB/SUB 基于Stream类型
3、什么是bigkey有什么影响 字符串类型单个value值很大一般超过10KB就是bigkey 非字符串类型体现在元素过多
危害 内存空间不均匀redis cluster中bigkey造成节点内存空间使用不均与 超时阻塞redis单线程操作bigkey比较好使阻塞redis的可能性增大 网络拥塞每次获取bigkey产生的网络流量较大
4、怎么处理热key? 什么是热Key所谓的热key就是访问频率比较的key。 怎么处理热key 对热key的处理最关键的是对热点key的监控可以从这些端来监控热点key: 客户端 客户端其实是距离key“最近”的地方因为Redis命令就是从客户端发出的例如在客户端设置全局字典key和调用次数每次调用Redis命令时使用这个字典进行记录。 代理端 像Twemproxy、Codis这些基于代理的Redis分布式架构所有客户端的请求都是通过代理端完成的可以在代理端进行收集统计。 Redis服务端 使用monitor命令统计热点key是很多开发和运维人员首先想到monitor命令可以监控到Redis执行的所有命令。
只要监控到了热key对热key的处理就简单了 把热key打散到不同的服务器降低压⼒ 加⼊⼆级缓存提前加载热key数据到内存中如果redis宕机⾛内存查询 5、缓存预热怎么做呢
所谓缓存预热就是提前把数据库里的数据刷到缓存里通常有这些方法 直接写个缓存刷新页面或者接口上线时手动操作 数据量不大可以在项目启动的时候自动进行加载 定时任务刷新缓存
6、Redis里面有1亿个key其中有10w个key是以某个固定的已知的前缀开头的如何将它们全部找出来
使用keys指令可以扫出指定模式的key列表。
对方接着追问
如果这个redis正在给线上的业务提供服务那使用keys指令会有什么问题
这个时候你要回答redis关键的一个特性
redis的单线程的。
keys指令会导致线程阻塞一段时间线上服务会停顿直到指令执行完毕服务才能恢复。
这个时候可以使用scan指令scan指令可以无阻塞的提取出指定模式的key列表但是会有一定的重复概率在客户端做一次去重就可以了但是整体所花费的时间会比直接用keys指令长。