当前位置: 首页 > news >正文

【redis】—— 初识redis(redis基本特征、应用场景、以及重大版本说明)

序言

  • 本文将引导读者探索Redis的世界,深入了解其发展历程、丰富特性、常见应用场景、使用技巧等,最后会对Redis演进过程中具有里程碑意义的版本进行详细解读。

(一)初始redis

Redis是一种基于键值对(key-value)的NoSQL数据库。与许多其他键值对数据库不同,Redis中的值可以由多种数据结构和算法构成,包括string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog以及GEO(地理信息定位)等。因此,Redis能够满足多种应用场景的需求。此外,由于Redis将所有数据存储在内存中,其读写性能极为出色。

不仅如此,Redis还具备数据持久化的能力。它可以通过快照和日志的方式,将内存中的数据保存到硬盘上,从而在断电或机器故障等情况下,确保数据不会丢失。除了上述功能,Redis还提供了多种附加功能,如键过期、发布订阅、事务、流式处理、Lua脚本等。

💨 总之,如果在合适的场景中正确使用Redis,它将像一把瑞士军刀一样,功能强大且无所不能。


2008年,Redis的创始人Salvatore Sanfilippo在开发一个名为LLOOGG的网站时,面临着一个挑战:需要实现一个高性能的队列功能。最初,他尝试使用MySQL来实现这一功能,但无论怎样优化SQL语句,网站的性能始终无法得到显著提升。与此同时,由于资金有限,他决定自己动手开发一个专门为LLOOGG设计的数据库,这就是Redis的雏形。

随着时间的推移,Salvatore Sanfilippo不断完善这个数据库,并在2010年将Redis 1.0的源码发布到了GitHub上。或许连他自己都没有预料到,Redis后来会如此受欢迎,并迅速成为全球开发者社区中备受欢迎的NoSQL数据库之一。


如果现在有人问Redis的作者有哪些公司在使用Redis,他可能会幽默地回答:“还有谁没用Redis吗?”当然,这只是一句玩笑话。但从Redis官方的统计数据来看,确实有许多重量级公司在广泛使用Redis。例如,国外的Twitter、Instagram、StackOverflow、Github等知名平台都在依赖Redis的强大功能,而在国内,使用Redis的公司更是数不胜数。

从体量上看,新浪微博可以说是全球最大的Redis用户之一。除了新浪微博,像阿里巴巴、腾讯、搜狐、优酷土豆、美团、小米、唯品会等国内知名企业也都是Redis的忠实用户。此外,许多开源技术,如ELK(Elasticsearch、Logstash、Kibana)已经将Redis作为其架构中的重要组成部分。

不仅如此,Redis还提供了模块系统,允许第三方开发者扩展其功能,进一步增强了Redis的适用性和威力。因此,可以说,熟练掌握Redis的使用和运维已经成为开发与运维人员的一项必备技能。


(二)redis特性

Redis之所以受到众多公司的青睐,必然有其过人之处。以下是关于Redis的8个关键特性:

👉 速度快👈

正常情况下,Redis执行命令的速度极快,官方宣称其读写性能可达到每秒10万次操作,当然这一数字也依赖于具体的硬件配置,但在此我们先搁置机器性能上的差异不谈,仅聚焦于剖析Redis之所以如此迅速的四大核心要素:

  • Redis之所以能够实现高速操作,首要原因在于其所有数据均被存储在内存中。下表(假设为某数据源提供的硬件执行速度对比表)中,谷歌公司于2009年公布的数据显示,内存相较于其他存储层级具有显著的速度优势,因此将数据存储于内存是Redis实现高速性能的核心因素。

  • 此外,Redis采用C语言进行开发。C语言编写的程序通常与操作系统更为贴近,能够更有效地利用系统资源,因此执行速度相对较快。
  • 再者,Redis设计为单线程模型,这一特性避免了多线程环境下可能发生的竞争问题,如锁等待和资源冲突等,从而进一步提升了执行效率。(Redis在6.0版本引⼊了多线程机制,但主要也是在处理网络和IO,不涉及到数据命令,即命令 的执行仍然采用了单线程模式。)
  • 最后也离不开作者对于Redis源代码可以说是精打细磨,曾经有⼈评价Redis是少有的集性能和优雅于一体的开源代码。

👉 基于键值对的数据结构服务器👈

众多编程语言均内置了类似于字典的功能,例如C++中的std::map、Java中的HashMap、以及Python中的dict等。这种以键值对形式组织数据的方法,在编程中极为常见。值得注意的是,与许多仅支持字符串作为值的键值对数据库不同,Redis的键值体系更为灵活和强大。在Redis中,值不仅可以是简单的字符串,还能是复杂的数据结构,这一特性极大地拓宽了其应用场景并提升了开发效率。

Redis,全称为REmote Dictionary Server,它主要提供了五种基础数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)以及有序集合(也称作zset或sorted set)。此外,Redis还在字符串类型的基础上,创新性地引入了位图(Bitmaps)和HyperLogLog这两种特殊的数据结构。随着基于位置服务(Location-Based Service, LBS)的蓬勃发展,Redis在3.2版本中更是加入了地理空间索引(GEO)功能,为开发者提供了处理地理位置数据的强大工具。

