番禺五屏网站建设,为什么wordpress慢,凡客家装,哪些属于功能型网站都说学习需要带着问题#xff0c;带着思考进行学习#xff0c;下面就以问题的形式来学习下 Redis 。1、什么是 Redis #xff1f;Redis 是一个高性能的 key-value 数据库#xff1b;作者来自意大利西西里岛的 Salvatore Sanfilippo #xff1b;Redis 使用 ANSI C 语言编写… 都说学习需要带着问题带着思考进行学习下面就以问题的形式来学习下 Redis 。1、什么是 Redis Redis 是一个高性能的 key-value 数据库作者来自意大利西西里岛的 Salvatore Sanfilippo Redis 使用 ANSI C 语言编写、并遵守 BSD 开源协议Redis 支持网络、可基于内存、分布式、也可以用来实现简易的消息队列提供丰富的数据结构字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets) 。2、都说 Redis 是单线程模型到底是什么意思单线程并不是说在 Redis 中所有的操作都是由一个线程来完成核心功能比如网络 IO 和数据的读写是由一个线程来进行处理的其他的一些辅助功能比如持久化、集群间的数据同步是由单独的线程进行处理所以说 Redis 的单线程不是“真正”的单线程。3、为什么在数据读写处理上不使用多线程多线程虽然可以增加系统的吞吐率但线程的切换会有开销多个线程对共享资源的并发处理问题必然会用到各种锁有锁就会存在等待锁的释放反而吞吐率降低了处理各种多线程带来的问题会使系统变得复杂复杂的系统就容易出现问题。4、为什么使用单线程速度却很快Redis 的操作是基于内存的相比较于磁盘速度上有先天的优势Redis 有高效的数据结构比如哈希表、跳表采用了多路复用机制可以并发处理大量的请求实现高吞吐率。5、单线程处理的瓶颈是什么如果有耗时长的操作后面的请求都需要进行等待单个 value 的内容过大在添加、获取、删除时都会比较耗时使用复杂的命令比如SORT/SUNION/ZUNIONSTORE集合的数据非常大而又进行了全量查询。并发量非常大时虽然 IO 有多路复用机制从内核缓冲区中拷贝数据的操作仍然是同步操作会带来性能瓶颈。6、Redis 6.0 调整为多线程的原因上面提到过 6.0 之前的版本是网络 IO 和数据读写是在一个线程中完成的随着硬件性能的提升Redis 的性能瓶颈有时会出现在网络 IO 的处理上也就是说单个主线程处理网络请求的速度跟不上底层网络硬件的速度而读写的操作和网络 IO 是在一个主线程中势必会有所影响所以在 Redis 6.0 中网络 IO 是由多个 IO 线程并行处理可以充分利用服务器的多核资源提高网络读写操作Redis 数据的读写处理仍然在单个主线程中完成。7、在 Redis 中怎样做持久化在 Redis 实现持久化有两种方式AOF 日志 和 RDB 快照AOF 日志命令执行成功后才记录日志命令执行后进行日志记录不会堵塞当前的写操作。命令执行完日志记录前宕机数据会丢失AOF 日志在主线程中执行有 IO 瓶颈时会对后面的操作有堵塞风险数据量比较大的时候恢复很慢。配置项appendfsyncAlways同步写回磁盘每个写命令执行完立即同步将日志写回磁盘Everysec每秒写回磁盘每个写命令执行完只是先把日志写到 AOF 文件的内存缓冲区每隔一秒把缓冲区中的内容写入磁盘No操作系统控制的写回磁盘每个写命令执行完只是先把日志写到 AOF 文件的内存缓冲区由操作系统决定何时将缓冲区内容写回磁盘。RDB 快照和 AOF 相比较RDB 快照记录的是某一个时刻的数据数据恢复是直接将 RDB 文件读入内存速度很快生成 RDB 文件的两种方式save在主线程中执行会导致阻塞bgsave创建一个子进程专门用于写入 RDB 文件避免了主线程的阻塞这也是 Redis RDB 文件生成的默认配置。子进程是由主线程 fork 生成的可以共享主线程的所有内存数据。RDB 快照的间隔时间不宜设置过短因为频繁进行 Redis 的全量快照会带来性能问题前一个快照还没做完后面一个开始了会给磁盘带来压力bgsave 的子进程虽然不会阻塞主线程但创建的过程会阻塞频繁创建也会带来性能问题。解决上面问题的一种办法就是使用增量快照在 Redis 4.0 中提出了一种混合 AOF 日志和 RDB 快照的方式RDB 快照的间隔时间可以设置比较大就不会影响到主线程的操作在快照的间隔期间可以使用 AOF 日志记录所有的操作当下一次做全量 RDB 快照的时候清空 AOF 日志通过 aof-use-rdb-preamble yes 来进行设置。 8、常说的缓存雪崩、击穿、穿透是什么雪崩、击穿、穿透最终的结果都是请求压力会转移到数据库导致系统崩溃但场景有所区别雪崩大量的不同请求无法在 Redis 中命中导致请求都流向了数据库数据库的压力剧增发生雪崩的原因可能是有大量的缓存 Key 在同一时间过期。击穿并发很大的情况下针对某个特定的请求缓存中数据不存在导致都请求到了数据库造成数据库压力过大原因通常是某个 Key 过期了;和雪崩相比较击穿是针对的单个 Key。穿透缓存穿透是指请求的数据不在 Redis 缓存中也不在数据库中导致访问缓存时找不到数据会去请求数据库而在数据库中也找不到相应的数据并发比较大的时候数据库会遭受巨大的压力发生穿透的原因可能有两个误操作导致 Redis 和数据库中的数据都被删除了恶意攻击。9、怎样解决雪崩、击穿、穿透带来的问题雪崩缓存的数据过期时间设置随机防止同一时间大量数据过期现象发生如果缓存数据库是分布式部署将热数据均匀分布在不同缓存数据库中当发生雪崩时可以通过服务降级来应对。击穿设置热数据永远不过期。穿透在接口层进行校验将恶意请求直接过滤掉使用布隆过滤器快速判断数据是否存在缓存空值或缺省值。10、怎样设计缓存的淘汰机制业务数据在不断地增长不可能将所有数据全部存储在 Redis 缓存中内存的价格远远大于磁盘。所以需要做淘汰机制的设计缓存的淘汰就是根据一定的策略将不太重要的数据从缓存中进行删除Redis 一共有 8 种淘汰策略在 Redis 4.0 之前有 6 种4.0 之后又增加了 2 种如下图缓存策略的解释volatile-random在设置了过期时间的数据中进行随机删除volatile-ttl根据过期时间越早过期的数据越先删除volatile-lru在设置了过期时间的数据中根据 LRU 算法进行数据删除volatile-lfu在设置了过期时间的数据中根据 LFU 算法进行数据删除allkeys-lru在所有数据中根据 LRU 算法进行数据删除allkeys-random在所有数据中进行随机删除allkeys-lfu在所有数据中根据 LFU 算法进行数据删除默认情况下当 Redis 的使用空间超过 maxmemory 设置的大小时并不会淘汰数据也就是执行的 noeviction 策略如果写满再有写请求时就会出错如果业务中有明显的热数据和冷数据优先使用 allkeys-lru 策略让热数据保留在缓存中如果业务中没有明显冷热数据可以使用 volatile-random 或 allkeys-random。11、怎样保证缓存和数据库的数据一致缓存和数据库一致的意思是当缓存中有数据时缓存和数据库数据相同当没有数据时数据库中是最新的在做增删改操作的时候对缓存的更新有两种方式新增直接添加到数据库删除和修改时先更新缓存然后同步或异步进行数据库的更新新增直接添加到数据库删除和修改时先更新数据库再删除对应的缓存。上面的操作都涉及到两个操作 Redis 和操作数据库当其中一个成功一个失败时就会出现数据不一致的情况解决不一致的问题将操作通过消息队列异步处理设置重试机制保证最终的一致性使用分布式事务保证操作 Redis 和数据库的两个操作在一个事务中。12、Redis 有什么使用规范Redis 单实例的内存大小都不要设置太大建议在 2~6GB 设置太大会导致 RDB 快照、从 AOF 日志恢复、主从集群进行数据同步等都会耗时很长阻塞正常请求的处理对集合进行全量数据获取时时间复杂度是 O(n)所以这个 n 不宜太大单个 key 的值不要太大即便是最新的 6.0 版本在读写这部分仍然是单线程大 value 的读取会耗时导致堵塞根据具体的业务特点设计好淘汰策略使用高效的序列化和压缩方法对缓存数据进行处理来进一步提升性能生产环境中禁止使用 KEYS、FLUSHALL、FLUSHDB 等操作数据量大的时候耗时长会阻塞主线程有时为了排查错误会使用 MONITOR 命令进行监控该命令也会对性能造成严重影响Redis 的知识远不止如此本文总结了一些我认为比较重要的一些点希望对您有所帮助