NoSQL(Not Only SQL) 在现今已经应用非常普遍了,尤其是 Redis 和 MongoDB。我们现在来说说 Redis。
Redis 是一个意大利人 Salvatore Sanfilippo(antirez) ,在 2008 年开发一个叫 LLOOGG (已经停止服务,域名都在叫卖了/捂脸)的访客信息追踪网站时(源码),因为用户越来越多而达到了性能瓶颈,为了节约成本,antirez 自己动手写的一个内存数据库。后来,antirez 用 C 语言重写了源码,加上了持久化功能并开源到 GitHub 上,Redis 正式向世界揭开了面纱,并深受欢迎,如 Twitter、Stack Overflow、GitHub、BAT、新浪微博、SOHU、优酷、美团、小米、唯品会等公司都是 Redis 的使用者。其中新浪微博可以说是全球最大的 Redis 使用者。
Redis 全称 Remote Dictionary Server,是一种基于键值对(key-value)的 NoSQL 数据库,它主要有:字符串(Strings)、哈希(Hashs)、列表(Lists)、集合(Sets)、有序集合(Sorted sets/Zsets) 5 种数据类型,同时在字符串的基础上衍生出了位图(Bitmaps)和 HyperLogLogs "数据结构",并且随着 LBS(Location Based Service,基于位置服务)的不断发展,在 Redis 3.2 版本中加入有关 GEO(地理信息定位)的功能。Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能。除此之外,在持久化、主从复制、高可用(2.8)和集群(3.0)方面也是下足了功夫,逐步得到完善并已相当稳定。
目前,Redis 最新的稳定版是 3.2.8,但已经发布了最新的 4.0 RC2 版本,有更多好玩和完善的东西,可以看看 antirez 写的文章 The first release candidate of Redis 4.0 is out,英文困难户还可以看看黄健宏(huangz)的博文 Redis 4.0 新功能简介。
4.0 的新特性简单来说有如下几点:
模块系统,方便开发人员扩展功能。 PSYNC 2.0,优化旧版本中主从切换时引起的全量复制问题。 LFU(Last Frequently Used) 缓存剔除算法,具体信息见 antirez 的博文 Random notes on improving the Redis LRU algorithm。 非阻塞的 DEL 、 FLUSHDB 和 FLUSHALL,尽可能避免删除 key 时导致的服务器阻塞。 混合 RDB-AOF 持久化格式,兼具 RDB 持久化和 AOF 持久化的优点。 memory 监控命令,方便观察内存使用情况, 并进行相应的内存管理操作。 集群兼容 NAT 和 Docker 交换数据库,对指定的两个数据库进行互换数据。说到这里,我们需要冷静一下,Redis 虽然强大,但也不是万能的。在大数据量的时候,Redis 就并不是那么的合适了,毕竟 Redis 是一个内存数据库,会把数据都装到内存中,如果硬要上 Redis,那老板可就要心疼了 ^_^,这基本上是个黑洞;但也不是完全就不可以考虑 Redis 了,我们还是可以把热点数据放到 Redis 中的,其他的数据就不要浪费内存了。
最后,老话说的好:授人以鱼,不如授人以渔,不对,应该是:知其然,知其所以然。Redis 虽然是一个工具,但是知道 Redis 的原理对我们进行开发或者运维都是极好的。Redis 是开源的,我们不用带它看金鱼,可以轻松地从 GitHub 上拉取它的源码,然后慢慢研究它。Redis 的代码量才几万行,对于其他 NoSQL 库而言简直不值一提,但代码却非常优雅,通过阅读源码技能够加深对 Redis 的理解,必要时还可以实现一些自定义的功能,模块系统也可以用起来了。