
获得徽章 0
- #挑战每日一条沸点#
设置热点数据永不过期会出现什么后果?如何解决?
后果
内存溢出:由于热点数据永不过期,Redis中的内存会一直增长,当内存达到上限时会导致内存溢出,影响Redis的性能。
数据过期性能问题:如果Redis中的数据永不过期,可能会导致Redis中的数据变得陈旧,影响业务的准确性。
解决
设置适当的过期时间:针对不同的数据类型和业务需求,设置适当的过期时间,避免内存溢出和数据陈旧。
使用自动过期策略:Redis提供了自动过期策略,可以让Redis自动删除过期的数据,避免内存溢出。
使用缓存淘汰策略:当Redis中的内存达到上限时,可以采取缓存淘汰策略,删除最不常用的数据,释放内存空间。
考虑使用持久化功能:如果数据过于重要,可以考虑使用Redis的持久化功能,将数据保存到硬盘中,避免数据丢失。展开评论点赞 - #挑战每日一条沸点#
redis为什么快?
基于内存:Redis是基于内存的数据库,它的所有数据都存储在内存中,数据的读写速度非常快,不受磁盘速度的限制,因此能够达到非常高的读写性能。
单线程:Redis使用单线程的方式处理客户端请求,避免了多线程之间的上下文切换和锁竞争等问题,因此能够获得更高的性能。
高效的数据结构:Redis支持多种高效的数据结构,如字符串、哈希表、列表、集合和有序集合等,这些数据结构的实现都是针对性的,能够满足不同的业务需求,同时它们的实现都非常高效。
异步的IO:Redis使用异步的IO模型,客户端的请求会先被放入队列中,然后由事件驱动的方式处理,这种方式避免了传统阻塞IO模型中的线程等待,提高了并发性能。
持久化策略:Redis提供了多种持久化方式,包括RDB快照和AOF日志文件,这些方式能够保证数据的安全性,同时对性能的影响也非常小。
综上所述,Redis之所以快,不仅仅是因为它的基于内存、单线程、高效的数据结构和异步IO等特性,还因为它提供了多种持久化方式,能够保证数据的安全性和可靠性。展开评论点赞 - #挑战每日一条沸点#
什么是AOF重写?重写的作用?
AOF文件重写是把Redis进程内的数据转化为写命令并同步到新AOF文件的过程(新的AOF文件会比原来的小)。
AOF重写有两个作用:
降低了文件占用空间
更小的AOF文件可以更快地被Redis加载
开启重写命令
开启 AOF 重写功能,可以调用 BGREWRITEAOF 命令手动执行,也可以设置下面两个配置项,让程序自动决定触发时机:
auto-aof-rewrite-min-size :如果 AOF 文件大小小于该值,则不会触发 AOF 重写。默认值为 64 MB;
auto-aof-rewrite-percentage:执行 AOF 重写时,当前 AOF 大小(aof_current_size)和上一次重写时 AOF 大小(aof_base_size)的比值。如果当前 AOF 文件大小增加了这个百分比值,将触发 AOF 重写。将此值设置为 0 将禁用自动 AOF 重写。默认值为 100。展开评论点赞 - #挑战每日一条沸点#
RDB fork的子进程干了什么?
子进程会先创建一个临时的RDB文件,用于保存Redis服务器的数据。
子进程通过遍历Redis服务器的数据库,将数据库中的所有键值对写入到临时的RDB文件中。
在写入键值对之前,子进程会先将键和值的长度写入到RDB文件中,以便在读取时能够准确地恢复键值对。
在写入键值对之后,子进程会检查是否需要对RDB文件进行压缩。如果需要,子进程会对RDB文件进行压缩,以减小RDB文件的大小。
当子进程完成所有数据写入操作后,它会将RDB文件重命名为指定的文件名,以便在Redis服务器重启时能够使用这个RDB文件进行数据恢复。展开评论点赞 - #挑战每日一条沸点#
bgsave原理
Redis中的bgsave指令用于在后台异步生成RDB快照文件,其原理如下: 1.当执行bgsave指令时,Redis会创建一个子进程(fork),子进程将负责将当前Redis服务器中所有的数据写入到一个临时文件中。 2.在子进程执行期间,Redis主进程会继续处理客户端的请求。 3.当子进程完成所有数据写入操作后,Redis会将这个临时文件重命名为指定的RDB文件名,之后就可以使用这个RDB文件进行数据恢复操作。 需要注意的是,在RDB文件生成期间,Redis服务器会使用Copy-On-Write(写时复制)机制,以保证子进程和主进程之间的内存共享,减少内存的重复拷贝。
bgsave指令的优点是可以在后台进行数据持久化操作,不会阻塞Redis主进程的正常工作,因此对于Redis的性能影响较小。缺点是bgsave指令需要占用一定的磁盘空间,且在子进程执行期间,Redis主进程仍然需要消耗一定的内存空间,因此需要根据系统的实际情况灵活设置bgsave指令的频率和时间,以平衡性能和资源占用的关系。展开评论点赞 - #挑战每日一条沸点#
AOF 比 RDB 优秀的地方 :
RDB 的数据安全性不如 AOF,没有办法实时或者秒级持久化数据。生成 RDB 文件的过程是比较繁重的, 虽然 BGSAVE 子进程写入 RDB 文件的工作不会阻塞主线程,但会对机器的 CPU 资源和内存资源产生影响,严重的情况下甚至会直接把 Redis 服务干宕机。AOF 支持秒级数据丢失(取决 fsync 策略,如果是 everysec,最多丢失 1 秒的数据),仅仅是追加命令到 AOF 文件,操作轻量。
RDB 文件是以特定的二进制格式保存的,并且在 Redis 版本演进中有多个版本的 RDB,所以存在老版本的 Redis 服务不兼容新版本的 RDB 格式的问题。
AOF 以一种易于理解和解析的格式包含所有操作的日志。你可以轻松地导出 AOF 文件进行分析,你也可以直接操作 AOF 文件来解决一些问题。比如,如果执行FLUSHALL命令意外地刷新了所有内容后,只要 AOF 文件没有被重写,删除最新命令并重启即可恢复之前的状态。展开评论点赞 - #挑战每日一条沸点#
AOF为什么需要AOF缓冲区和系统内核缓冲区两个缓冲区,不能合并为一个吗?
为了保证数据的可靠性和高效性。具体原因如下:
AOF缓冲区的存在可以提高写入速度和效率。由于AOF缓冲区位于Redis进程内存中,所以写操作可以快速地被接收并缓存在内存中,这避免了每个写操作都要直接写入磁盘的开销。
系统内核缓冲区的存在可以提高数据的可靠性。当Redis接收到写请求时,数据首先被写入到AOF缓冲区。但是,如果此时Redis进程崩溃,AOF缓冲区中的数据将会丢失。为了防止这种情况发生,Redis会将AOF缓冲区中的数据定期同步至系统内核缓冲区中,从而确保即使Redis进程崩溃,数据在系统内核缓冲区中也能够得到保存。展开评论点赞