配色: 字号:
Redis技术参考手册
2021-09-15 | 阅:  转:  |  分享 
  
目录1)Redis简介3Redis优势4Redis与其它key-value存储有什么不同?4为什么Redis需要把所有数据放到内存中?5
Redis集群方案应该怎么做?都有哪些方案?5Redis集群方案什么情况下会导致整个集群不可用?5Redis有哪些适合的场景?5R
edis支持的Java客户端都有哪些?官方推荐用哪个?6Redis与其它数据库和软件的对比6附加特性7使用Redis的理由82)
Redis数据结构简介92.1.Redis的Key92.2.Redis的vaule93)持久化133.1.快照方式:(默认持久
化方式)133.2.日志追加方式:144)虚拟内存(适用于value比key大的情况)144.1.Redis虚拟内存简介144.
2.Redis虚拟内存相关配置154.3.Redis虚拟内存工作方式简介155)主从同步165.1.Redis主从复制简介165
.2.Redis主从复制的过程介绍176)数据淘汰策略17附录A:Redis的安装与配置171.1.安装171.1.1.Lin
ux下编译安装171.1.2.配置291.1.3.启动Redis291.1.4.关闭Redis291.1.5.更新安装re
dis291.1.6.Redis系统管理相关指令简介301.1.7.Window下安装30附录B:安装phpredis模块32
参考资料与知识扩展321)Redis简介Redis的全称是RemoteDictionaryServer。Redis是完全开
源免费的,遵守BSD协议,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、高性能的Key-Value
数据库,主要依赖于内存。Redis是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进
行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10
万次读写操作,是已知性能最快的Key-ValueDB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据
结构,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能
,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set可以做高性能的tag系统等等。另外R
edis也可以对存入的Key-Value设置expire时间,因此也可以被当作一个功能加强版的memcached来用。Redi
s的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作
和运算上。Redis与其它key-value缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保持在
磁盘中,重启的时候可以再次加载进支持数据持久吧。行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list
,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。Redis是一个
远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构,
各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其它数据库那样,要求用户扭曲
问题来适应数据库。除此之外,通过复制、持久化(persistence)和客户端分片(client-sidesharding)等
特性,用户可以很方便地将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。笔者第一次使用Redis是在一家公司
里面,这家公司需要对一个保存了6万个客户联系方式的关系数据库进行搜索,搜索可以根据名字、邮件地址、所在地和电话号码来进行,每次搜索
需要花费10~15秒的时间。在花了一周时间学习Redis的基础知识之后.我使用Redis重写了一个新的搜索引擎,然后又花费了数周时
间来仔细测试这个新系统.使它达到生产级别,最终这个新的搜索系统不仅可以根据名字、邮件地址。所在地和电话号码等信息来过滤和排序客户联
系方式,并且每次操作都可以在50毫秒之内完成,这比原来的搜索系统足是快了200倍。Redis是一个速度非常快的非关系数据库(non
-relationaldatabase),它可以存储键(key)与5种不同类型的值(value)之间的映射(mapping),可
以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能,接下来的几节将分别介绍Re
dis的这几个特性。分片是一种将数据划分为多个部分的方法,对数据的划分可以基于键包含的ID、基于键的散列值,或者基于以上两者的某种
组合。通过对数据进行分片,用户可以将数据存储到多台机器里面,也可以从多台机器里面获取数据,这种方法在解决某些问题时可以获得线性级别
的性能提升。本章将介绍Redis的适用范围,以及在不同环境中使用Redis的方法(比如怎样跟不同的组件和编程语言进行通信等);而之
后的章节则会展示各式各样的问题,以及使用Redis来解决这些同题的方法。Redis支持的数据类型有String、List、Set、
SortedSet和hashes类型。Redis优势性能极高?–Redis能读的速度是110000次/s,写的速度是8100
0次/s。丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及Orde
redSets数据类型操作。原子–Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。丰富
的特性?–Redis还支持publish/subscribe,通知,key过期等等特性。Redis相比memcached
的优势:(1)memcached所有的值均是简单的字符串,Redis作为其替代者,支持更为丰富的数据类型(2)Redis的速
度比memcached快很多(3)Redis可以持久化其数据Redis与其它key-value存储有什么不同?Redis有着更为
复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其它数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序
员透明,无需进行额外的抽象。Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不
能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做
很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。为什么Redis需要
把所有数据放到内存中?Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和
数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响Redis的性能。在内存越来越便宜的今天,Redis将会越来越受
欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。Redis集群方案应该怎么做?都有哪些方案?1.t
wemproxy,大概概念是,它类似于一个代理方式,使用方法和普通Redis无任何区别,设置好它下属的多个Redis实例后,使用时
在本需要连接Redis的地方改为连接twemproxy,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体Re
dis,将结果再返回twemproxy。使用方式简便(相对redis只需修改连接端口),对旧项目扩展的首选。问题:twempro
xy自身单端口实例的压力,使用一致性hash后,对Redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。2.cod
is,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数量改变情况下,旧节点数据可恢复到新hash节点
。3.rediscluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点
设置从节点。具体看官方文档介绍。4.在业务代码层实现,起几个毫无关联的Redis实例,在代码层,对key进行hash计算,然后去
对应的Redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢
复,实例的监控,等等。Redis集群方案什么情况下会导致整个集群不可用?有A,B,C三个节点的集群,在没有复制模型的情况下,如果节
点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。Redis有哪些适合的场景?(1)、会话缓存(Ses
sionCache)最常用的一种使用Redis的情景是会话缓存(sessioncache)。用Redis缓存会话比其他存储(如
Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人
都会不高兴的,现在,他们还会这样吗?幸运的是,随着Redis这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。
甚至广为人知的商业平台Magento也提供Redis的插件。(2)、全页缓存(FPC)除基本的会话token之外,Redis还提供
很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改
进,类似PHP本地FPC。再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。此外,对WordP
ress的用户来说,Pantheon有一个非常好的插件wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。(3)、
队列Reids在内存存储引擎领域的一大优点是提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。
Redis作为队列使用的操作,就类似于本地程序语言(如Python)对list的push/pop操作。如果你快速的在Goo
gle中搜索“Redisqueues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满
足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。(4),排行榜/计数器Redi
s在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变
的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_s
cores”,我们只需要像下面一样执行即可:当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这
样执行:ZRANGEuser_scores010WITHSCORESAgoraGames就是一个很好的例子,用Ruby实
现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。(5)、发布/订阅最后(但肯定不是最不重要的)是Redis的发布
/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis
的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。Redis支持的Java客户端都有哪些?官方推荐用哪个?Redis
son、Jedis、lettuce等等,官方推荐使用Redisson。Redis与其它数据库和软件的对比如果你熟悉关系数据库,那么
你肯定写过用来关联两个表的数据的SQL查询。而Redis则属于人们常说的NoSQL数据库或者非关系数据库:Redis不使用表,它的
数据库也不会预定义或者强制去要求用户对Redis存储的不同数据进行关联。高性能键值缓存服务器memcached也经常被拿来与Red
is进行比较:这两者都可用于存储键值映射,彼此的性能也相差无几,但是Redis能够自动以两种不同的方式将数据写人硬盘,并且Redi
s除了能存储普通的字符串键之外,还可以存储其他4种数据结构,而memcached只能存储普通的字符串键。这些不同之处使得Redis
可以用于解决更为广泛的问题,并且既可以用作主数据库(primarydatabase)使用,又可以作为其他存储系统的辅助数据库(a
uxiliarydatabase)使用。本书的后续章节会分别介绍将Redis用作主存储(primarystorage)和二级存
储(secondarystorage)时的用法和查询模式。一般来说,许多用户只会在Redis的性能或者功能是必要的情况下,才会将
数据存储到Redis里面:如果程序对性能的要求不高,又或者因为费用原因而没办法将大量数据存储到内存里面,那么用户可能会选择使用关系
数据库,或者其他非关系数据库。在实际中,读者应该根据自己的需求来决定是否使用Redis,并考虑是将Redis用作主存储还是辅助存储
,以及如何通过复制、持久化和事务等手段保证数据的完整性。表1-1展示了一部分在功能上与Redis有重叠的数据库服务器和缓存服务器,
从这个表可以看出Redis与这些数据库及软件之间的区别。表1-1一些数据库和缓存服务器的特性与功能附加特性在使用类似Redis这
样的内存数据库时,一个首先要考虑的问题就是“当服务器被关闭时,服务器存储的数据将何去何从呢?”Redis拥有两种不同形式的持久化方
法,它们都可以用小而紧凑的格式将存储在内存中的数据写人硬盘:第一种持久化方法为时间点转储(point-in-timedump),
转储操作既可以在“指定时间段内有指定数量的写操作执行"这一条件被满足时执行,又可以通过调用两条转储到硬盘(dump-to-disk
)命令中的任何一条来执行;第二种持久化方法将所有修改了数据库的命令都写人一个只追加(append-only)文件里面,用户可以根据
数据的重要程度,将只追加写人设置为从不同步(sync)、每秒同步一次或者每写人一个命令就同步一次。尽管Redis的性能很好,但受限
于Redis的内存存储设计,有时候只使用一台Redis服务器可能没有办法处理所有请求。因此,为了扩展Redis的读性能,并为Red
is提供故障转移(failover)支持,Redis实现了主从复制特性:执行复制的从服务器会连接上主服务器,接收主服务器发送的整个
数据库的初始副本(copy);之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因
为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。使用Red
is的理由有memcached使用经验的读者可能知道,用户只能用APPEND命令将数据添加到已有字符串的末尾。memcached的
文档中声明,可以用APPEND命令来管理元素列表。这很好!用户可以将元素追加到一个字符串的末尾,并将那个字符串当作列表来使用。但随
后如何删除这些元素呢?memcached采用的办法是通过黑名单(blacklist)来隐藏列表里面的元素,从而避免对元素执行读取、
更新、写人(包括在一次数据库查询之后执行的memcached写人)等操作。相反地,Redis的LIST和SET允许用户直接添加或者
删除元素。使用Redis而不是memcached来解决问题,不仅可以让代码变得更简短、更易懂、更易维护,而且还可以使代码的运行速度
更快(因为用户不需要通过读取数据库来更新数据)。除此之外,在其他许多情况下,Redis的效率和易用性也比关系数据库要好得多。数据库
的一个常见用法是存储长期的报告数据,并将这些报告数据用作固定时间范围内的聚合数据(aggregates)。收集聚合数据的常见做法是
:先将各个行插人一个报告表里面,之后再通过扫描这些行来收集聚合数据,并根据收集到的聚合数据来更新聚合表中已有的那些行。之所以使用插
人行的方式来存储,是因为对于大部分数据库来说,插人行操作的执行速度非常快(插入行只会在硬盘文件末尾进行写人)。不过,对表里面的行进
行更新却是一个速度相当慢的操作,因为这种更新除了会引起一次随机读(randomread)之外,还可能会引起一次随机写(rando
mwrite)。而在Redis里面,用户可以直接使用原子的(atomic)INCR命令及其变种来计算聚合数据,并且因为Redis
将数据存储在内存里面,而且发送给Redis的命令请求并不需要经过典型的查询分析器(parser)或者查询优化器(optimizer
)进行处理,所以对Redis存储的数据执行随机写的速度总是非常迅速的。使用Redis而不是关系数据库或者其他硬盘存储数据库,可以避
免写入不必要的临时数据,也免去了对临时数据进行扫描或者删除的麻烦,并最终改善程序的性能。虽然上面列举的都是一些简单的例子,但它们很
好地证明了“工具会极大地改变人们解决问题的方式”这一点。客观来讲,memcached也能用在这个简单的场景里,但使用Redis存储
聚合数据有以下3个好处:首先,使用Redis可以将彼此相关的聚合数据放在同一个结构里面,这样访问聚合数据就会变得更为容易;其次,使
用Redis可以将聚合数据放到有序集合里面,构建出一个实时的排行榜;最后,Redis的聚合数据可以是整数或者浮点数,而memcac
hed的聚合数据只能是整数。除了第6章提到的任务队列(taskqueue)之外,本书的大部分内容都致力于实时地解决问题。本书通过
展示各种技术并提供可工作的代码来帮助读者消灭瓶颈、简化代码、收集数据、分发(distribute)数据、构建实用程序(utilit
y),并最终帮助读者更轻松地完成构建软件的任务。只要正确地使用书中介绍的技术,读者的软件就可以扩展至令那些所谓的“web扩展技术(
web-sacletechnology)”相形见绌的地步。在了解了Redis是什么、它能做什么以及我们为什么要使用它之后,是时候
来实际地使用一下它了。接下来的一节将对Redis提供的数据结构进行介绍,说明这些数据结构的作用,并展示操作这些数据结构的其中一部分
命令。2)Redis数据结构简介2.1.Redis的KeyRedis的key是字符串类型,但是key中不能包括边界字符
,由于key不是binarysafe的字符串,所以像"mykey"和"mykey\n"这样包含空格和换行的key是
不允许的。2.1.1.key相关指令介绍exitskey检测指定key是否存在,返回1表示存在,0不存在delkey1
key2......keyN删除给定key,返回删除key的数目,0表示给定key都不存在typekey返回给定key值
的类型。返回none表示key不存在,string字符类型,list链表类型set无序集合类型......keyspat
tern返回匹配指定模式的所有keyrandomkey返回从当前数据库中随机选择的一个key,如果当前数据库是空的,返回空串
renameoldkeynewkey重命名一个key,如果newkey存在,将会被覆盖,返回1表示成功,0失败。可能是ol
dkey不存在或者和newkey相同。renamenxoldkeynewkey同上,但是如果newkey存在返回失败。exp
irekeyseconds为key指定过期时间,单位是秒。返回1成功,0表示key已经设置过过期时间或者不存在。ttlke
y返回设置过过期时间key的剩余过期秒数。-1表示key不存在或者未设置过期时间。selectdb-index通过索引选择
数据库,默认连接的数据库是0,默认数据库数是16个。返回1表示成功,0失败。movekeydb-index将key从当前数
据库移动到指定数据库。返回1表示成功。0表示key不存在或者已经在指定数据库中。2.2.Redis的vauleRedis支持
五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset:有序集合
)。2.2.1.string类型string是最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个v
alue,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化
的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。实例redis127.0.0.1:6
379>SETname"w3cschool.cn"OKredis127.0.0.1:6379>GETname"w3cs
chool.cn"在以上实例中我们使用了Redis的?SET?和?GET?命令。键为name,对应的值为w3cschool.
cn。注意:一个键最大能存储512MB,一个字符串类型的值能存储最大容量也是512MB。string类型数据操作指令简介set
keyvalue设置key对应string类型的值,返回1表示成功,0失败。setnxkeyvalue如果key不存在,
设置key对应string类型的值。如果key已经存在,返回0。getkey获取key对应的string值,如果key不存在返
回nilgetsetkeyvalue先获取key的值,再设置key的值。如果key不存在返回nil。mgetkey1k
ey2......keyN一次获取多个key的值,如果对应key不存在,则对应返回nil。msetkey1value1
......keyNvalueN一次设置多个key的值,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置。m
setnxkey1value1......keyNvalueN一次设置多个key的值,但是不会覆盖已经存在的keyi
ncrkey对key的值做++操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key
,则设置key值为1。decrkey对key的值做--操作,decr一个不存在key,则设置key值为-1。incrbyk
eyinteger对key加上指定值,key不存在时候会设置key,并认为原来的value是0。decrbykeyin
teger对key减去指定值。decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,反之一样。2.
2.2.hash类型hash是一个string类型的field和value的映射表。添加,删除操作都是O(1)(平均)。has
h特别适合用于存储对象。相对于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更
方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用zipmap(又称为smallhash)来存储的。这个zi
pmap其实并不是hashtable,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。尽
管zipmap的添加,删除,查找都是O(n),但是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是
说添加删除平均还是O(1)。如果field或者value的大小超出一定限制后,redis会在内部自动将zipmap替换成正常的
hash实现.这个限制可以在配置文件中指定。hash-max-zipmap-entries64#配置字段最多64个hash
-max-zipmap-value512#配置value最大为512字节hash类型数据操作指令简介hsetkeyf
ieldvalue设置hashfield为指定值,如果key不存在,则创建hgetkeyfield获取指定的hash
field。hmgetkeyfiled1....fieldN获取全部指定的hashfiled。hmsetkeyfil
ed1value1......filedNvalueN同时设置hash的多个field。hincrbykeyfiel
dinteger将指定的hashfiled加上指定值。成功返回hashfiled变更后的值。hexistskeyfie
ld检测指定field是否存在。hdelkeyfield删除指定的hashfield。hlenkey返回指定ha
sh的field数量。hkeyskey返回hash的所有field。hvalskey返回hash的所有value。hge
tall返回hash的所有filed和value2.2.3.list类型list是一个链表结构,可以理解为一个每个子元素都是
string类型的双向链表。主要功能是push、pop、获取一个范围的所有值等。操作中key理解为链表的名字。List类型数据操
作指令简介lpushkeystring在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是lis
t类型。rpushkeystring在key对应list的尾部添加字符串元素。llenkey返回key对应list的长度
,如果key不存在返回0,如果key对应类型不是list返回错误。lrangekeystartend返回指定区间内的元素
,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素,key不存在返回空列表。ltrimkeystartend截取
list指定区间内元素,成功返回1,key不存在返回错误。lsetkeyindexvalue设置list中指定下标的元素值
,成功返回1,key或者下标不存在返回错误。lremkeycountvalue从List的头部(count正数)或尾部
(count负数)删除一定数量(count)匹配value的元素,返回删除的元素数量。count为0时候删除全部。lpopkey
从list的头部删除并返回删除元素。如果key对应list不存在或者是空返回nil,如果key对应值不是list返回错误。rpo
pkey从list的尾部删除并返回删除元素。blpopkey1......keyNtimeout从左到右扫描,返回对第
一个非空list进行lpop操作并返回,比如blpoplist1list2list30,如果list不存在list2,l
ist3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout
秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1...keyN中的任意key进行push操作,则第一
在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil。有点像unix的select或者poll。brpop
同blpop,一个是从头部删除一个是从尾部删除。2.2.4.set类型set是无序集合,最大可以包含(2的32次方-1)个
元素。set的是通过hashtable实现的,所以添加,删除,查找的复杂度都是O(1)。hashtable会随着添加
或者删除自动的调整大小。需要注意的是调整hashtable大小时候需要同步(获取写锁)会阻塞其它读写操作。可能不久后就会改用
跳表(skiplist)来实现。跳表已经在sortedsets中使用了。关于set集合类型除了基本的添加删除操作,其它
有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易
的实现SNS中的好友推荐和blog的tag功能。set类型数据操作指令简介saddkeymember添加一个
string元素到key对应set集合中,成功返回1,如果元素以及在集合中则返回0,key对应的set不存在则返回错误。srem
keymember从key对应set中移除指定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果ke
y对应的不是set类型的值返回错误。spopkey删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返
回nil。srandmemberkey同spop,随机取set中的一个元素,但是不删除元素。smovesrckeyds
tkeymember从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的。成功返回1,
如果member在srckey中不存在返回0,如果key不是set类型返回错误。scardkey返回set的元素个数,如果
set是空或者key不存在返回0。sismemberkeymember判断member是否在set中,存在返回1,0表示不存
在或者key不存在。sinterkey1key2……keyN返回所有给定key的交集。sinterstoredstk
eykey1.......keyN返回所有给定key的交集,并保存交集存到dstkey下。sunionkey1key2
......keyN返回所有给定key的并集。sunionstoredstkeykey1......keyN返回所
有给定key的并集,并保存并集到dstkey下。sdiffkey1key2......keyN返回所有给定key的差集。
sdiffstoredstkeykey1......keyN返回所有给定key的差集,并保存差集到dstkey下。sme
mberskey返回key对应set的所有元素,结果是无序的。2.2.5.sortedset类型sortedset是有序
集合,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。可以理解
了有两列的mysql表,一列存value,一列存顺序。操作中key理解为sortedset的名字。SortedSet类型数据
操作指令简介addkeyscoremember添加元素到集合,元素在集合中存在则更新对应score。zremkey
member删除指定元素,1表示成功,如果元素不存在返回0。zincrbykeyincrmember增加对应me
mber的score值,然后移动元素并保持skiplist保持有序。返回更新后的score值。zrankkey
member返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的。zrevrankkeymemb
er同上,但是集合中元素是按score从大到小排序。zrangekeystartend类似lrange操作从集合
中去指定区间的元素。返回的是有序结果zrevrangekeystartend同上,返回结果是按score逆序的。z
rangebyscorekeyminmax返回集合中score在给定区间的元素。zcountkeyminmax
返回集合中score在给定区间的数量。zcardkey返回集合中元素个数。zscorekeyelement返回
给定元素对应的score。zremrangebyrankkeyminmax删除集合中排名在给定区间的元素。zremra
ngebyscorekeyminmax删除集合中score在给定区间的元素3)持久化通常Redis将数据存储在内存中
或虚拟内存中,它是通过以下两种方式实现对数据的持久化。3.1.快照方式:(默认持久化方式)这种方式就是将内存中数据以快照的方式写入
到二进制文件中,默认的文件名为dump.rdb。客户端也可以使用save或者bgsave命令通知redis做一次快照持久化。sa
ve操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有客户端的请求,这种方式会阻塞所有客户端请求。所以不推荐使用。
另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较多,
必然会引起大量的磁盘IO操作,可能会严重影响性能。注意:由于快照方式是在一定间隔时间做一次的,所以如果redis意外当机的话,
就会丢失最后一次快照后的所有数据修改。3.2.日志追加方式:这种方式redis会将每一个收到的写命令都通过write函数追
加到文件中(默认appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以
通过配置文件告诉redis我们想要通过fsync函数强制操作系统写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)a
ppendonlyyes//启用日志追加持久化方式#appendfsyncalways的持久化,不推荐使用//每次收到写命令就
立即强制写入磁盘,最慢的,但是保证完全appendfsynceverysec中,推荐//每秒钟强制写入磁盘一次,在性能和持久化方
面做了很好的折#appendfsyncno//完全依赖操作系统,性能最好,持久化没保证日志追加方式同时带来了另一个问题。持久化文
件会变的越来越大。例如我们调用incrtest命令100次,文件中必须保存全部100条命令,其实有99条都是多余
的。因为要恢复数据库状态其实文件中保存一条settest100就够了。为了压缩这种持久化方式的日志文件。redis提供
了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后
替换原来的持久化日志文件。4)http://www.cnblogs.com/xhan/archive/2011/02/07/19
49717.html虚拟内存(适用于value比key大的情况)4.1.Redis虚拟内存简介首先说明下Redis的虚拟内存与操作
系统虚拟内存不是一码事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间。对于Re
dis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个Redis服务器以外。另外的能够提高数据库容量的办法就是使用虚拟
内存技术把那些不经常访问的数据交换到磁盘上。如果我们存储的数据总是有少部分数据被经常访问,大部分数据很少被访问,对于网站来说确实总
是只有少量用户经常活跃。当少量数据被经常访问时,使用虚拟内存不但能提高单台Redis数据库服务器的容量,而且也不会对性能造成太多影
响。Redis没有使用操作系统提供的虚拟内存机制而是自己在用户态实现了自己的虚拟内存机制。主要的理由有以下两点:操作系统的虚拟内存
是以4k/页为最小单位进行交换的。而Redis的大多数对象都远小于4k,所以一个操作系统页上可能有多个Redis对象。另外Redi
s的集合对象类型如list,set可能存在于多个操作系统页上。最终可能造成只有10%的key被经常访问,但是所有操作系统页都会被
操作系统认为是活跃的,这样只有内存真正耗尽时操作系统才会进行页的交换。相比操作系统的交换方式。Redis可以将被交换到磁盘的对象进
行压缩,保存到磁盘的对象可以去除指针和对象元数据信息。一般压缩后的对象会比内存中的对象小10倍。这样Redis的虚拟内存会比操作
系统的虚拟内存少做很多IO操作。4.2.Redis虚拟内存相关配置vm-enabledyes#开启虚拟内存功能vm-swap-
file/tmp/redis.swap#交换出来value保存的文件路径/tmp/redis.swapvm-max-mem
ory268435456#Redis使用的最大内存上限(256MB),超过上限后redis开始交换value到磁盘swap文件
中。建议设置为系统空闲内存的60%-80%vm-page-size32#每个Redis页的大小32个字节vm-pages13
4217728#最多在文件中使用多少个页,交换文件的大小=(vm-page-sizevm-pages)4GBvm-max
-threads8#用于执行value对象换入换出的工作线程数量。0表示不使用工作线程(详情后面介绍)Redis的虚拟内存在
设计上为了保证key的查询速度,只会将value交换到swap文件中。如果是由于太多key很小的value造成的内存问题,那么Re
dis的虚拟内存并不能解决问题。和操作系统一样Redis也是按页来交换对象的。Redis规定同一个页只能保存一个对象。但是一个对象
可以保存在多个页中。在Redis使用的内存没超过vm-max-memory之前是不会交换任何value的。当超过最大内存限制后,R
edis会选择把较老的对象交换到swap文件中去。如果两个对象一样老会优先交换比较大的对象,精确的交换计算公式swappabi
lity=agelog(size_in_memory)。对于vm-page-size的设置应该根据自己应用将页的大小设置为可以
容纳大多数对象的尺寸。太大了会浪费磁盘空间,太小了会造成交换文件出现过多碎片。对于交换文件中的每个页,Redis会在内存中用一个1
bit值来对应记录页的空闲状态。所以像上面配置中页数量(vm-pages134217728)会占用16MB内存用来记录页的空闲状态
。vm-max-threads表示用做交换任务的工作线程数量。如果大于0推荐设为服务器的CPU的核心数。如果是0则交换过程在主线
程进行。4.3.Redis虚拟内存工作方式简介4.3.1.当vm-max-threads设为0时(阻塞方式)换出主线程定期检查发
现内存超出最大上限后,会直接以阻塞的方式,将选中的对象保存到swap文件中,并释放对象占用的内存空间,此过程会一直重复直到下面条
件满足1.内存使用降到最大限制以下2.swap文件满了。3.几乎全部的对象都被交换到磁盘了换入当有客户端请求已经被换出的value
时,主线程会以阻塞的方式从swap文件中加载对应的value对象,加载时此时会阻塞所有客户端。然后处理该客户端的请求4.3.2.
当vm-max-threads大于0时(工作线程方式)换出当主线程检测到使用内存超过最大上限,会将选中要交换的对象信息放到一个队
列中交给工作线程后台处理,主线程会继续处理客户端请求。换入如果有客户端请求的key已经被换出了,主线程会先阻塞发出命令的客户端,然
后将加载对象的信息放到一个队列中,让工作线程去加载。加载完毕后工作线程通知主线程。主线程再执行客户端的命令。这种方式只阻塞请求的v
alue是已经被换出key的客户端。总的来说阻塞方式的性能会好一些,因为不需要线程同步、创建线程和恢复被阻塞的客户端等开销。但是也
相应的牺牲了响应性。工作线程方式主线程不会阻塞在磁盘IO上,所以响应性更好。如果我们的应用不太经常发生换入换出,而且也不太在意
有点延迟的话推荐使用阻塞方式。关于redis虚拟内存更详细介绍可以参考下面链接http://redis.io/topics/
internals-vmhttp://redis.io/topics/internals-vm5)主从同步5.1.Redis主从
复制简介Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。master可以有多个slave。除了多个slave
连到相同的master外,slave也可以连接其它slave形成图状结构。主从复制不会阻塞master。也就是说当一个或多个sla
ve与master进行初次同步数据时,master可以继续处理客户端发来的请求。相反slave在初次同步数据时则会阻塞不能处理客户
端的请求。主从复制可以用来提高系统的可伸缩性,我们可以用多个slave专门用于客户端的读请求,比如sort操作可以使用slave
来处理。也可以用来做简单的数据冗余。可以在master禁用数据持久化,只需要注释掉master配置文件中的所有save
配置,然后只在slave上配置数据持久化。5.2.Redis主从复制的过程介绍当设置好slave服务器后,slave会建
立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一
个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件后,master
就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着master就
会把缓存的命令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。从master到sl
ave的同步数据的命令和从客户端发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自
动重新建立连接。如果master同时收到多个slave发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有
slave。配置slave服务器很简单,只需要在配置文件中加入如下配置slaveof192.168.1.16379#指定
master的ip和端口6)数据淘汰策略Redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。noevic
tion:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)allkeys-
lru:尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。volatile-lru:尝试回收最少使用的键(LRU),
但仅限于在过期集合的键,使得新添加的数据有空间存放。allkeys-random:回收随机的键使得新添加的数据有空间存放。vol
atile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。volatile-ttl:回收在过期
集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。附录A:Redis的安装与配置1.1.安装1.1.1
.Linux下编译安装$wgethttp://redis.googlecode.com/files/redis-2.2.7.
tar.gz$tarxzfredis-2.2.7.tar.gz$cp-rredis-2.2.7/usr/local/
redis$cd/usr/local/redis$make$makeinstall#编译好的文件将被复制到/usr/l
ocal/bin下#redis-server:Redis服务器的daemon启动程序#redis-cli:Redis命令行
操作工具。当然,你也可以用telnet根据其纯文本协议来操作#redis-benchmark:Redis性能测试工具,测试
Redis在你的系统及你的配置下的读写性能$redis-benchmark-n100000–c50#模拟同时由50个
客户端发送100000个SETs/GETs查询#redis-check-aof:更新日志检查#redis-check-du
mp:本地数据库检查Linux下安装下载地址:https://redis.io/downloadhttp://redis.io/
download,下载最新文档版本。本教程使用的最新文档版本为2.8.17,下载并安装:$wgethttp://downlo
ad.redis.io/releases/redis-2.8.17.tar.gz$tarxzfredis-2.8.17.ta
r.gz$cdredis-2.8.17$makemake完后redis-2.8.17目录下会出现编译后的redis服务程
序redis-server,还有用于测试的客户端程序redis-cli都会位于安装目录中的src目录下。下面启动redis
服务.$cdsrc$./redis-server注意这种方式启动redis使用的是默认配置。也可以通过启动参数告诉re
dis使用指定配置文件使用下面命令启动。$./redis-serverredis.confredis.conf是一个默认的
配置文件。我们可以根据需要使用自己的配置文件。启动redis服务进程后,就可以使用测试客户端程序redis-cli和re
dis服务交互了。比如:$cdsrc$./redis-cliredis>setfoobarOKredis>get
foo"bar"Ubuntu下安装在Ubuntu系统安装Redi可以使用以下命令:$sudoapt-getupda
te$sudoapt-getinstallredis-server启动Redis$redis-server查看redis
是否启动?$redis-cli以上命令将打开以下终端:redis127.0.0.1:6379>127.0.0.1是本机IP
,6379是redis服务端口。现在我们输入PING命令。redis127.0.0.1:6379>pingPONG
以上说明我们已经成功安装了redis。Redis配置Redis的配置文件位于Redis安装目录下,文件名为redis.c
onf。你可以通过?CONFIG?命令查看或设置配置项。语法RedisCONFIG命令格式如下:redis127.0.0.1
:6379>CONFIGGETCONFIG_SETTING_NAME实例redis127.0.0.1:6379>CONF
IGGETloglevel1)"loglevel"2)"notice"使用??号获取所有配置项:实例redis127.
0.0.1:6379>CONFIGGET1)"dbfilename"2)"dump.rdb"3)"requir
epass"4)""5)"masterauth"6)""7)"unixsocket"8)""9)"logf
ile"10)""11)"pidfile"12)"/var/run/redis.pid"13)"maxmemory
"14)"0"15)"maxmemory-samples"16)"3"17)"timeout"18)"0"1
9)"tcp-keepalive"20)"0"21)"auto-aof-rewrite-percentage"22)
"100"23)"auto-aof-rewrite-min-size"24)"67108864"25)"hash-ma
x-ziplist-entries"26)"512"27)"hash-max-ziplist-value"28)"64
"29)"list-max-ziplist-entries"30)"512"31)"list-max-ziplist-
value"32)"64"33)"set-max-intset-entries"34)"512"35)"zset-
max-ziplist-entries"36)"128"37)"zset-max-ziplist-value"38)"
64"39)"hll-sparse-max-bytes"40)"3000"41)"lua-time-limit"42
)"5000"43)"slowlog-log-slower-than"44)"10000"45)"latency-m
onitor-threshold"46)"0"47)"slowlog-max-len"48)"128"49)"po
rt"50)"6379"51)"tcp-backlog"52)"511"53)"databases"54)"1
6"55)"repl-ping-slave-period"56)"10"57)"repl-timeout"58)"
60"59)"repl-backlog-size"60)"1048576"61)"repl-backlog-ttl"
62)"3600"63)"maxclients"64)"4064"65)"watchdog-period"66)
"0"67)"slave-priority"68)"100"69)"min-slaves-to-write"70)
"0"71)"min-slaves-max-lag"72)"10"73)"hz"74)"10"75)"no-a
ppendfsync-on-rewrite"76)"no"77)"slave-serve-stale-data"78)
"yes"79)"slave-read-only"80)"yes"81)"stop-writes-on-bgsave-
error"82)"yes"83)"daemonize"84)"no"85)"rdbcompression"86
)"yes"87)"rdbchecksum"88)"yes"89)"activerehashing"90)"ye
s"91)"repl-disable-tcp-nodelay"92)"no"93)"aof-rewrite-incre
mental-fsync"94)"yes"95)"appendonly"96)"no"97)"dir"98)"
/home/deepak/Downloads/redis-2.8.13/src"99)"maxmemory-policy"10
0)"volatile-lru"101)"appendfsync"102)"everysec"103)"save"104)
"360013001006010000"105)"loglevel"106)"notice"107)"clien
t-output-buffer-limit"108)"normal000slave26843545667108864
60pubsub33554432838860860"109)"unixsocketperm"110)"0"111)
"slaveof"112)""113)"notify-keyspace-events"114)""115)"bind"11
6)""编辑配置你可以通过修改redis.conf文件或使用?CONFIGset?命令来修改配置。语法CONFIGSET
?命令基本语法:redis127.0.0.1:6379>CONFIGSETCONFIG_SETTING_NAMENEW_
CONFIG_VALUE实例redis127.0.0.1:6379>CONFIGSETloglevel"notice"O
Kredis127.0.0.1:6379>CONFIGGETloglevel1)"loglevel"2)"notice
"参数说明redis.conf配置项说明如下:1.Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用
守护进程?daemonizeno2.当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis
.pid文件,可以通过pidfile指定?pidfile/var/run/redis.pid3.指定Redis监听端口,默认端
口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取
自意大利歌女AlessiaMerz的名字?port63794.绑定的主机地址?bind127.0.0.15.当客户端闲置
多长时间后关闭连接,如果指定为0,表示关闭该功能?timeout3006.指定日志记录级别,Redis总共支持四个级别:deb
ug、verbose、notice、warning,默认为verbose?loglevelverbose7.日志记录方式,默认
为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null?log
filestdout8.设置数据库的数量,默认数据库为0,可以使用SELECT命令在连接上指定数据库id?dat
abases169.指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合?save
Redis默认配置文件中提供了三个条件:?save9001?save30010?save6010
000分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。?10.指定存
储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变
的巨大?rdbcompressionyes11.指定本地数据库文件名,默认值为dump.rdb?dbfilenamedump
.rdb12.指定本地数据库存放目录?dir./13.设置当本机为slav服务时,设置master服务的IP地址及端口,在R
edis启动时,它会自动从master进行数据同步?slaveof14.当mas
ter服务设置了密码保护时,slav服务连接master的密码?masterauth15.设
置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH命令提供密码,默认关闭?r
equirepassfoobared16.设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Re
dis进程可以打开的最大文件描述符数,如果设置maxclients0,表示不作限制。当客户端连接数到达限制时,Redis会关闭
新的连接并向客户端返回maxnumberofclientsreached错误信息?maxclients12817.指定
Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当
此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,V
alue会存放在swap区?maxmemory18.指定是否在每次更新操作后进行日志记录,Redis在默认情况下
是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来
同步的,所以有的数据会在一段时间内只存在于内存中。默认为no?appendonlyno19.指定更新日志文件名,默认为appe
ndonly.aof?appendfilenameappendonly.aof20.指定更新日志条件,共有3个可选值:?no:
表示等操作系统进行数据缓存同步到磁盘(快)?always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)?ev
erysec:表示每秒同步一次(折衷,默认值)?appendfsynceverysec?21.指定是否启用虚拟内存机制,默认值
为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到
内存中(在后面的文章我会仔细分析Redis的VM机制)?vm-enabledno22.虚拟内存文件路径,默认值为/tmp/re
dis.swap,不可多个Redis实例共享?vm-swap-file/tmp/redis.swap23.将所有大于vm-ma
x-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据就是
keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0?vm-max-me
mory024.Redisswap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对
象共享,vm-page-size是要根据存储的数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64b
ytes;如果存储很大大对象,则可以使用更大的page,如果不确定,就使用默认值?vm-page-size3225.设置sw
ap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1by
te的内存。?vm-pages13421772826.设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么
所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4?vm-max-threads427.设置在向客户端
应答时,是否把较小的包合并为一个包发送,默认为开启?glueoutputbufyes28.指定在超过一定的数量或者最大的元素超
过某一临界值时,采用一种特殊的哈希算法?hash-max-zipmap-entries64?hash-max-zipmap-va
lue51229.指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)?activerehashing
yes30.指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配
置文件?include/path/to/local.conf1.1.2.配置修改配置文件,并将其复制到etc目录下vired
is.conf$cpredis.conf/etc/redis.conf配置文件基本说明daemonize:#是否以后台守护进程
方式运行pidfile:#pid文件位置port:#监听的端口号timeout:#请求超时时间loglevel:默认为verbos
e#log信息级别,总共支持四个级别:debug、verbose、notice、warning,logfile:#默认为标准输出(
stdout),如果配置为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/nulldataba
ses:#开启数据库的数量。使用“SELECT库ID”方式切换操作各个数据库save:#保存快照的频率,第一个表示多
长时间,第二个表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。rdbcompressio
n:#保存快照是否使用压缩dbfilename:#数据快照文件名(只是文件名,不包括目录)。默认值为dump.rdbdir:#数
据快照的保存目录(这个是目录)requirepass:#设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通
过AUTH命令提供密码,默认关闭。1.1.3.启动Redis$redis-server/etc/redi
s.conf1.1.4.关闭Redis$redis-clishutdown#关闭指定端口的redis-server$redi
s-cli-p6379shutdown1.1.5.更新安装redis其它同安装,只是最后makeinstall之前需要把
正在运行的老版本redis关闭。1.1.6.Redis系统管理相关指令简介DBSIZE返回当前数据库key的数量。INFO返
回当前redis服务器状态和一些统计信息。http://redis.io/commands/monitorMONITOR实时监听
并返回redis服务器接收到的所有请求信息。http://redis.io/commands/shutdownSHUTDOWN把
数据同步保存到磁盘上,并关闭redis服务。http://redis.io/commands/config-getCONFIGhttp://redis.io/commands/config-getGETparameter获取一个redis配置参数信息。(个别参数可能无法获取)http://redis.io/commands/config-setCONFIGhttp://redis.io/commands/config-setSETparametervalue设置一个redis配置参数信息。(个别参数可能无法获取)http://redis.io/commands/config-resetstatCONFIGhttp://redis.io/commands/config-resetstatRESETSTAT重置INFO命令的统计信息。(重置包括:Keyspace命中数、Keyspace错误数、处理命令数,接收连接数、过期key数)http://redis.io/commands/debug-objectDEBUGhttp://redis.io/commands/debug-objectOBJECTkey获取一个key的调试信息。http://redis.io/commands/debug-segfaultDEBUGhttp://redis.io/commands/debug-segfaultSEGFAULT制造一次服务器当机。FLUSHDB删除当前数据库中所有key,此方法不会失败。小心慎用FLUSHALL删除全部数据库中所有key,此方法不会失败。小心慎用1.1.7.Window下安装下载地址:https://github.com/dmajkic/redis/downloadshttps://github.com/dmajkic/redis/downloads。下载到的Redis支持32bit和64bit,根据自己实际情况选择。本教程将64bit的内容cp到自定义盘符安装目录取名redis。如C:\redis打开一个cmd窗口使用cd命令切换目录到C:\redis运行?redis-server.exeredis.conf?。(如果下载的是Redis-x64-3.2.100版本,是运行?redis-server.exeredis.windows.conf)如果想方便的话,可以把redis的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个redis.conf可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。切换到redis目录下运行?redis-cli.exe-h127.0.0.1-p6379?。设置键值对?setmyKeyabc取出键值对?getmyKey附录B:安装phpredis模块https://github.com/nicolasff/phpredis下载phpredis最新版本解压>cdphpredis>/usr/local/php5/bin/phpize#这个phpize是安装php模块的>./configure–with-php-config=/usr/local/php5/bin/php-config>make>cpmodules/redis.so/usr/local/php5/etc/redis.so接下来在php.ini中添加extension=redis.so.重启apachephp代码测试connect(‘127.0.0.1′,6379);$redis->set(‘test’,''helloworld!’);echo$redis->get(‘test’);?>phpredis方法说明:https://github.com/nicolasff/phpredis/blob/master/README.markdownhttps://github.com/nicolasff/phpredis/blob/master/README.markdown#readme参考资料与知识扩展Redis指令大全:http://redis.io/commandshttp://redis.io/commandsRedis指令在线模拟练习:http://try.redis-db.com/http://try.redis-db.com/Redis技术参考手册1201
献花(0)
+1
(本文系zymITsky首藏)