知足常乐|学习Redis从这里开始

Redis是一个远程内存数据库 , 它不仅性能强劲 , 而且还具有复制特性以及为解决问题而生的独一无二的数据模型 。 Redis提供了5种不同类型的数据结构 , 各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题 , 而不会像其他数据库那样 , 要求用户扭曲问题来适应数据库 。 除此之外 , 通过复制、持久化(persistence)和客户端分片(client-sidesharding)等特性 , 用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统 。
笔者第一次使用Redis是在一家公司里面 , 这家公司需要对一个保存了6万个客户联系方式的关系数据库进行搜索 , 搜索可以根据名字、邮件地址、所在地和电话号码来进行 , 每次搜索需要花费10~15秒的时间 。 在花了一周时间学习Redis的基础知识之后 , 我使用Redis重写了一个新的搜索引擎 , 然后又花费了数周时间来仔细测试这个新系统 , 使它达到生产级别 , 最终这个新的搜索系统不仅可以根据名字、邮件地址、所在地和电话号码等信息来过滤和排序客户联系方式 , 并且每次操作都可以在50毫秒之内完成 , 这比原来的搜索系统足足快了200倍 。 阅读本书可以让你学到很多小技巧、小窍门以及使用Redis解决某些常见问题的方法 。
本章将介绍Redis的适用范围 , 以及在不同环境中使用Redis的方法(比如怎样跟不同的组件和编程语言进行通信等);而之后的章节则会展示各式各样的问题 , 以及使用Redis来解决这些问题的方法 。
现在你已经知道我是怎样开始使用Redis的了 , 也知道了这本书大概要讲些什么内容了 , 是时候更详细地介绍一下Redis , 并说明为什么应该使用Redis了 。
(使用优惠码Redis_EPUBIT_T5BY7 , 在异步社区购买《Redis实战》纸书可以享受七折优惠)
在其他编程语言里面使用Redis本书只展示了使用Python语言编写的示例代码 , 使用Ruby、Java和JavaScript(Node.js)编写的示例代码可以在这里找到: 。 使用Spring框架的读者可以通过查看来学习如何在Spring框架中使用Redis 。
前面对于Redis数据库的描述只说出了一部分真相 。 Redis是一个速度非常快的非关系数据库(non-relationaldatabase) , 它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping) , 可以将存储在内存的键值对数据持久化到硬盘 , 可以使用复制特性来扩展读性能 , 还可以使用客户端分片1来扩展写性能 , 接下来的几节将分别介绍Redis的这几个特性 。
如果你熟悉关系数据库 , 那么你肯定写过用来关联两个表的数据的SQL查询 。 而Redis则属于人们常说的NoSQL数据库或者非关系数据库:Redis不使用表 , 它的数据库也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联 。
高性能键值缓存服务器memcached也经常被拿来与Redis进行比较:这两者都可用于存储键值映射 , 彼此的性能也相差无几 , 但是Redis能够自动以两种不同的方式将数据写入硬盘 , 并且Redis除了能存储普通的字符串键之外 , 还可以存储其他4种数据结构 , 而memcached只能存储普通的字符串键 。 这些不同之处使得Redis可以用于解决更为广泛的问题 , 并且既可以用作主数据库(primarydatabase)使用 , 又可以作为其他存储系统的辅助数据库(auxiliarydatabase)使用 。
本书的后续章节会分别介绍将Redis用作主存储(primarystorage)和二级存储(secondarystorage)时的用法和查询模式 。 一般来说 , 许多用户只会在Redis的性能或者功能是必要的情况下 , 才会将数据存储到Redis里面:如果程序对性能的要求不高 , 又或者因为费用原因而没办法将大量数据存储到内存里面 , 那么用户可能会选择使用关系数据库 , 或者其他非关系数据库 。 在实际中 , 读者应该根据自己的需求来决定是否使用Redis , 并考虑是将Redis用作主存储还是辅助存储 , 以及如何通过复制、持久化和事务等手段保证数据的完整性 。


推荐阅读