总之,Redis凭借这些丰富多样的数据结构,使得开发者能够轻松构建出各种富有创意和实用价值的应用。


👉 丰富的功能 👈

除了五种核心数据结构(字符串、哈希、列表、集合、有序集合)之外,Redis还提供了诸多额外的强大功能,以满足多样化的应用场景需求:

  • 键过期功能:Redis允许为键设置过期时间,当键到期时会自动删除,这一特性常被用于实现高效的缓存机制。

  • 发布/订阅功能:Redis内置了发布/订阅消息系统,使得消息的发送者和接收者可以解耦,实现灵活的消息传递和处理。

  • Lua脚本支持:Redis支持执行Lua脚本,开发者可以利用Lua语言编写自定义的Redis命令或复杂的操作逻辑,从而提升开发效率和代码的可维护性。

  • 简单事务功能:Redis提供了简单的事务处理机制,通过MULTI、EXEC等命令,可以确保一系列命令在同一个事务中按顺序执行,从而在一定程度上保证数据的一致性和完整性。

  • 流水线(Pipeline)功能:Redis的流水线机制允许客户端将多个命令打包成一次请求发送给服务器,服务器在接收完所有命令后再统一回复,这种方式显著减少了网络往返次数,降低了网络开销,提升了命令执行的总体效率。

这些额外的功能使得Redis不仅是一个高性能的键值存储系统,更是一个功能全面、易于扩展的数据库解决方案。


👉 简单稳定 👈

Redis的简洁性主要体现在以下三个方面。

  1. 首先,Redis的源代码非常精炼,早期版本的代码量大约在2万行左右,即便在3.0版本之后,由于加入了集群特性,代码量增加到了5万行左右,但与其他许多NoSQL数据库相比,其代码量仍然相对较少。这意味着普通的开发和运维人员有更大的可能性深入理解并掌握Redis。
  2. 其次,Redis采用了单线程模型,这一设计不仅简化了Redis服务端的处理逻辑,降低了并发控制的复杂性,同时也使得客户端的开发工作变得更加直观和简单。
  3. 最后,Redis不依赖于操作系统中的第三方类库。例如,与Memcache需要依赖libevent这样的系统类库不同,Redis自行实现了事件处理的相关功能,这使得其更加独立和可控。

然而,与Redis的简洁性相对应的是其出色的稳定性。在实际应用中,Redis很少因为自身的BUG而导致服务中断。这种稳定性使得Redis成为许多高性能、高可靠性应用场景的首选数据库解决方案。


👉 客户端语言多 👈

Redis提供了一套简洁的TCP通信协议,这使得多种编程语言能够轻松地与Redis进行交互。由于Redis在社区和各大企业中享有广泛的认可度和应用,因此支持Redis的客户端语言也非常丰富,几乎涵盖了所有主流的编程语言,包括但不限于C、C++、Java、PHP、Python以及Node.js等。这些客户端库为开发者提供了便捷的接口,使得他们能够轻松地在自己的应用程序中集成Redis。在后续的内容中,我们将详细阐述如何使用这些Redis客户端库。


👉 持久化 👈

普遍而言,将数据仅存放在内存中确实存在一定的风险,因为一旦发生断电或机器故障等意外情况,重要的数据可能会因此丢失。为了应对这一挑战,Redis提供了两种有效的持久化机制:RDB(Redis Database Backup file)和AOF(Append Only File)。这两种策略均能够将内存中的数据安全地保存到硬盘上(如下图所示),从而确保了数据的可持久性。在后续的内容中,我们将对Redis的这两种持久化机制进行详尽的说明和探讨。


👉 主从复制 👈

Redis提供了复制功能,该功能能够创建多个包含相同数据的Redis副本,这些副本通常被称为从节点(Replica)或备节点(如下图所示)。复制功能不仅是数据冗余和备份的重要手段,同时也是构建分布式Redis集群的基础。


👉 高可用(HighAvailability)和分布式(Distributed)👈

Redis 提供了高可用实现的Redis哨兵(RedisSentinel),能够保证Redis结点的故障发现和故 障自动转移。也提供了Redis集群(RedisCluster),是真正的分布式实现,提供了高可用、读写和 容量的扩展性。


(三)应用场景

上节我们已经了解了Redis的若干特性,本节来看⼀下Redis的典型应用场景有哪些?

3.1 Redis 可以做什么

 为了充分理解Redis的作用和重要性,读者需要对网站架构具备一定的基础知识。然而,部分读者可能在这方面存在知识空缺,大家可先去了解相关基础知识之后,再回来继续本篇的学习,将会更加得心应手,收获也会更加丰富。

👉 缓存(Cache)👈

缓存机制在大型网站中的应用几乎无处不在,其重要性不言而喻。通过合理使用缓存,我们不仅可以显著提升数据的访问速度,还能有效减轻后端数据源的负载压力。Redis作为一款强大的缓存工具,不仅支持键值对的过期时间设置,还提供了对最大内存使用的灵活控制以及内存溢出时的淘汰策略。可以说,一个精心设计的缓存方案对于网站的稳定运行起着至关重要的作用,它就像网站的守护者,确保网站能够在高并发、大数据量的情况下依然保持流畅和稳定。


