Redis特性&版本

发布于:2025-05-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

特性

1.速度

正常情况下,Redis执⾏命令的速度⾮常快,官⽅给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能


  • Redis 的所有数据都是存放在内存中,根据该表可得出,把数据放在内存中是Redis速度快的最主要原因
    在这里插入图片描述
  • Redis是使用C语言实现的,一般来说C语言实现的程序距离操作系统更近,执行速度相对会更快。
  • Redis使用了单线程,预防了多线程可能产生的竞争问题。

Redis在6.0版本引⼊了多线程机制,但主要也是在处理⽹络和IO,不涉及到数据命令,即命令的执⾏仍然采⽤了单线程模式。


2.基于键值对的数据结构服务器

  • ⼏乎所有的编程语⾔都提供了类似字典的功能,例如C++⾥的map、Java⾥的map、Python⾥的dict等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是,Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。
  • Redis的全程是REmoteDictionaryServer,它主要提供了5种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(orderedset/zet),同时在字符串的基础之上演变出了位图(Bitmaps)和HyperLogLog两种神奇的”数据结构“,并且随着LBS(LocationBasedService,基于位置服务)的不断发展,Redis3.2.版本种加⼊有关GEO(地理信息定位)的功能

3.丰富的功能

除了5种数据结构,Redis还提供了许多额外的功能:

  • 提供了键过期功能,可以⽤来实现缓存。
  • 提供了发布订阅功能,可以⽤来实现消息系统。
  • ⽀持Lua脚本功能,可以利⽤Lua创造出新的Redis命令。
  • 提供了简单的事务功能,能在⼀定程度上保证事务特性。
  • 提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到Redis,减少了⽹络的开销。

4.简单稳定

  • Redis的源码很少,早期版本的代码只有2万行左右,3.0 版本以后由于添加了集群特性,代码增⾄5万行左右,相对于很多NoSQL数据库来说代码量相对要少很多,也就意味着普通的开发和运维⼈员完全可以“吃透”它。
  • Redis使⽤单线程模型,这样不仅使得Redis服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。
  • Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库),Redis自己实现了事件处理的相关功能。

5.客户端语言多

Redis 提供了简单的TCP通信协议,很多编程语⾔可以很⽅便地接⼊到Redis,并且由于Redis受到社区和各⼤公司的⼴泛认可,所以⽀持Redis的客⼾端语⾔也⾮常多,⼏乎涵盖了主流的编程语⾔,例如C、C++、JavaPHP、Python、NodeJS等,后续我们会对Redis的客⼾端使⽤做详细说明。


6.持久化(Persistence)

通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化⽅式:RDBAOF,即可以⽤两种策略将内存的数据保存到硬盘中(如图所示),这样就保证了数据的可持久性,后续我们将对Redis的持久化进行详细说明。

Redis内存到硬盘的持久化
在这里插入图片描述


7.主从复制

Redis 提供了复制功能,实现了多个相同数据的Redis副本(Replica)(如图所示),复制功能是分布式Redis的基础。

  • 主从复制架构
    在这里插入图片描述

8.高可用(HighAvailability)和分布式(Distributed)

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


Redis 重大版本

Redis 借鉴了Linux操作系统对于版本号的命名规则:版本号第⼆位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下⼀个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本。所以我们⽣产环境通常选取偶数版本的Redis,如果对于某些新的特性想提前了解和使用,可以选择最新的奇数版本。


1、Redis 2.6

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

2、Redis 2.8

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

3、Redis 3.0

  • RedisCluster:Redis提供的官方分布式实现。
  • 全新的embeddedstring对象编码结果,优化了小对象内存访问,在特定的工作负载时,下载速度大幅提⾼。
  • 优化了LRU算法,大幅提供性能。
  • migrate链接缓存,⼤幅提供键迁移的速度。
  • migrate命令新增两个参数:copy和replace。
  • clientpause命令,在指定时间内中⽌处理客户端请求。
  • bitcount命令性能提⾼。
  • configset设置maxmemory时候能够设置不⼀样的单位(以前只能是字节)。
  • Redis⽇志⼩作调整:⽇志中会反应当前实例的角色(master或者slave)。
  • incr命令性能提⾼

Redis 3.2

  • 添加GEO相关功能。
  • SDS在速度和节省空间上都作了优化。
  • ⽀持⽤upstart或者systemd管理Redis进程。
  • 新的List编码类型:quicklist。
  • 从节点读取过时数据保证⼀致性。
  • 添加了hstrlen命令。
  • 加强了debug命令,⽀持了更多的参数。
  • Lua脚本功能加强。
  • 添加了LuaDebugger。
  • configset⽀持更多的配置参数。
  • 优化了Redis崩溃后的相关报告。
  • 新的RDB格式,可是仍然兼容旧的RDB。
  • 加速RDB的加载速度。
  • spop命令⽀持个数参数。
  • cluster nodes命令获得加速。
  • Jemalloc更新到4.0.3版本。

