【本教程目录】1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构–简介8.redis数据结构–strings9.redis数据结构–lists10.redis数据结构–集合11.redis数据结构–有序集合12.redis数据结构–哈希13.聊聊redis持久化–两种方式14.聊聊redis持久化–RDB15.聊聊redis持久化–AOF16.聊聊redis持久化–AOF重写17.聊聊redis持久化–如何选择RDB和AOF18.聊聊主从–用法19.聊聊主从–同步原理20.聊聊redis的事务处理21.教你看懂redis配置–简介22.教你看懂redis配置-通用23.教你看懂redis配置–快照24.教你看懂redis配置–复制25.教你看懂redis配置–安全26.教你看懂redis配置-限制27.教你看懂redis配置–追加模式28.教你看懂redis配置–LUA脚本29.教你看懂redis配置–慢日志30.教你看懂redis配置–事件通知31.教你看懂redis配置–高级配置【redis是什么】redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是britishIndianOceanterritory,即英属印度洋领地)目前,Vmware在资助着redis项目的开发和维护。【谁在使用redis】Blizzard、digg、stackoverflow、github、flickr…【学会安装redis】从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可,安装非常简单。make成功后会在src文件夹下产生一些二进制可执行文件,包括redis-server、redis-cli等等:复制代码代码如下:$find.-typef-executable./redis-benchmark//用于进行redis性能测试的工具./redis-check-dump//用于修复出问题的dump.rdb文件./redis-cli//redis的客户端./redis-server//redis的服务端./redis-check-aof//用于修复出问题的AOF文件./redis-sentinel//用于集群管理【学会启动redis】启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:复制代码代码如下:./redis-server../redis.conf默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。有关作者为什么选择6379作为默认端口,还有一段有趣的典故,英语好的同学可以看看作者这篇博文中的解释。【使用redis客户端】我们直接看一个例子:复制代码代码如下://这样来启动redis客户端了$./redis-cli//用set指令来设置key、value127.0.0.1:6379setnamerocOK//来获取name的值127.0.0.1:6379getnameroc//通过客户端来关闭redis服务端127.0.0.1:6379shutdown127.0.0.1:6379【redis数据结构–简介】redis是一种高级的key:value存储系统,其中value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有序字符串集合(sortedsets)5.哈希(hashes)而关于key,有几个点要提醒大家:1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;2.key也不要太短,太短的话,key的可读性会降低;3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。【redis数据结构–strings】有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。我们来看一个最简单的例子:复制代码代码如下:setmystrhelloworld!//设置字符串类型getmystr//读取字符串类型字符串类型的用法就是这么简单,因为是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储。另外,我们还可以通过字符串类型进行数值操作:复制代码代码如下:127.0.0.1:6379setmynum2OK127.0.0.1:6379getmynum2127.0.0.1:6379incrmynum(integer)3127.0.0.1:6379getmynum3看,在遇到数值操作时,redis会将字符串类型转换成数值。由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。Redis字符串命令用于在Redis管理字符串值。使用Redis字符串命令的语法如下所示:语法redis127.0.0.1:6379COMMANDKEY_NAME例子redis127.0.0.1:6379SETyiibairedisOKredis127.0.0.1:6379GETyiibairedis在上面的例子中,set和get是命令,而yiibai是键。Redis字符串命令如下表显示一些在Redis管理字符串基本的命令:S.N.命令&描述1SETkeyvalue此命令用于在指定键设置值2GETkey键对应的值。3GETRANGEkeystartend得到字符串的子字符串存放在一个键4GETSETkeyvalue设置键的字符串值,并返回旧值5GETBITkeyoffset返回存储在键位值的字符串值的偏移6MGETkey1[key2..]得到所有的给定键的值7SETBITkeyoffsetvalue设置或清除该位在存储在键的字符串值偏移8SETEXkeysecondsvalue键到期时设置值9SETNXkeyvalue设置键的值,只有当该键不存在10SETRANGEkeyoffsetvalue覆盖字符串的一部分从指定键的偏移11STRLENkey得到存储在键的值的长度12MSETkeyvalue[keyvalue...]设置多个键和多个值13MSETNXkeyvalue[keyvalue...]设置多个键多个值,只有在当没有按键的存在时14PSETEXkeymillisecondsvalue设置键的毫秒值和到期时间15INCRkey增加键的整数值一次16INCRBYkeyincrement由给定的数量递增键的整数值17INCRBYFLOATkeyincrement由给定的数量递增键的浮点值18DECRkey递减键一次的整数值19DECRBYkeydecrement由给定数目递减键的整数值20APPENDkeyvalue追加值到一个键【redis数据结构–lists】redis的另一个重要的数据结构叫做lists,翻译成中文叫做“列表”。首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。虽然lists有这样的优势,但同样有其弊端,那就是,链表型lists的元素定位会比较慢,而数组型lists的元素定位就会快得多。lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。我们来看几个例子:复制代码代码如下://新建一个list叫做mylist,并在列表头部插入元素1127.0.0.1:6379lpushmylist1//返回当前mylist中的元素个数(integer)1//在mylist右侧插入元素2127.0.0.1:6379rpushmylist2(integer)2//在mylist左侧插入元素0127.0.0.1:6379lpushmylist0(integer)3//列出mylist中从编号0到编号1的元素127.0.0.1:6379lrangemylist011)02)1//列出mylist中从编号0到倒数第一个元素127.0.0.1:6379lrangemylist0-11)02)13)2lists的应用相当广泛,随便举几个例子:1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDERBY来进行排序。2.利用LRANGE还可以很方便的实现分页的功能。3.在博客系统中,每片博文的评论也可以存入一个单独的list中。Redis列表是简单的字符串列表,排序插入顺序。您可以在头部或列表的尾部Redis的列表添加元素。列表的最大长度为232-1(每个列表超过4十亿元素4294967295)元素。例子redis127.0.0.1:6379LPUSHtutorialsredis(integer)1redis127.0.0.1:6379LPUSHtutorialsmongodb(integer)2redis127.0.0.1:6379LPUSHtutorialsmysql(integer)3redis127.0.0.1:6379LRANGEtutorials0101)mysql2)mongodb3)redis在上述例子中的三个值被插入到redis的列表命名tutorials使用LPUSH命令。Redis的命令列表如下表所示相关列出了一些基本的命令:S.N.命令&描述1BLPOPkey1[key2]timeout取出并获取列表中的第一个元素,或阻塞,直到有可用2BRPOPkey1[key2]timeout取出并获取列表中的最后一个元素,或阻塞,直到有可用3BRPOPLPUSHsourcedestinationtimeout从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用4LINDEXkeyindex从一个列表其索引获取对应的元素5LINSERTkeyBEFORE|AFTERpivotvalue在列表中的其他元素之后或之前插入一个元素6LLENkey获取列表的长度7LPOPkey获取并取出列表中的第一个元素8LPUSHkeyvalue1[value2]在前面加上一个或多个值的列表9LPUSHXkeyvalue在前面加上一个值列表,仅当列表中存在10LRANGEkeystartstop从一个列表获取各种元素11LREMkeycountvalue从列表中删除元素12LSETkeyindexvalue在列表中的索引设置一个元素的值13LTRIMkeystartstop修剪列表到指定的范围内14RPOPkey取出并获取列表中的最后一个元素15RPOPLPUSHsourcedestination删除最后一个元素的列表,将其附加到另一个列表并返回它16RPUSHkeyvalue1[value2]添加一个或多个值到列表17RPUSHXkeyvalue添加一个值列表,仅当列表中存在【redis数据结