👉 排行榜系统 👈

排行榜系统几乎成为了各类网站的标配,无论是基于热度、发布时间,还是其他复杂维度计算得出的排名,都深受用户欢迎。Redis提供了列表(List)和有序集合(Sorted Set)这两种数据结构,它们为构建各种排行榜系统提供了极大的便利。通过合理利用这些数据结构,开发者可以轻松地实现排行榜的创建、更新和展示,从而为用户提供更加丰富和个性化的内容体验。


👉 计数器应用 👈

计数器在网站运营中扮演着举足轻重的角色,比如在视频网站上记录播放次数,在电商网站上记录浏览量。为了确保数据的实时性,每当发生一次播放或浏览行为时,都需要对相应的计数器进行加1操作。然而,在并发量巨大的情况下,这对传统关系型数据库的性能构成了严峻挑战。幸运的是,Redis天生就具备高效的计数能力,其出色的性能使其成为构建计数器系统的理想选择。通过Redis,我们可以轻松应对高并发场景下的计数需求,确保数据的准确性和实时性。


👉 社交网络 👈

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太合适保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。


👉 消息队列系统 👈

消息队列系统无疑是大型网站不可或缺的基础组件之一,它凭借业务解耦、非实时业务削峰填谷等特性,在系统中发挥着举足轻重的作用。Redis虽然主要以缓存数据库的身份闻名,但它也提供了发布/订阅(Pub/Sub)功能和阻塞队列的功能,这些特性使得Redis能够在一定程度上胜任消息队列的角色。尽管与专业级的消息队列系统相比,Redis在功能丰富度和性能优化上可能稍逊一筹,但对于大多数常见的消息队列需求而言,Redis已经能够提供足够强大的支持。


3.2 Redis 不可以做什么

事实上,如同任何一项技术一样,Redis也有其特定的应用场景和局限性。这意味着Redis并非无所不能,它擅长解决某些问题,但同时也存在许多它不适宜处理的场景。我们可以从数据规模和数据访问频率(冷热数据)的角度来深入探讨这一点。

从数据规模的角度来看,数据可以被划分为大规模数据和小规模数据。Redis将数据存储在内存中,尽管当前内存价格已经相对亲民,但对于极其庞大的数据集,例如每天涉及数亿条用户行为数据的场景,使用Redis进行存储将变得极为昂贵,甚至不切实际。

从数据冷热的角度来看,数据可以分为热数据和冷数据。热数据指的是那些需要频繁访问和操作的数据,而冷数据则相反。以视频网站为例,视频的基本信息(如标题、导演、演员阵容等)通常会在多个业务线中频繁使用,属于热数据。而用户的观看记录则不一定经常需要访问,属于冷数据。这里我们暂时不考虑两者在数据规模上的差异,仅从数据冷热的角度出发。对于热数据,如视频基本信息,将其存储在Redis中可以显著加速读写速度,并减轻后端存储系统的负载,从而实现资源的高效利用。然而,对于冷数据,如用户观看记录,将其放在Redis中则是对内存资源的一种浪费。

综上所述,合理区分数据的规模和冷热程度,有助于我们更有效地利用Redis这一强大工具,同时避免不必要的资源浪费。


(四)版本说明

Redis 遵循了Linux操作系统所采用的版本号命名惯例:

  • 版本号的第二位为奇数,则代表该版本为非稳定版(例如2.7、2.9、3.1);
  • 若为偶数,则代表该版本为稳定版(例如2.6、2.8、3.0、3.2)。

当前的奇数版本预示着它是下一个稳定版本的开发阶段,例如2.9版本即为3.0版本的前身。因此,在生产环境中,我们通常选用偶数版本的Redis以确保稳定性;而若希望提前体验并应用某些新特性,则可以选择最新的奇数版本。截至目前,最新的版本是7.0版本。本小节将概述Redis发展历程中的几个关键版本及其特色功能。

4.1 Redis 2.6

Redis 2.6 在2012年正式发布,相比于Redis2.4,主要特性如下:

  • 服务端支持Lua脚本
  • 去掉虚拟内存相关功能。
  • 放开对客户端连接数的硬编码限制。
  • 键的过期时间支持毫秒。
  • 从结点提供只读功能。
  • 两个新的位图命令:bitcount和bitop。
  • 增强了redis-benchmark的功能:支持定制化的压测、CSV格式输出等功能。
  • 基于浮点数自增命令:incrbyfloat和hincrbyfloat。
  • redis-cli 可以使用--eval参数实现Lua脚本执行。
  • shutdown命令增强。
  • Info可以按照setction输出,并且添加了⼀些统计项。
  • 重构了大量的核心代码,所i有集群相关的代码都去掉了,会在3.0支持cluster功能。
  • sort命令优化。

4.2 Redis 2.8