Redis 4.0

  • 提供了模块系统(module),⽅便第三⽅开发者拓展Redis的功能。
  • PSYNC2.0:优化了以前版本中,主从节点切换必然引发全量复制的问题。
  • 提供了新的缓存剔除算法:LFU(LastFrequentlyUsed),注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,⽽LFU是基于访问次数的,并对已有算法进⾏了优化。
  • 提供了⾮阻塞del和flushall/flushdb功能,新添加了unlink命令,这个命令是del命令的异步版本,它可以将删除指定键的操作放在后台线程⾥⾯执⾏。
  • 提供了memory命令,实现对内存更为全⾯的监控统计。
  • 提供了交互数据库功能,实现Redis内部数据库的数据置换。
  • 提供了RDB-AOF混合持久化格式,充分利⽤了AOF和RDB各⾃优点。
  • RedisCluster兼容NAT和docker。

Redis 5.0

  • 新的流数据类型(stream)。
  • 新的Redis模块API:定时器、集群和字典API。
  • RDB现在可存储LFU和LRU信息。
  • redis-cli 中的集群管理器从Ruby(redis-trib.rb)移植到了C语⾔代码。执⾏redis-cli-cluster help 命令以了解更多信息。
  • 新的有序集合(sortedset)命令:zpopmin/zpopmax和阻塞变体(blockingvariants)。
  • 升级Activedefragmentation⾄v2版本。
  • 增强HyperLogLog的实现。
  • 更好的内存统计报告。
  • 许多包含⼦命令的命令现在都有⼀个help⼦命令。
  • 客⼾端频繁连接和断开连接时,性能表现更好。
  • 许多错误修复和其他⽅⾯的改进。
  • 升级Jemalloc⾄5.1版本。
  • 引⼊clientunblock和clientid。
  • 新增lolwut命令。
  • 在不存在需要保持向后兼容性的地⽅,弃⽤"slave"术语。
  • ⽹络层中的差异优化。
  • 增强对Lua的⽀持:将Lua脚本更好地传播到replicas/AOF、Lua脚本现在可以超时并在副本中进⼊-BUSY状态
  • 引⼊动态的HZ(DynamicHZ)以平衡空闲CPU使⽤率和响应性。
  • 对Redis核⼼代码进⾏了重构并在许多⽅⾯进⾏了改进。

Redis 6.0

  • Redis6.0引⼊多线程IO,但多线程部分只是⽤来处理⽹络数据的读写和协议解析,执⾏命令仍
    然是单线程
  • 实现了client-side-caching(客⼾端缓存)功能。放弃了cachingslot,⽽只使⽤keynames。
  • Redis6.0开始在兼容RESP2的基础上,开始⽀持RESP3(RESP,RedisSerialization Protocol 是Redis服务端与客⼾端之间通信的协议)。
  • 连接⽀持SSL,更加安全。
  • 增强ACL权限控制:⽀持对客⼾端的权限控制,实现对不同的key授予不同的操作权限、新增⼀个新的ACL⽇志命令,允许查看所有违反ACL的客⼾机、访问不应该访问的命令、访问不应该访问的密钥,或者验证尝试失败。这对于调试ACL问题⾮常有⽤。
  • 提升了RDB⽇志加载速度。
  • 发布官⽅的Redis集群代理模块RedisClusterProxy。
  • 提供了众多的新模块(modules)API。

Redis 7.0

  • 将AOF⽂件的存储⽅式改为在⼀个⽂件夹下存储多个⽂件。
  • 将持久化⽂件RDB的版本升级为10,与之前的RDB⽂件版本不再兼容。
  • 在读取⽼的RDB⽂件格式的时候将ziplist转换为listpack,这种转换发⽣于两种情况之下:从磁盘读取⽂件或者从⼀个主节点进⾏复制⽂件的时候。
  • 在redis.conf配置⽂件中,protected-mode默认更改为yes,只有当你希望你的客⼾端在没有授权的情况下可以连接到Redisserver的时候可以将protected-mode设置为no。
  • 在ACL中,pub/subchannel默认是被阻塞的。
  • 在从节点中,TTL的时间标识的是绝对时间,不再是相对时间,从⽽保证了过期数据被及时删除。
  • 不再⽀持gopher协议。
  • 当在配置⽂件中设置replica-serve-stale-data=no,当主节点不再提供服务时,ping命令得不
    到返回值