特性
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提供了两种持久化⽅式:RDB和AOF,即可以⽤两种策略将内存的数据保存到硬盘中(如图所示),这样就保证了数据的可持久性,后续我们将对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命令得不
到返回值