Redis 2.8 在2013年正式发布,相比于Redis2.6,主要特性如下:

  • 添加部分主从复制的功能,在⼀定程度上降低了由于网络问题,造成频繁全量复制生成RDB对系统造成的压力。
  • 尝试性地支持IPv6。
  • 可以通过configset命令设置maxclients。
  • 可以用bind命令绑定多个IP地址。
  • Redis设置了明显的进程名,方便使用ps命令查看系统进程。
  • configrewrite 命令可以将configset持久化到Redis配置文件中。
  • 发布订阅添加了pubsub命令。
  • RedisSentinel第⼆版,相比于Redis2.6的RedisSentinel,此版本已经变成生产可用。

4.3 Redis 3.0

Redis 3.0 在2015年正式发布,相比于Redis 2.8,主要特性如下:

  • Redis提供的官方分布式实现,为Redis提供了水平扩展和高可用性支持。
  • 优化了小对象的内存访问,使得在特定的工作负载下,访问速度大幅提升。
  • 优化了LRU(最近最少使用)算法,显著提高了性能。
  • 增加了链接缓存功能,大幅提高了键迁移的速度。
  • MIGRATE命令新增参数:copy:迁移键时保留原键。replace:迁移键时替换目标键。
  • 在指定时间内停止处理客户端请求,用于系统维护或数据一致性调整。
  • 现在可以使用不同的单位来设置maxmemory参数(如KB、MB、GB等),而不仅仅是字节。
  • 日志中会反映当前实例的角色(master或slave),有助于快速识别实例状态。
  • 提高了INCR命令在处理高并发递增操作时的性能。
  • 提高了BITCOUNT命令在处理大规模位图数据时的性能。

4.4 Redis 3.2

Redis 3.2 在2016年正式发布,相比于Redis 3.0,主要特性如下:

◦ 添加GEO相关功能

  • 提供地理位置相关的操作,如计算两点之间的距离等。

◦ SDS优化

  • 在速度和节省空间上都进行了优化,提升了字符串处理的性能。

◦ 支持进程管理

  • 支持使用upstart或systemd来管理Redis进程,提高了系统管理的便捷性。

◦ 新的List编码类型

  • 引入quicklist作为新的List编码类型,结合了ziplist和linkedlist的优点。

◦ 从节点数据一致性

  • 从节点读取过时数据保证一致性,增强了分布式环境下的数据可靠性。

◦ 添加hstrlen命令

  • 提供获取哈希表中指定字段值的长度的新命令。

◦ 加强debug命令

  • 支持更多的参数,提供更丰富的调试信息。

◦ Lua脚本功能加强

  • 增强了Lua脚本的执行效率和功能,提供了更好的脚本开发体验。

◦ 添加LuaDebugger

  • 提供了Lua脚本的调试工具,方便开发者进行脚本调试。

◦ config set支持更多参数

  • 允许用户通过config set命令设置更多的配置参数,增强了配置的灵活性。

◦ 优化崩溃报告

  • 优化了Redis崩溃后的相关报告,提供了更详细的崩溃信息和诊断工具。

◦ 新的RDB格式

  • 引入新的RDB格式,同时保持对旧RDB格式的兼容性,确保数据迁移的便利性。

◦ 加速RDB加载速度

  • 提高了RDB文件的加载速度,缩短了Redis实例的启动时间。

◦ spop命令支持个数参数

  • 允许用户通过spop命令一次弹出多个元素,提高了操作的灵活性。

◦ cluster nodes命令加速

  • 对cluster nodes命令进行了优化,提高了集群节点信息的检索速度。

◦ Jemalloc更新到4.0.3版本

  • 更新了内存分配器Jemalloc到4.0.3版本,提高了内存管理的性能和稳定性。

4.5 Redis 4.0

Redis 4.0 在2017年正式发布,相比于Redis 3.2,主要特性如下:

◦ 模块系统

  • 提供了模块系统(module),方便第三方开发者拓展Redis的功能,增强了Redis的扩展性和灵活性。

◦ PSYNC 2.0

  • 优化了主从节点切换时的复制机制,解决了以前版本中主从切换必然引发全量复制的问题,提高了复制效率和可靠性。

◦ LFU算法

  • 提供了新的缓存剔除算法:LFU(Least Frequently Used),与LRU算法不同,LFU是基于访问次数的淘汰规则,并对已有算法进行了优化,提高了缓存的命中率和性能。

◦ 非阻塞删除功能

  • 提供了非阻塞的del和flushall/flushdb功能,新添加了unlink命令。unlink命令是del命令的异步版本,它可以将删除指定键的操作放在后台线程中执行,避免了删除大键时阻塞主线程的问题。

◦ 内存监控

  • 提供了memory命令,实现了对内存更为全面的监控统计,帮助用户更好地了解Redis的内存使用情况。

◦ 交互数据库功能

  • 提供了交互数据库功能,实现了Redis内部数据库的数据置换,方便用户在不同数据库之间迁移数据。

◦ RDB-AOF混合持久化

  • 提供了RDB-AOF混合持久化格式,充分利用了AOF和RDB各自的优点,既保证了数据的安全性,又提高了持久化的效率。

◦ Redis Cluster兼容性

  • Redis Cluster兼容NAT和docker环境,使得Redis Cluster在更多场景下都能稳定运行,提高了Redis Cluster的适用性和可靠性。

