[译]Redis Cookbook(1)

第一章介绍Redis的一些基本概念,看看它都适用于哪些场景,了解如何安装服务器端和客户端,以及它的数据类型。

什么时候用Redis

问题

        几乎所有的应用都需要存储数据,而且大部分数据更新频繁。过去,大部分应用使用关系型数据库来存储数据,比如Oracle,MySQL或PostgreSQL。近来出现了新的数据存储方式——NoSQL。NoSQL以一种更有效的无schema的方式存储数据。在设计应用的时候,选择使用SQL还是NoSQL往往是至关重要的第一步。

解决方案

        选择使用SQL还是NoSQL,要先了解它们各自的特点,而且要根据你的使用需求来决定。有些数据适合用关系型数据库来存储,而有些使用NoSQL数据库来存储则可以获得更好的效果,比如Redis或者其它替代品。如果你不依赖关系型数据库的某些特性,同时又对性能跟伸缩性有要求,那么NoSQL会是理想的选择。所以在决定使用哪种数据库之前,先考虑这几个问题,这样会帮你更好地做出决定。而通常来说,理想的解决方案是两种数据库一起使用。

你的应用数据适合用NoSQL吗

        基于Web的应用,它的数据和模型会随业务功能需求的变更而频繁变动。如果用关系型数据库来支持这些频繁的变更会是件痛苦的事情。现在的应用都提供24/7服务,对可用性要求很高,因数据库变更造成的宕机是无法接受的。举个很中肯的例子,在最近的一次MongoDB分享演讲中,来自Craigslist的Jeremy Zawodny就分享了他们是如何付出两个月时间的代价来解决因为数据库schema变更给他们的归档系统带来的影响。

        比较适合使用非关系型数据库存储的数据类型,可以是事务的相关细节,历史数据,或者服务器日志。这些数据高度动态化,变更频繁,而且增长速度快,到后期会涉及schema的调整。这些数据对关系不敏感,也就是说它们不太会与其它类型的数据扯上关系。鉴于这些原因,非关系型数据库会是更好的选择。

        另一方面,要看你是否更看中性能,并且不再需要关系型数据库的一些特性,比如一致性和冗余检查。NoSQL数据库一般不保证ACID,或者只是部分支持,所以它们可以在某些方面做出权衡。Redis支持ACID部分特性,它的单线程模型可以保证一致性跟隔离性,如果设置了appendfsync always,可以支持持久性。

        性能是很重要的一个考量因素。NoSQL数据库一般都很快,特别是对于写操作,所以比较适合写操作频繁的应用。

        不过说了这么多关于NoSQL的好处,关于使用关系型数据库存储数据的争论仍然不绝于耳。如果你可以预见你的数据是符合范式的,那么还是使用关系型存储引擎吧。总之,在做决定之前先了解你的数据。

人云亦云不可取

        像Redis这样的数据库速度快,伸缩性强,可以解决很多问题。但选择合适的工具,并用好它才是最重要的。要清楚自己存储的数据的特点,还要知道数据的访问频度和更新频度。

        如果你想清楚了这些问题,在SQL和NoSQL之间做出选择就容易得多了。这种前期的规划,会为以后数据迁移省下不少麻烦。

        NoSQL数据库也有很多选择,比如MongoDB就是一个支持很多特性的文档数据库。它支持区间查询,正则表达式搜索,索引和MapReduce。在选择数据库的时候要考虑各方面的因素,于是又回到之前说的问题上——你的数据有哪些特点,以及你打算如何使用你的数据。

        举个例子,Redis速度非常快,特别适用于数据变更频繁,写操作偏多,数据结构与Redis相吻合的应用。不过Redis不适用于数据量大但热点数据少,或者数据不是存储在内存里的场景。

 

安装Redis

问题

        在你的机器上安装Redis。

解决方案

        可以通过很多种方式安装Redis,其中编译安装是最灵活的。不过还是要根据实际的运行环境选择不同的安装方式。

讨论

从源代码编译安装

Redis更新比较快,安装包发行速度总是跟不上开发的速度。Redis对外部没有依赖,编译安装简单明了,所以建议大家自己编译安装。Redis可以在多个Linux发行版本上编译编译,如Mac OS X,Solaris和Cygwin。

1.下载源码

        可以从官网或Github上下载源码,使用Git客户端或浏览器直接下载某个分支的最新版本。

2.编译

        编译Redis很简单,只需要C编译器和Make命令。如果要运行测试用例,还需要Tcl8.5。

        源码解压好后,进入源码目录,输入:

make

        一般只需要10秒钟就可以完成编译。如果要在64位的机器上编译32位的版本,可以把32bit参数给make命令:

make 32bit

        如果你编译的是一个开发版,最好在编译完以后跑一下测试用例,确保编译出来的版本是正确的。

make test

3. 安装

        编译好以后可以直接运行Redis:

cd src && ./redis-server

        如果把它安装到机器的另一个位置,使用起来会更方便。

make install

        这个命令会把Redis安装到/usr/local/bin目录。如果你想把它安装到其它目录,可以把目标路径传给make命令。如:

make install /opt/local

        这样它就会被安装到/opt/local/bin目录。

        安装好以后,可以把配置文件(redis.conf)拷贝到另一个目录里,默认位置是/etc/redis.conf。如果你使用的配置文件不是默认的那个,可以把它的路径作为参数传给redis-server:

/usr/local/bin/redis-server /alternate-location-for-redis-config.conf

在Linux上安装Redis

        大部分较新的Linux发行版都有可用的Redis安装包,不过要注意它们可能不是最新的。但如果你一定要用它,安装起来也很简单:

        Debian/Ubuntu

sudo apt-get install redis-server

        Fedora/Redhat/CentOS       

