wordpress后台发布文章发不,河源市seo推广,wordpress评论不审核,seo没什么作用了文章目录#xff1a;
1.什么是Redis#xff1f;
2.为什么要用 Redis / 为什么要用缓存#xff1f;
3.Redis为什么这么快#xff1f;
4.Redis都有哪些数据类型#xff1f;
5.什么是Redis持久化#xff1f;Redis 的持久化有哪些实现方式#xff1f;
6.什么是Redis事…文章目录
1.什么是Redis
2.为什么要用 Redis / 为什么要用缓存
3.Redis为什么这么快
4.Redis都有哪些数据类型
5.什么是Redis持久化Redis 的持久化有哪些实现方式
6.什么是Redis事务
7.谈谈你对Redis集群方案——哨兵模式 的理解
8.Redis主从复制的原理是什么
9.Redis如何实现分布式锁
10.Redis中的缓存穿透、缓存击穿、缓存雪崩是什么 1.什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的开源的BSD许可高性能非关系型NoSQL的键值对数据库。 Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串值支持五种数据类型字符串、列表、散列表、集合、有序集合。 与传统数据库不同的是 Redis 的数据是存在内存中的所以读写速度非常快因此 redis 被广泛应用于缓存方向每秒可以处理超过 10万次读写操作是已知性能最快的Key-Value DB。另外Redis 也经常用来做分布式锁。除此之外Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 2.为什么要用 Redis / 为什么要用缓存 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能 假如用户第一次访问数据库中的某些数据。这个过程会比较慢因为是从硬盘上读取的。再将该用户访问的数据存在缓存中这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存所以速度相当快。如果数据库中的对应数据改变的之后同步改变缓存中相应的数据即可 高并发 直接操作缓存能够承受的请求是远远大于直接访问数据库的所以我们可以考虑把数据库中的部分数据转移到缓存中去这样用户的一部分请求会直接到缓存这里而不用经过数据库。 3.Redis为什么这么快 完全基于内存绝大部分请求是纯粹的内存操作非常快速。数据存在内存中类似于 HashMapHashMap 的优势就是查找和操作的时间复杂度都是O(1)数据结构简单对数据操作也简单Redis 中的数据结构是专门进行设计的采用单线程避免了不必要的上下文切换和竞争也不存在多进程或者多线程导致的切换而消耗 CPU不用去考虑各种锁的问题不存在加锁释放锁操作没有因为可能出现死锁而导致的性能消耗使用 I/O 多路复用模型非阻塞 IO 4.Redis都有哪些数据类型 Redis主要有5种数据类型包括StringListHashSetZSet。 数据类型可以存储的值操作应用场景String字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作对整数和浮点数执行自增或者自减操作做简单的键值对缓存List列表从两端压入或者弹出元素对单个或者多个元素进行修剪只保留一个范围内的元素存储一些列表型的数据结构类似粉丝列表、文章的评论列表之类的数据Hash包含键值对的无序散列表添加、获取、移除单个键值对获取所有键值对 检查某个键是否存在结构化的数据比如一个对象Set无序集合添加、获取、移除单个元素检查一个元素是否存在于集合中 计算交集、并集、差集从集合里面随机获取元素交集、并集、差集的操作比如交集可以把两个人的粉丝列表整一个交集ZSet有序集合添加、获取、删除元素根据分值范围或者成员来获取元素 计算一个键的排名去重但可以排序如获取排名前几名的用户String应用场景 商品编号、订单号采用incr命令生成 是否喜欢的文章点赞数incr Hash应用场景 购物车新增商品hset、增加商品数量hincrby 商品总数hlen、全部选中hgetall List应用场景 微信订阅公众号订阅lpush、查看订阅号文章lrange Set应用场景 抽奖活动参与sadd、显示参与人数scard、 随机抽取srandmember、spop 文章点赞新增点赞sadd、取消点赞srem、 展现所有点赞用户smember、点赞数统计scard 社交平台两个人的共同关注sinter、 QQ可能认识的人求差集sdiff Zset应用场景 根据商品销售对商品进行排序zadd、zincrby、zrange 抖音热搜排行榜 5.什么是Redis持久化Redis 的持久化有哪些实现方式 持久化就是把内存的数据写到磁盘中去防止服务宕机了内存数据丢失。 Redis 提供两种持久化机制 RDB默认 和 AOF 机制 RDB持久化是Redis DataBase缩写快照 **RDB是Redis默认的持久化方式。在指定的时间间隔内将内存中的数据集快照写入磁盘 也就是行话讲的Snapshot快照它恢复时是将快照文件直接读到内存里对应产生的数据文件为dump.rdb。**通过配置文件中的save参数来定义快照的周期。 如何触发RDB快照保持策略。 配置文件中默认的快照配置这三行save代码的意思是 在3600秒一个小时内如果有1个数据发生改变则进行持久化。 在30秒内如果有10个数据发生改变则进行持久化。原先是 save 300 100我为了后面测试RDB这里进行了修改。 在60秒内如果有10000个数据发生改变则进行持久化。 工作流程 redis根据配置尝试去生成rdb快照文件redis主进程fork一个子进程出来子进程尝试将内存中的数据dump到临时的rdb快照文件中完成rdb快照文件的生成之后覆盖旧的快照文件 优点 只有一个文件 dump.rdb方便持久化容灾性好。性能最大化fork 子进程来完成写操作让主进程继续处理命令保证了 redis 的高性能数据集大时比 AOF 的启动效率更高。 缺点 数据安全性低。RDB 是间隔一段时间进行持久化如果持久化之间 redis 发生故障会发生数据丢失。 AOF持久化Append Only File缩写 将Redis执行的每条写命令记录到单独的aof日志文件中当重启Redis服务时会从持久化的日志文件中恢复数据。 当两种方式同时开启时数据恢复时Redis会优先选择AOF恢复。 配置 # 表示是否开启AOF持久化(默认no,关闭)appendonly yes 工作流程 所有的写入命令会追加到AOF缓冲区中。AOF缓冲区根据对应的策略向硬盘做同步操作。随着AOF文件越来越大需要定期对AOF文件进行重写达到压缩的目的。当Redis服务器重启时可以加载AOF文件进行数据恢复。 优点 数据安全可以配置每进行一次命令操作就记录到 aof 文件中一次。通过 append 模式写文件即使中途服务器宕机可以通过 redis-check-aof 工具解决数据一致性问题。 缺点 AOF 文件比 RDB 文件大且恢复速度慢。数据集大时比 rdb 启动效率低。 6.什么是Redis事务 事务是逻辑上的一组操作要么都执行要么都不执行。Redis 事务不是严格意义上的事务只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的但 Redis 没有在事务上增加任何维持原子性的机制所以 Redis 事务的执行并不是原子性的。 Redis 事务可以理解为一个打包的批量执行脚本redis 事务不保证原子性且没有回滚中间某条命令执行失败前面已执行的命令不回滚后续的指令继续执行。 Redis 事务可以一次执行多个命令 并且带有以下三个重要的保证 批量操作在发送 EXEC 命令前被放入队列缓存。收到 EXEC 命令后进入事务执行事务中任意命令执行失败前面已执行的命令不回滚后续的命令继续执行。事务在执行的过程中不会被其他客户端发送来的命令请求所打断。 Redis事务的三个阶段 事务开始 MULTI命令入队事务执行 EXEC Redis事务的相关命令 命令描述WATCHWATCH 命令是一个乐观锁可以为 Redis 事务提供 check-and-set CAS行为。可以监控一个或多个键一旦其中有一个键被修改或删除之后的事务就不会执行监控一直持续到EXEC命令。UNWATCHUNWATCH命令可以取消watch对所有key的监控。MULTIMULTI命令用于开启一个事务它总是返回OK。MULTI执行之后客户端可以继续向服务器发送任意多条命令这些命令不会立即被执行而是被放到一个队列中当EXEC命令被调用时所有队列中的命令才会被执行。EXECEXEC执行所有事务块内的命令。返回事务块内所有命令的返回值按命令执行的先后顺序排列。当操作被打断时返回空值 nil 。DISCARD通过调用DISCARD客户端可以清空事务队列并放弃执行事务 并且客户端会从事务状态中退出。
7.谈谈你对Redis集群方案——哨兵模式 的理解 哨兵的介绍 sentinel中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件主要有以下功能 集群监控负责监控 redis master 和 slave 进程是否正常工作。消息通知如果某个 redis 实例有故障那么哨兵负责发送消息作为报警通知给管理员。故障转移如果 master node 挂掉了会自动转移到 slave node 上。配置中心如果故障转移发生了通知 client 客户端新的 master 地址。 哨兵用于实现 redis 集群的高可用本身也是分布式的作为一个哨兵集群去运行互相协同工作。 8.Redis主从复制的原理是什么 从节点执行 slaveof 命令从节点只是保存了 slaveof 命令中主节点的信息并没有立即发起复制从节点内部的定时任务发现有主节点的信息开始使用 socket 连接主节点连接建立成功后发送 ping 命令希望得到 pong 命令响应否则会进行重连如果主节点设置了权限那么就需要进行权限验证如果验证失败复制终止。权限验证通过后进行数据同步这是耗时最长的操作主节点将把所有的数据全部发送给从节点。当主节点把当前的数据同步给从节点后便完成了复制的建立流程。接下来主节点就会持续的把写命令发送给从节点保证主从数据一致性。 9.Redis如何实现分布式锁 Redis为单进程单线程模式采用队列模式将并发访问变成串行访问且多客户端对Redis的连接并不存在竞争关系Redis中可以使用SETNX命令实现分布式锁。 SETNX 是『SET if Not eXists』(如果不存在则 SET)的简写。 当且仅当 key 不存在将 key 的值设为 value。若给定的 key 已经存在则 SETNX 不做任何动作 返回值设置成功返回 1 。设置失败返回 0 。 使用SETNX完成同步锁的流程及事项如下 使用SETNX命令获取锁若返回0key已存在锁已存在则获取失败若返回1则获取成功 为了防止获取锁后程序出现异常导致其他线程/进程调用SETNX命令总是返回0而进入死锁状态需要为该key设置一个合理的过期时间 释放锁使用DEL命令将锁数据删除 10.Redis中的缓存穿透、缓存击穿、缓存雪崩是什么 缓存穿透 当我们访问某个key时这个key对应的数据在数据源并不存在每次针对这个key的请求从缓存中都获取不到那么这些请求都会压到数据源DB从而可能压垮数据源。比如用一个不存在的用户id获取用户信息不论缓存还是数据库都没有若黑客利用此漏洞进行攻击可能压垮数据库。 解决方案 对空值缓存如果一个查询返回的数据为空不管是数据是否不存在我们仍然把这个空结果null进行缓存设置空结果的过期时间会很短最长不超过五分钟。设置可访问的名单白名单使用bitmaps类型定义一个可以访问的名单名单id作为bitmaps的偏移量每次访问和bitmap里面的id进行比较如果访问id不在bitmaps里面进行拦截不允许访问。采用布隆过滤器将所有可能存在的数据哈希到一个足够大的bitmaps中一个一定不存在的数据会被 这个bitmaps拦截掉从而避免了对底层存储系统的查询压力。 缓存击穿 key对应的数据存在但在redis中过期此时若有大量并发请求过来这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存这个时候大并发的请求可能会瞬间把后端DB压垮。 解决方案 预先设置热门数据在redis高峰访问之前把一些热门数据提前存入到redis里面加大这些热门数据key的存活时长避免在高并发期间这些数据过期。实时调整现场监控哪些数据热门实时调整key的过期时长。使用锁 缓存雪崩 当我们访问多个key对应的数据时这些key在redis中都过期无法获取了那么这些大量的高并发请求就会转到后端DB中去查找访问进而造成了数据库的崩溃现象。缓存雪崩与缓存击穿的区别在于缓存雪崩是针对很多key而言的缓存而缓存击穿则是针对某一个key。 解决方案 构建多级缓存架构nginx缓存 redis缓存 其他缓存ehcache等。使用锁或队列用加锁或者队列的方式保证不会有大量的线程对数据库一次性进行读写从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况。设置过期标志更新缓存记录缓存数据是否过期设置提前量如果过期会触发通知另外的线程在后台去更新实际key的缓存。将缓存失效时间分散开比如我们可以在原有的失效时间基础上增加一个随机值比如1-5分钟随机这样每一个缓存的过期时间的重复率就会降低就很难引发集体失效的事件。