4.6 Redis 5.0

Redis 5.0 在2018年正式发布,相比于Redis 4.0,主要特性如下:

◦ 新的流数据类型

  • 引入了流(stream)数据类型,为消息队列和日志处理提供了更高效的数据结构。

◦ Redis模块API扩展

  • 新的Redis模块API,包括定时器、集群和字典API,为第三方开发者提供了更丰富的功能接口。

◦ RDB存储优化

  • RDB现在可存储LFU(Least Frequently Used)和LRU(Least Recently Used)信息,有助于更好地管理内存和缓存。

◦ redis-cli集群管理器移植

  • redis-cli中的集群管理器从Ruby(redis-trib.rb)移植到了C语言代码,提高了性能和稳定性。

◦ 新的有序集合命令

  • 引入了zpopmin/zpopmax和阻塞变体命令,为有序集合提供了更灵活的操作方式。

◦ Active Defragmentation升级

  • 升级Active Defragmentation至v2版本,提高了内存碎片整理的效率和效果。

◦ HyperLogLog增强

  • 增强了HyperLogLog的实现,提高了基数估计的准确性和性能。

◦ 内存统计报告改进

  • 提供了更好的内存统计报告,帮助用户更好地了解Redis的内存使用情况。

◦ 帮助子命令

  • 许多包含子命令的命令现在都有一个help子命令,方便用户查看命令的使用说明。

◦ 客户端性能优化

  • 在客户端频繁连接和断开连接时,性能表现更好,提高了Redis的并发处理能力。

◦ 错误修复和改进

  • 进行了许多错误修复和其他方面的改进,提高了Redis的稳定性和可靠性。

◦ Jemalloc升级

  • 升级Jemalloc至5.1版本,提高了内存管理的性能和稳定性。

◦ clientunblock和clientid

  • 引入了clientunblock和clientid功能,提供了更灵活的客户端管理方式。

◦ lolwut命令

  • 新增了lolwut命令,用于娱乐和测试(通常是一个内部或开发者的玩笑命令)。

◦ 术语更新

  • 在不存在需要保持向后兼容性的地方,弃用了"slave"术语,采用了更中性的术语。

◦ 网络层优化

  • 在网络层中进行了差异优化,提高了网络通信的效率和稳定性。

◦ Lua脚本支持增强

  • 增强了对Lua脚本的支持,包括将Lua脚本更好地传播到replicas/AOF、Lua脚本现在可以超时并在副本中进入-BUSY状态等。

◦ 动态HZ

  • 引入了动态的HZ(DynamicHZ)以平衡空闲CPU使用率和响应性,提高了Redis的性能和能效。

◦ 核心代码重构和改进

  • 对Redis核心代码进行了重构并在许多方面进行了改进,提高了Redis的整体性能和稳定性。

4.7 Redis 6.0

Redis 6.0在2020年正式发布,相比于Redis 5.0,引入了一系列重要的新特性和改进。以下是Redis 6.0的主要特性:

  1. 多线程IO
    • Redis 6.0引入了多线程IO处理,但多线程部分仅用于处理网络数据的读写和协议解析,执行命令仍然是单线程。这一改进旨在提高网络请求处理的并行度,从而提升整体性能。需要注意的是,多线程IO在Redis 6.0中默认是禁用的,需要在redis.conf配置文件中手动启用。
  2. 客户端缓存(client-side-caching)
    • Redis 6.0实现了客户端缓存功能,允许客户端在本地缓存读取的数据,以减少对Redis服务器的访问次数。这一功能通过跟踪(Tracking)机制实现,服务端会记录客户端读取过的key,并监测key的修改情况。一旦key值发生变化,服务端会通知客户端缓存失效。客户端缓存功能支持普通模式和广播模式,以适应不同的应用场景。
  3. RESP3协议支持
    • Redis 6.0在兼容RESP2协议的基础上,开始支持RESP3协议。RESP3协议是Redis序列化协议的更新版本,提供了更丰富的数据类型和更灵活的错误处理机制。这有助于提升客户端与服务端之间的通信效率和兼容性。
  4. SSL连接支持
    • Redis 6.0支持SSL连接,提高了数据传输的安全性。通过配置SSL/TLS,可以确保客户端与Redis服务器之间的通信被加密,防止数据泄露和篡改。
  5. 增强的ACL权限控制
    • Redis 6.0提供了更细粒度的ACL(访问控制列表)权限控制。管理员可以按照命令粒度控制不同用户的访问权限,实现对不同key授予不同的操作权限。此外,Redis 6.0还新增了一个ACL日志命令,允许查看所有违反ACL规则的客户端操作,这对于调试ACL问题非常有用。
  6. RDB日志加载速度提升
    • Redis 6.0对RDB日志的加载速度进行了优化,提高了Redis服务器的启动速度和数据恢复效率。
  7. 官方Redis集群代理模块(RedisClusterProxy)
    • Redis 6.0发布了官方的Redis集群代理模块,为Redis集群提供了更灵活和高效的代理服务。这一模块有助于简化Redis集群的管理和配置,提高集群的可用性和性能。
  8. 新模块API
    • Redis 6.0提供了众多的新模块API,为第三方开发者提供了更丰富的功能接口。这些API允许开发者创建自定义的数据类型、命令和扩展Redis的功能,从而满足更广泛的应用场景和需求。