sudo yum install redis

        Gentoo      

 sudo emerge redis

        这种方式有一些好处:因为使用了包管理器,可以让软件保持最新,而且得到的更新是安全稳定的版本。此外,它们还会附带一些启动脚本,以及跟你的发行版系统更匹配的运行环境。

在Windows上安装Redis

        尽管因为一些原因,比如缺少原生的写时复制机制,Redis官方不支持Windows,但微软实现的用户空间写时复制技术使得Windows版本的Redis具备了可接受的性能。

        不过还是要注意,因为性能和稳定性方面的原因,不建议把Windows版本的Redis应用到生产环境,但可以考虑在原生或虚拟的Linux/Unix环境里使用。Windows版本用来做开发测试还是不错的。

        使用Windows版本做开发也有不好的地方,因为它是Redis的一个分支,所以跟主干可能并不总是同步的。解决办法就是从源码编译,编译很简单,只需要Visual Studio。

        ServiceStack维护了一个Vagrant boxes版本,它可以自动安装启动Redis,在开发时使用很方便。

在Mac OS X上安装Redis

        在Mac OS X上也有几种安装方式,它们都要求机器上安装了XCode,因为XCode包含了编译所需要的依赖包和编译器。如果你是一个Mac开发者,那么你的机器上可能已经有了这些包。如果你不是,那么可以从苹果开发者网站上下载,或者从Mac系统安装盘里安装。你可以按照之前说的步骤手动编译Redis。不过大多数人选择了更便利的方式,他们使用包管理器,如Fink,MacPorts,或Homebrew。Fink里没有Redis包,所以我们来说说另外两个。

从MacPorts安装

        MacPorts是一个很好用的开源软件包编译,安装,管理系统。它基于FreeBSD系统,但在Mac上的使用方法是几乎是一样的。

        要通过MacPorts安装Redis,需要先安装MacPorts。guide.macports.org上有一个MacPorts的安装说明。装好了MacPorts,再安装Redis就简单了:

port install redis

        因为Redis对第三方没有依赖,所以编译和安装过程很快。接下来就可以使用Redis了。

从Homebrew安装

        Homebrew是Mac平台新晋的包管理器。因为是新晋的,所有你想要的包不一定都会有,不过它仍然是开发者经常用到的工具。

        可以按照Github上给出的说明安装Homebrew,不过其实也可以直接简单地敲几个命令:

ruby -e "$(curl -fsSLK https://gist.github.com/raw/323731/install_homebrew.rb)"

        装好了Homebrew,接下来就可以用它安装其它软件包了。安装Redis:

brew install redis

        然后你可以手动启动redis,或者把它安装成Mac的一个自启动服务。编辑/usr/local/etc/redis.conf,然后启动服务:

redis-server /usr/local/etc/redis.conf

 

使用Redis数据类型

问题

        理解Redis的数据类型,在应用中更好地使用它。

解决方案

        不同于其它的NoSQL数据库或键值对存储引擎,Redis内建了一些数据类型,允许开发者基于这些数据类型来组织他们的数据。预定义数据类型的好处是Redis可以在内部直接对特定类型的数据进行操作,这个比外部处理要快得多。在这一章节,我们来看看Redis支持的数据类型,以及它们背后的设计思想。

讨论

        在开始之前,有些很重要的概念需要注意:

  • 在定义键空间的时候要保持一致性,一个键可能包含任意字符,分隔符可以用来定义命名空间,后面跟上业务相关的值。举个例子,"cache:project:319:tasks",这里冒号就是命名空间分隔符。键的长度不要过长,从存储引擎获取一个键需要做比对操作,所以键的长度越小越好。而且短键占用更少的内存。
  • 尽管建议不要使用太长的键,但过短的键也并不会对性能有显著提升。所以在设计键的时候要综合考虑键的可读性和长度。

        那么,像"c:p:319:t"或"user 123"这样的键都不好。第一个可读性不好,第二个包含了空格。反过来,像"cache:project:319:tasks","lastchatmessage",或者"464A1E96B2D217EBE87449FA8B70E6C7D112560C"这样的键就很好,因为它们的可读性好。最后一个是SHA1的哈希值,在语义上它有一定含义,而且如果存储的是一个具有固定哈希值的数据,它会更有意义。

字符串

        Redis最简单的数据类型是字符串,它也是其它键值对存储系统使用的数据类型。你可以存储任何类型的字符串,包括二进制数据。在社交网络系统中你可以用它缓存头像图片的数据。你唯一要注意的是,在Redis中,单个数据的大小不要超过512M。

列表

        Redis的List类型是二进制安全字符串的有序列表,用链表实现。也就是说,通过索引获取元素的操作会比较慢,而在头部或尾部加入元素非常快。你可以会用它来实现队列,或者其它数据结构,这在后面的章节会看到。

哈希

        跟传统的哈希表很像,Redis的hash类型通过键存储字段和值。哈希非常适合用来映射复杂的对象,对象的属性被映射成字段。

集合和有序集合

        Redis的Set类型是二进制安全字符串的无序集合。集合里不能有重复的元素。举个例子,如果你要往一个集合里添加wheel两次,那么第二次操作会被Redis忽略。集合允许你进行一些典型的集合操作,如交集或并集。

        集合看起来跟列表有点像,不过实现方式不太一样。它们适用于不同的场景需求。集合的占用的内存要比列表高。

        有序集合是集合的一种特殊实现,根据二进制安全字符串的分数来决定元素次序。通过ZRANGE命令可以获取一个有序的元素列表。在后面的章节我们会看到一些关于集合和有序集合的例子。

转载于:https://my.oschina.net/xuemingdeng/blog/733221

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值