Redis进化史:看Redis是如何变成缓存那么,让我们从2.2开始一步步深入Redis。2.2redis-cli命令有了很大改进:Tab补全,支持帮助(如helpSET,helpBITCOUNT),原生输出,用新的hiredisC库重写。copy-on-write机制对很多读命令比较友好,这意味着如果执行大部分读操作,fork出来的子进程只需要少量内存。新命令WATCH实现CAS事务。可以对具有EXPIRE过期属性的KEY执行写操作。全新的SETBIT、GETBIT、SETRANGE、GETRANGE、STRLEN命令,操作字符串就像一个数组,我们可以进行位操作。支持syslog(在配置文件中指定:syslog-enabledyes)。许多新命令已添加到列表中:LINSERT、LPUSHX、RPUSHX、BRPOPLPUSH。更强大的INFO命令。启动时加载RDB或AOF是非阻塞的,在INFO输出中有进度信息。hiredis:一个强大的C语言Redis客户端库。配置文件中支持rename重命名(rename-commandKEYSafeikeys)或disable(rename-commandKEYS"")命令。Syslog说明:在Linux世界中,写日志有两种方式:1.将日志写到文件中。随着时间的推移,我们将把它写入一个新的文件。这种方式的问题是,如果很多服务产生大量的日志,会比较麻烦。2.利用syslog服务记录日志,在几乎所有可用的Unix和Linux服务器的TCP和UDP端口514上运行一个名为syslog的服务,syslog接受发送给它的任何日志消息并将这些消息路由到磁盘上的各种消息日志文件,同时处理旧日志的滚动和删除。通过配置,它甚至可以将消息转发给其他服务器进行进一步处理,这比直接记录到文件要方便得多,因为所有特殊的日志文件滚动和删除都已经为我们完成了。2.4Redis2.4没有值得一提的特性。其中大部分是一些错误修复或功能增强。本版本新特性列表:VMdeprecated,仍会支持,但会给出警告,不建议使用。增加CLIENT命令,支持KILL、LIST等操作,方便观察CLIENT的一些信息;添加OBJECT命令,可以观察对象的一些内部信息,比如对象是什么编码;在不重启Redis服务的情况下直接通过CONFIGSET设置密码授权,关闭密码授权;如果没有设置密码,通过AUTH发送密码进行认证,则返回ERROR。Redis-cli新实现了--latency模式来监控采样Redis的延迟。当fsync刷新策略为everysec时,后台执行AOFfsync。SADD、HDEL、SREM、ZREM、ZADD、L/RPUSH命令增强支持可变参数(旧版本只支持一个参数)。2.6Redis2.6的新特性如下:服务器端支持Lua脚本,通过EVAL执行,例如:eval"returnredis.call('set','foo','bar')"0。expirationtime支持毫秒精度,相应增加了毫秒级别的过期指令:PEXPIRE、PSETEX、PTTL等。支持只读Slaves。支持位操作命令:BITCOUNT和BITOP,以及许多其他新命令,如:DUMP、RESTORE、MIGRATE等。RDB文件中增加了CRC64校验值。SHUTDOWN支持两个选项:SAVE和NOSAVE。INFO命令输出是分段的。看门狗特性定位延迟问题。您只需要执行configsetwatchdog-period100即可启用此功能。如果值为0,则表示禁用此功能。需要注意的是,这个特性不能在配置文件中启用。集成内存测试模式,参考执行:redis-server--test-memory1024。redis.conf中的所有配置都可以通过redis-server的命令行选项指定。哈希表的种子是随机的,以防止碰撞攻击。删除您的虚拟内存功能(2.4已弃用)。删除对客户端连接数的硬编码限制。看门狗可以参考:https://redis.io/topics/latency,笔者也会单独写一篇文章进行深入分析。2.8Redis2.8虽然没有很重要的新特性,但是非常非常稳定。除了缺少分布式功能外,我找不到太多错误。Sentinel可以保证高可用性。笔者当年经历的一个项目,使用Redis2.8.23版本,单机模式,10G+数据量,实际稳定运行了500天左右。即使是现在,如果你的项目不需要几十G的缓存,我还是觉得Redis2.8.x版本是个不错的选择,结合sentinel模式保证高可用,相对于Redis3.x的分布式集群模式,其架构更简单,无需对任何功能和命令做出妥协(在Redis集群模式下,很多命令功能都被阉割或限制,当然Redis3.x之后的更高版本也可以只使用sentinel而不使用redis集群架构).OK,我们来看看2.8的新特性:slave支持从master部分同步,可以避免master和slave断开一段时间后(比如网络抖动)需要通过RDB进行全同步。支持IPv6。支持configsetmaxclients1024。支持绑定多个IP地址。CONFIGREWRITE可以输出redis.conf配置文件中CONFIGSET操作的配置。新增PUBSUB命令,实现Pub/Sub的内省能力。通过Pub/Sub实现keyspaces的变更通知,比如KEY过期的通知功能。如果在最大延迟下没有足够的slave,master可以停止写请求。配置参考如下:#比如至少3个slave,延迟小于10秒,master会正常写入:#min-slaves-to-write3#min-slaves-max-lag103.0Redis3.0绝对是一个里程碑版本,历时4年开发。在Redis3.0之前,Redis没有分布式模式(sentinel模式只能保证高可用)。也正因为如此,民间涌现出了很多Redis分布式方案。比较知名的三个是:1.Redis客户端分片,2.twemproxy,3.codis(豌豆荚)。Redis3.0的重要功能有:RedisCluster,即Redis分布式模式,Redis3.0最大的特点;WAIT命令阻塞,直到写入命令同步到指定数量的从机,该命令始终返回写入命令发送的从机数量。用法:等待numslaves超时。例如:WAIT25000,即等待2个slave同步所有写命令,并设置5秒的超时时间。新增CLIENTPAUSE命令,例如:CLIENTPAUSE10000,即停止处理客户端命令10秒。这时候如果有新的命令要执行,就会一直阻塞。增强了CONFIGSET命令以支持不同的单位,例如CONFIGSETmaxmemory1gb、CONFIGSETmaxmemory1024mb;增强了MIGRATE命令以添加COPY和REPLACE操作。对Redis日志进行了小幅调整。当前实例的作用会在日志中体现出来,显然是针对RedisCluster的。3.2Redis3.2版本的一些重要特性如下:Lua调试器,官方给出了参考视频,不过Youtube上有:https://www.youtube.com/watch?v=IMvRfStaoyM,就看你有没有可以看着它自己起来。CONFIGSET/GET被重写以支持更多的操作项。新增HSTRLEN命令,返回hash结构指定字段值的字符串长度,hash或字段不存在则返回0。使用RESIZEDB避免不必要的散列扩展,实现更快的RDB加载速度。增加了对GEO的支持,提供了几个操作GEO的命令,如:GEOADD、GEORADIUS、GEOHASH、GEOPOS等。实现CLIENTREPLY,支持三种操作:ON、OFF、SKIP。ON为普通模式,服务器会回复请求。在OFF模式下,服务器不会回复任何命令。这种情况一般用于send-and-forget场景,例如:加载大量缓存数据,可以使用OFF模式关闭响应,节省带宽等资源。SPOP命令支持count参数,使用参考:SPOPkey[count]。即,移除并返回count个元素。列表类型的新编码方法:Quicklists。RDB文件可以节省大量的内存和存储空间。4.0Redis之所以没有命名为3.4而是4.0,是因为这个版本增加了很多重要的特性,重写了很多核心功能。我们先来看看Redis4.0的主要功能:Redis模块系统,该功能的实现,开发者可以对Redis进行自定义扩展,实现新的数据结构等任意特性。PSYNC版本升级到v2,优化了之前版本主从节点切换必然导致全复制的问题。增强了缓存逐出策略,并添加了一个新的LFU策略,即LeastFrequentlyUsed。异步删除(延迟收集)。Redis4.0可以在后台异步删除KEY,不会同步阻塞服务器。可以通过新命令UNLINK来实现,用法:UNLINKkey[key...]。HybridRDB-AOF格式,这种格式在重写AOF文件时使用,重写以更紧凑和更快速的方式生成RDB文件,AOF流被附加到这个文件中,在这种情况下,AOF持久化重写和重写加载速度更快,参考配置:aof-use-rdb-preambleyes。添加MEMORY命令可以做很多不同的内存分析任务,比如排查内存问题,检查一个KEY使用了多少内存,以及提供比INFO命令的内容更深入的Redis内存使用报告;Redis可以对内存碎片进行整理,可以在运行过程中回收内存空间。参考配置:activedefrag是的,对应的配置参数也很多,可以在Redis4.0以后版本的redis.conf中查看。Redis集群支持NAT/Docker。内存命令使用参考--查看一个KEY占用多少内存(以字节为单位),相信很多同学都不知道这个神奇的命令,那我们现在就GET吧:>SETfoobarOK>MEMORYUSAGEfoo(integer)545.0这是Redis最新的大版本,笔者之前在一篇文章中对Redis5.0进行了深入分析,有兴趣的朋友请戳:。5.0的重要特性主要包括:Streams数据结构,Redis的一种全新的数据结构,大量借鉴了Kafka的设计(作者之前在一篇文章中也介绍过这种数据结构,详情请点击:)。Redis集群管理脚本从Ruby(redis-trib.rb)迁移到C,并集成到redis-cli(redis-cli--cluster)中。SortedSet添加了两个重要的命令:ZPOPMIN和ZPOPMAX。支持HZ动态;不再使用奴隶这个词,除了API向后兼容性(种族歧视问题)。Lua脚本可以设置超时。CLIENT支持两个新命令:CLIENTID和CLIENTUNBLOCK。