4.8 Redis 7.0

Redis 7.0在2022年正式发布,相比Redis 6.0,其引入了一系列重要的特性和改进。以下是对Redis 7.0主要特性的详细归纳:

  1. AOF文件存储方式的改进

    • Redis 7.0将AOF(Append Only File)文件的存储方式从单一文件改为了在一个文件夹下存储多个文件。这一改进有助于优化AOF的重写过程,减少资源消耗,并提高Redis的性能和稳定性。具体来说,AOF被分为三种类型:base AOF、incr AOF和History AOF。其中,base AOF用来记录AOF重写时刻的全量内存数据,incr AOF用来记录重写过程中所有增量数据。这种多文件设计的理念使得新版AOF无需做数据合并,全量和增量被放在不同文件中,天然隔离。
  2. RDB版本升级

    • Redis 7.0将持久化文件RDB的版本升级为10,这一版本与之前的RDB文件版本不再兼容。这意味着在升级到Redis 7.0后,可能需要对旧的RDB文件进行转换或迁移。同时,在读取老的RDB文件格式时,Redis 7.0会将ziplist转换为listpack,这种转换发生在从磁盘读取文件或从主节点进行复制文件的时候。
  3. 安全性增强

    • 在redis.conf配置文件中,protected-mode默认更改为yes。这一改变提高了Redis服务器的安全性,只有当客户端在授权的情况下才能连接到Redis服务器。如果希望在没有授权的情况下允许客户端连接,可以将protected-mode设置为no,但这样做会降低安全性。
  4. ACL中Pub/Sub Channel的默认阻塞

    • 在Redis 7.0中,ACL(Access Control List)中的Pub/Sub Channel默认是被阻塞的。这意味着在没有明确授权的情况下,客户端无法发布或订阅消息。这一特性有助于防止未经授权的客户端滥用Pub/Sub功能。
  5. 从节点中TTL时间标识的改进

    • 在Redis 7.0的从节点中,TTL(Time To Live)的时间标识的是绝对时间,而不再是相对时间。这一改进保证了过期数据能够被及时删除,从而提高了Redis的数据一致性和准确性。
  6. 不再支持Gopher协议

    • Redis 7.0不再支持Gopher协议。Gopher协议是一种早期的网络协议,用于在Internet上传输文本数据。随着网络技术的发展和Redis应用场景的扩展,Gopher协议已经逐渐被淘汰。
  7. replica-serve-stale-data配置的改变

    • 当在配置文件中设置replica-serve-stale-data=no时,如果主节点不再提供服务(例如因为故障或网络问题),从节点将不会响应ping命令等查询操作。这一特性有助于防止在主节点故障时从节点提供过时或不一致的数据。

(五)总结

Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。本文从初始redis、redis特性、应用场景以及版本说明四个方面进行介绍。

(一)初始redis

首先带大家对redis有个基本的认识,并介绍其作为开发人员需要具备相应的能力Redis是高性能键值对NoSQL数据库,功能丰富,广泛应用于全球各大公司,成为开发与运维必备技能。

(二)redis特性

Redis具有多种特性,使其成为许多应用场景的首选。首先,Redis支持多种数据类型,如字符串、列表、集合、有序集合和哈希等,这些数据类型都支持push/pop、add/remove及取交集并集和差集等丰富的操作。其次,Redis支持持久化,可以将内存中的数据保存到磁盘中,以防止数据丢失。此外,Redis还支持复制和分片,可以实现数据的冗余和负载均衡。最后,Redis具有丰富的客户端库和生态系统,可以方便地与其他编程语言进行集成。

(三)应用场景

Redis的应用场景非常广泛,以下是一些常见的应用场景:

3.1 Redis 可以做什么

  • 缓存:Redis可以作为缓存层,存储热点数据,提高数据访问速度。
  • 会话存储:Redis可以存储用户会话信息,如登录状态、购物车等。
  • 消息队列:Redis的列表和发布/订阅功能可以实现简单的消息队列系统。
  • 排行榜:Redis的有序集合可以用来实现排行榜功能。
  • 实时分析:Redis可以存储和分析实时数据,如用户行为、流量统计等。

3.2 Redis 不可以做什么

  • 大规模数据存储:虽然Redis支持持久化,但由于其内存数据库的特性,不适合存储大规模数据。
  • 复杂查询:Redis的查询功能相对简单,不适合进行复杂的SQL查询。
  • 事务处理:Redis的事务处理功能相对较弱,不适合进行复杂的事务操作。

(四)版本说明

Redis在不同版本中引入了许多新特性和改进。例如,Redis 6.0引入了多线程IO处理,提高了网络请求处理的并行度;Redis 7.0则对AOF文件的存储方式进行了改进,提高了持久化的性能和稳定性。用户在选择Redis版本时,需要根据自己的需求和场景进行选择,以确保Redis的稳定性和性能。

相关文章:

【redis】—— 初识redis(redis基本特征、应用场景、以及重大版本说明)

序言 本文将引导读者探索Redis的世界,深入了解其发展历程、丰富特性、常见应用场景、使用技巧等,最后会对Redis演进过程中具有里程碑意义的版本进行详细解读。 (一)初始redis Redis是一种基于键值对(key-value&#x…...

服务器显卡和桌面pc显卡有什么不同

服务器显卡和桌面 PC 显卡在设计目标、性能优化、功能支持和硬件规格上都有显著不同。以下是主要区别: 1. 设计用途 服务器显卡:主要用于计算、深度学习、数据分析、科学计算、虚拟化和图形渲染等任务。其设计目标是持续高负载计算,保证高稳…...

Chrome使用IE内核

Chrome使用IE内核 1.下载扩展程序IE Tab 2.将下载好的IE Tab扩展程序拖拽到扩展程序界面,之后重启chrome浏览器即可...

类和对象(C++)——默认成员函数,构造函数,析构函数

1. 类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载&#…...

深入理解 Vue v-model 原理与应用

一、引言 在 Vue.js 开发中,v-model是一个非常重要且强大的指令。它为开发者在处理表单输入和数据双向绑定等场景中提供了极大的便利。无论是新手还是有经验的开发者,深入理解v-model对于高效地构建 Vue 应用至关重要。本文将对v-model进行深入剖析,从其基本原理、使用方式…...

内网域环境、工作组、局域网等探针方案

1. 信息收集 1.1 网络收集 了解当前服务器的计算机基本信息,为后续判断服务器角色,网络环境做准备 systeminfo 详细信息 net start 启动服务 tasklist 进程列表 schtasks 计划任务(受权限影响) 了解当前服务器的网络接口信息…...

uniapp—android原生插件开发(3Android真机调试)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 一、打包uniapp资源包: 打包…...

goframe开发一个企业网站 统一返回响应码 18

响应码的logic package returncodeimport ("context""gf_new_web/internal/service""github.com/gogf/gf/v2/errors/gcode""github.com/gogf/gf/v2/frame/g" )type sReturncode struct { }var (insReturncode sReturncode{}…...

基于STM32的智能门禁系统设计

引言 本项目基于STM32微控制器设计了一个智能门禁系统,通过集成多个传感器模块和控制设备,实现对门禁系统的自动化管理与控制。该系统能够通过RFID卡、密码输入、以及指纹传感器等多种方式对进出人员进行验证,并结合LCD显示屏提供实时信息反…...

Python学习从0到1 day28 Python 高阶技巧 ⑧ 递归

那就祝我们爬不同的山,还能回到同一条路上,不是时时见面,但是时时惦记之人 —— 24.11.13 递归 1.什么是递归 递归在编程中是一种非常重要的算法 递归:即方法(函数)自己调用自己的一种特殊编程写法 函数调用自己,即…...

知识见闻 - 苹果手机拨号键长按

苹果手机(iPhone)在拨号界面长按按键时有一些特定的功能。以下是iPhone拨号键盘上长按按键的主要功能: 数字键 0 - 长按可输入""号,用于国际电话拨号 - 这是最常用的长按功能之一,方便用户拨打国际电话 星号…...

在 KubeVirt 中使用 GPU Operator

在 KubeVirt 中使用 GPU Operator 基于最新的GPU Operator版本24.9.0。 原文链接:GPU Operator with KubeVirt — NVIDIA GPU Operator 24.9.0 documentation 1. 简介 KubeVirt 是 Kubernetes 的一个虚拟机管理插件,允许您在 Kubernetes 集群中运行和…...

安慰剂检验Stata代码(全套代码、示例数据及参考文献)

数据简介:随着因果推断方法在实证研究中的使用比例不断提升,越来越多的文章进行安慰剂检验。其检验基本原理与医学中的安慰剂类似,即使用假的政策发生时间或实验组进行分析,以检验能否得到政策效应。如果依然得到了政策效应&#…...

DAY6 线程

作业1&#xff1a; 多线程实现文件拷贝&#xff0c;线程1拷贝一半&#xff0c;线程2拷贝另一半&#xff0c;主线程回收子线程资源。 代码&#xff1a; #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…...

基于STM32的智能门锁系统设计思路:蓝牙、RFID等技术

一、项目概述 在现代家居安全领域&#xff0c;传统门锁因其安全性不足、开锁方式单一等问题&#xff0c;已逐渐无法满足用户的需求。传统机械锁容易被撬开、复制钥匙&#xff0c;同时开锁方式仅限于物理钥匙&#xff0c;给用户带来不便。因此&#xff0c;本文旨在设计并开发一…...

AndroidStudio-广播

一、广播的本质 广播是一种数据传输方式 二、Android 中的广播 发送一条广播&#xff0c;可以被不同的广播接收者所接收&#xff0c;广播接收者收到广播之后&#xff0c;再进行逻辑处理。 三、收发标准广播 广播的收发过程分为三个步骤&#xff1a; 1.发送标准广播 2.定义…...

基于表格滚动截屏(表格全部展开,没有滚动条)

import html2canvasPro from html2canvas // 截图&#xff0c;平辅表格 async function resetAgSize() {const allColumns gridApi.value.getColumns()let totalColumnWidth 0let totalColumnHeight 0// 遍历每一个行节点gridApi.value.forEachNode((rowNode) > {totalCo…...

洛谷P1255

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 数楼梯 题目描述 楼梯有 N 阶&#xff0c;上楼可以一步上一阶&#xff0c;也可以一步上二阶。 编一个程序&#xff0c;计算共有多少种不同的走法。 输入格式 一个数字&#xff0c;楼梯数。 输出格式 输出走的方式总数。 样…...

vue3设置第三方组件 样式::v-deep

在Vue 3中&#xff0c;使用了Composition API的组件可以通过<style>标签内部的::v-deep选择器来深入作用于第三方组件的样式。::v-deep是一个 Scoped CSS 的“深度选择器”&#xff0c;可以穿透组件边界&#xff0c;影响子组件的样式。比如我想修改el-date-picker的颜色边…...

JAVA学习日记(十四)集合进阶

一、单列集合Collection List系列集合特点&#xff1a;添加的元素是有序&#xff08;存和取的顺序一致&#xff09;、可重复、有索引 Set系列集合特点&#xff1a;添加的元素是无序&#xff08;存和取的顺序有可能不一致&#xff09;、不重复、无索引 Collection是所有单列集合…...

mysql全量与增量备份

binlog日志&#xff1a; 从上一次全量备份到下一次全量备份直接产生的数据。 一、全备和增量备份介绍 1、全量备份&#xff1a; 备份所有数据库或只备份一个数据库&#xff0c;全量备份之后&#xff0c;全量备份之前的binlog日志就没用了&#xff0c;一般生产环境会保留3-7天…...

“非法”操控lambda(python)

能过python解释器关卡即是合法脚本代码&#xff0c;偶尔的“违规”操控也是一种唯美。 (笔记模板由python脚本于2024年11月13日 11:18:21创建&#xff0c;本篇笔记适合熟悉python的lambda操控的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.pyth…...

UDP协议和TCP协议之间有什么具体区别?

UDP&#xff08;User Datagram Protocol&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff09;是两种常见的网络传输协议&#xff0c;它们在数据传输中有着显著的区别和适用场景。理解它们的区别对于网络工程师、软件开发人员以及网络安全专家都是至关重要的…...

论文5—《基于改进YOLOv5s的轻量化金银花识别方法》文献阅读分析报告

论文报告&#xff1a;基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档 基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档摘要国内外研究现状国内研究现状国外研究现状 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. 目标检测技术2. …...

快手直播间采集教程,快手引流,快手截流,截流工具,直播间截流,快手直播间采集,获客系统,获客软件

功能&#xff1a; 1.输入快手直播间链接可一键监控直播间 2.可采集新进直播间的人 3.可采集直播间所有动作&#xff0c;包含&#xff1a;发弹幕的人和内容、送礼物的人和送的礼物、点亮爱心的人 4.可一键导出新进直播间的快手ID 5.可一键导出直播间动作列表&#xff0c;也可以筛…...

探索MoviePy:Python视频编辑的瑞士军刀

文章目录 &#x1f3ac; 探索MoviePy&#xff1a;Python视频编辑的瑞士军刀第一部分&#xff1a;背景介绍第二部分&#xff1a;MoviePy是什么&#xff1f;第三部分&#xff1a;如何安装MoviePy&#xff1f;第四部分&#xff1a;MoviePy的基本函数使用方法1. 视频剪辑2. 视频拼接…...

mysql 实现分库分表之 --- 基于 MyCAT 的分片策略详解

引言 在我们日常工作的项目中&#xff0c;特别是面向 C 端用户的产品&#xff0c;随着业务量的逐步扩大&#xff0c;数据量也呈指数级增长。为了应对日益增长的数据库压力&#xff0c;数据库优化已成为项目中不可或缺的一环&#xff0c;而分库分表则是海量数据优化方案中的重要…...

Opencascade基础教程(14): 一个模型显示问题

如果显示模型时出现如图情况&#xff0c;正对屏幕的平面特别亮&#xff0c;只需要设置材质为非金属就行。 //创建box并显示TopoDS_Shape aShape BRepPrimAPI_MakeBox(100, 100, 100);Handle(AIS_Shape) aisShpae new AIS_Shape(aShape);aisShpae->SetDisplayMode(AIS_Shad…...

ISP——你可以从这里起步(二)

接上一篇&#xff0c;上一篇是原理篇&#xff0c;这一篇是实战篇&#xff0c;为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图&#xff0c;即使获得了raw图也需要对应的sensor参数才能把它用起来&#xff0c;所以我找了一条野路子可以把…...

Qt / Qt Quick程序打包的一些坑 (四)

【写在前面】 打包方法见 Qt / Qt Quick程序打包的方法。 这里是再次记录一些坑。 【正文开始】 直接进入正题&#xff1a; 在 Qt5 中&#xff0c;如果我们的 Qml 中使用了【Qt Shapes】模块&#xff0c;那么在打包的时候&#xff0c;会缺少Qt5QuickShapes.dll。 然后&#xff…...