Redis教程REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key- value存储系统。Redis是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key -Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String),哈希 (Map),列表(list),集合(sets)和有序集合(sortedsets)等类型。Redis简介Redis是完 全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三 个特点:Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的ke y-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master -slave模式的数据备份。Redis优势性能极高?–Redis能读的速度是110000次/s,写的速度是81000次/s。 丰富的数据类型–Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSe ts数据类型操作。原子–Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。丰富的特性?– Redis还支持publish/subscribe,通知,key过期等等特性。Redis与其他key-value存储有什么 不同?Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于 基本数据结构的同时对程序员透明,无需进行额外的抽象。Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需 要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简 单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访 问。Redis安装Window下安装下载地址:https://github.com/dmajkic/redis/downloa ds。下载到的Redis支持32bit和64bit。根据自己实际情况选择,将64bit的内容cp到自定义盘符安装目录取名redis 。如C:\reids打开一个cmd窗口使用cd命令切换目录到C:\redis运行?redis-server.exere dis.conf?。如果想方便的话,可以把redis的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个redis.con f可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。切 换到redis目录下运行?redis-cli.exe-h127.0.0.1-p6379?。设置键值对?setmyKey abc取出键值对?getmyKeyLinux下安装下载地址:http://redis.io/download,下载最新文档版本 。本教程使用的最新文档版本为2.8.17,下载并安装:$wgethttp://download.redis.io/relea ses/redis-2.8.17.tar.gz$tarxzfredis-2.8.17.tar.gz$cdredis-2. 8.17$makemake完后redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于 测试的客户端程序redis-cli,两个程序位于安装目录src目录下:下面启动redis服务.$cdsrc$./redi s-server注意这种方式启动redis使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。$ cdsrc$./redis-serverredis.confredis.conf是一个默认的配置文件。我们可以根据需要使用 自己的配置文件。启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。比如:$cdsr c$./redis-cliredis>setfoobarOKredis>getfoo"bar"Ubuntu下安装在 Ubuntu系统安装Redi可以使用以下命令:$sudoapt-getupdate$sudoapt-getinsta llredis-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.conf。你可以通过?CONFIG?命令 查看或设置配置项。语法RedisCONFIG命令格式如下:redis127.0.0.1:6379>CONFIGGETC ONFIG_SETTING_NAME实例redis127.0.0.1:6379>CONFIGGETloglevel1)" loglevel"2)"notice"使用??号获取所有配置项:实例redis127.0.0.1:6379>CONFIG GET1)"dbfilename"2)"dump.rdb"3)"requirepass"4)""5)"ma sterauth"6)""7)"unixsocket"8)""9)"logfile"10)""11)"pi dfile"12)"/var/run/redis.pid"13)"maxmemory"14)"0"15)"maxm emory-samples"16)"3"17)"timeout"18)"0"19)"tcp-keepalive" 20)"0"21)"auto-aof-rewrite-percentage"22)"100"23)"auto-aof -rewrite-min-size"24)"67108864"25)"hash-max-ziplist-entries" 26)"512"27)"hash-max-ziplist-value"28)"64"29)"list-max-zip list-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)"slowl og-log-slower-than"44)"10000"45)"latency-monitor-threshold"4 6)"0"47)"slowlog-max-len"48)"128"49)"port"50)"6379"51) "tcp-backlog"52)"511"53)"databases"54)"16"55)"repl-ping-s lave-period"56)"10"57)"repl-timeout"58)"60"59)"repl-backl og-size"60)"1048576"61)"repl-backlog-ttl"62)"3600"63)"max clients"64)"4064"65)"watchdog-period"66)"0"67)"slave-prio rity"68)"100"69)"min-slaves-to-write"70)"0"71)"min-slaves -max-lag"72)"10"73)"hz"74)"10"75)"no-appendfsync-on-rewri te"76)"no"77)"slave-serve-stale-data"78)"yes"79)"slave-re ad-only"80)"yes"81)"stop-writes-on-bgsave-error"82)"yes"83 )"daemonize"84)"no"85)"rdbcompression"86)"yes"87)"rdbche cksum"88)"yes"89)"activerehashing"90)"yes"91)"repl-disabl e-tcp-nodelay"92)"no"93)"aof-rewrite-incremental-fsync"94)" yes"95)"appendonly"96)"no"97)"dir"98)"/home/deepak/Downlo ads/redis-2.8.13/src"99)"maxmemory-policy"100)"volatile-lru"10 1)"appendfsync"102)"everysec"103)"save"104)"3600130010060 10000"105)"loglevel"106)"notice"107)"client-output-buffer-lim it"108)"normal000slave2684354566710886460pubsub33554432 838860860"109)"unixsocketperm"110)"0"111)"slaveof"112)""113 )"notify-keyspace-events"114)""115)"bind"116)""编辑配置你可以通过修改re dis.conf文件或使用?CONFIGset?命令来修改配置。语法CONFIGSET?命令基本语法:redis127.0 .0.1:6379>CONFIGSETCONFIG_SETTING_NAMENEW_CONFIG_VALUE实例redis 127.0.0.1:6379>CONFIGSETloglevel"notice"OKredis127.0.0.1:63 79>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总共支持四个级别:debug、verbose、notice、w arning,默认为verbose?loglevelverbose7.日志记录方式,默认为标准输出,如果配置Redis为守护进 程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null?logfilestdout8.设置数据库 的数量,默认数据库为0,可以使用SELECT命令在连接上指定数据库id?databases169.指定在多长时间 内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合?saveRedis默认配 置文件中提供了三个条件:?save9001??save30010??save6010000分别表示900秒(15分钟 )内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。?10.指定存储至本地数据库时是否压缩数据,默认 为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大?rdbcompressio nyes11.指定本地数据库文件名,默认值为dump.rdb?dbfilenamedump.rdb12.指定本地数据库存放 目录?dir./13.设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从mast er进行数据同步?slaveof14.当master服务设置了密码保护时,sla v服务连接master的密码?masterauth15.设置Redis连接密码,如果配置了连 接密码,客户端在连接Redis时需要通过AUTH命令提供密码,默认关闭?requirepassfoobar ed16.设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符 数,如果设置maxclients0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回maxnu mberofclientsreached错误信息?maxclients12817.指定Redis最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设 置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区?max memory18.指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启 ,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内 只存在于内存中。默认为no?appendonlyno19.指定更新日志文件名,默认为appendonly.aof?append filenameappendonly.aof20.指定更新日志条件,共有3个可选值:??no:表示等操作系统进行数据缓存同步到 磁盘(快)??always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)??everysec:表示每秒同步一 次(折衷,默认值)?appendfsynceverysec?21.指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM 机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细 分析Redis的VM机制)?vm-enabledno22.虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个R edis实例共享?vm-swap-file/tmp/redis.swap23.将所有大于vm-max-memory的数据存入虚 拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据就是keys),也就是说,当vm -max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0?vm-max-memory024.Redi sswap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-si ze是要根据存储的数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象 ,则可以使用更大的page,如果不确定,就使用默认值?vm-page-size3225.设置swap文件中的page数量,由 于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。?vm-page s13421772826.设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是 串行的,可能会造成比较长时间的延迟。默认值为4?vm-max-threads427.设置在向客户端应答时,是否把较小的包合并为 一个包发送,默认为开启?glueoutputbufyes28.指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊 的哈希算法?hash-max-zipmap-entries64??hash-max-zipmap-value51229.指定 是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)?activerehashingyes30.指定包含其 它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件?include/ path/to/local.confRedis数据类型Redis支持五种数据类型:string(字符串),hash(哈希),li st(列表),set(集合)及zset(sortedset:有序集合)。String(字符串)string是redis最基本的类 型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis 的string可以包含任何数据。比如jpg图片或者序列化的对象。string类型是Redis最基本的数据类型,一个键最大能存储5 12MB。实例redis127.0.0.1:6379>SETname"w3cschool.cc"OKredis127.0 .0.1:6379>GETname"w3cschool.cc"在以上实例中我们使用了Redis的?SET?和?GET?命令 。键为name,对应的值为w3cschool.cc。注意:一个键最大能存储512MB。Hash(哈希)Redishash是一 个键值对集合。Redishash是一个string类型的field和value的映射表,hash特别适合用于存储对象。实例red is127.0.0.1:6379>HMSETuser:1usernamew3cschool.ccpasswordw3 cschool.ccpoints200OKredis127.0.0.1:6379>HGETALLuser:11)"us ername"2)"w3cschool.cc"3)"password"4)"w3cschool.cc"5)"points" 6)"200"redis127.0.0.1:6379>以上实例中hash数据类型存储了包含用户脚本信息的用户对象。实例中 我们使用了Redis?HMSET,HGETALL?命令,user:1?为键值。每个hash可以存储232-1?键值对 (40多亿)。List(列表)Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部 (右边)。实例redis127.0.0.1:6379>lpushw3cschool.ccredis(integer)1r edis127.0.0.1:6379>lpushw3cschool.ccmongodb(integer)2redis1 27.0.0.1:6379>lpushw3cschool.ccrabitmq(integer)3redis127.0.0 .1:6379>lrangew3cschool.cc0101)"rabitmq"2)"mongodb"3)"redi s"redis127.0.0.1:6379>列表最多可存储232-1?元素(4294967295,每个列表可存储40多 亿)。Set(集合)Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1 )。sadd命令添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set 不存在返回错误。saddkeymember实例redis127.0.0.1:6379>saddw3cschool.cc redis(integer)1redis127.0.0.1:6379>saddw3cschool.ccmongodb(i nteger)1redis127.0.0.1:6379>saddw3cschool.ccrabitmq(integer) 1redis127.0.0.1:6379>saddw3cschool.ccrabitmq(integer)0redis 127.0.0.1:6379>smembersw3cschool.cc1)"rabitmq"2)"mongodb"3) "redis"注意:以上实例中rabitmq添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。集合中最大的成员数 为232-1?(4294967295,每个集合可存储40多亿个成员)。zset(sortedset:有序集合)Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数 。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。zadd命令 添加元素到集合,元素在集合中存在则更新对应scorezaddkeyscoremember实例redis127.0.0.1 :6379>zaddw3cschool.cc0redis(integer)1redis127.0.0.1:6379> zaddw3cschool.cc0mongodb(integer)1redis127.0.0.1:6379>zadd w3cschool.cc0rabitmq(integer)1redis127.0.0.1:6379>zaddw3csc hool.cc0rabitmq(integer)0redis127.0.0.1:6379>ZRANGEBYSCOREw 3cschool.cc010001)"redis"2)"mongodb"3)"rabitmq"Redis命令Redis 命令用于在redis服务上执行操作。要在redis服务上执行命令需要一个redis客户端。Redis客户端在我们之 前下载的的redis的安装包中。语法Redis客户端的基本语法为:$redis-cli实例以下实例讲解了如何启动redi s客户端:启动redis客户端,打开终端并输入命令?redis-cli。该命令会连接本地的redis服务。$redis- cliredis127.0.0.1:6379>redis127.0.0.1:6379>PINGPONG在以上实例中我们连接到 本地的redis服务并执行?PING?命令,该命令用于检测redis服务是否启动。在远程服务上执行命令如果需要在远程re dis服务上执行命令,同样我们使用的也是?redis-cli?命令。语法$redis-cli-hhost-pport -apassword实例以下实例演示了如何连接到主机为127.0.0.1,端口为6379,密码为mypass的red is服务上。$redis-cli-h127.0.0.1-p6379-a"mypass"redis127.0.0.1 :6379>redis127.0.0.1:6379>PINGPONGRedis键(key)Redis键命令用于管理red is的键。语法Redis键命令的基本语法如下:redis127.0.0.1:6379>COMMANDKEY_NAME实例 redis127.0.0.1:6379>SETw3ckeyredisOKredis127.0.0.1:6379>DEL w3ckey(integer)1在以上实例中?DEL?是一个命令,?w3ckey?是一个键。如果键被删除成功,命令执行后输出 ?(integer)1,否则将输出?(integer)0Rediskeys命令下表给出了与Redis键相关的基本命令: 序号命令及描述1DELkey该命令用于在key存在是删除key。2DUMPkey?序列化给定key,并返回被序列化的 值。3EXISTSkey?检查给定key是否存在。4EXPIREkey?seconds为给定key设置过期时间。5EX PIREATkeytimestamp?EXPIREAT的作用和EXPIRE类似,都用于为key设置过期时间。不同在 于EXPIREAT命令接受的时间参数是UNIX时间戳(unixtimestamp)。6PEXPIREkeymilli seconds?设置key的过期时间亿以毫秒计。7PEXPIREATkeymilliseconds-timestamp?设 置key过期时间的时间戳(unixtimestamp)以毫秒计8KEYSpattern?查找所有符合给定模式(patt ern)的key。9MOVEkeydb?将当前数据库的key移动到给定的数据库db当中。10PERSISTkey ?移除key的过期时间,key将持久保持。11PTTLkey?以毫秒为单位返回key的剩余的过期时间。12TTLke y?以秒为单位,返回给定key的剩余生存时间(TTL,timetolive)。13RANDOMKEY?从当前数据库中随机 返回一个key。14RENAMEkeynewkey?修改key的名称15RENAMENXkeynewkey?仅当 newkey不存在时,将key改名为newkey。16TYPEkey?返回key所储存的值的类型。更多命令请参考: http://redis.readthedocs.org/en/latest/index.htmlRedis字符串(String )Redis字符串数据类型的相关命令用于管理redis字符串值,基本语法如下:语法redis127.0.0.1:6379> COMMANDKEY_NAME实例redis127.0.0.1:6379>SETw3ckeyredisOKredi s127.0.0.1:6379>GETw3ckey"redis"在以上实例中我们使用了?SET?和?GET?命令,键为w 3ckey。Redis字符串命令下表列出了常用的redis字符串命令:序号命令及描述1SETkeyvalue?设置指定 key的值2GETkey?获取指定key的值。3GETRANGEkeystartend?返回key中字符串值的子 字符4GETSETkeyvalue将给定key的值设为value,并返回key的旧值(oldvalue)。5GE TBITkeyoffset对key所储存的字符串值,获取指定偏移量上的位(bit)。6MGETkey1[key2..] 获取所有(一个或多个)给定key的值。7SETBITkeyoffsetvalue对key所储存的字符串值,设置或清除 指定偏移量上的位(bit)。8SETEXkeysecondsvalue将值value关联到key,并将key的过 期时间设为seconds(以秒为单位)。9SETNXkeyvalue只有在key不存在时设置key的值。10SET RANGEkeyoffsetvalue用value参数覆写给定key所储存的字符串值,从偏移量offset开始。 11STRLENkey返回key所储存的字符串值的长度。12MSETkeyvalue[keyvalue...]同时 设置一个或多个key-value对。13MSETNXkeyvalue[keyvalue...]?同时设置一个或多个 key-value对,当且仅当所有给定key都不存在。14PSETEXkeymillisecondsvalue这个命令 和SETEX命令相似,但它以毫秒为单位设置key的生存时间,而不是像SETEX命令那样,以秒为单位。15INCRke y将key中储存的数字值增一。16INCRBYkeyincrement将key所储存的值加上给定的增量值(increm ent)。17INCRBYFLOATkeyincrement将key所储存的值加上给定的浮点增量值(increment) 。18DECRkey将key中储存的数字值减一。19DECRBYkeydecrementkey所储存的值减去给定的减 量值(decrement)。20APPENDkeyvalue如果key已经存在并且是一个字符串,APPEND命令将 value追加到key原来的值的末尾。更多命令请参考:http://redis.readthedocs.org/en/lat est/index.htmlRedis哈希(Hash)Redishash是一个string类型的field和value的映射 表,hash特别适合用于存储对象。Redis中每个hash可以存储232-1键值对(40多亿)。实例redis12 7.0.0.1:6379>HMSETw3ckeyname"redistutorial"description"red isbasiccommandsforcaching"likes20visitors23000OKredis127 .0.0.1:6379>HGETALLw3ckey1)"name"2)"redistutorial"3)"descri ption"4)"redisbasiccommandsforcaching"5)"likes"6)"20"7)"v isitors"8)"23000"在以上实例中,我们设置了redis的一些描述信息(name,description,l ikes,visitors)到哈希表的w3ckey中。Redishash命令下表列出了redishash基本的相 关命令:序号命令及描述1HDELkeyfield2[field2]?删除一个或多个哈希表字段2HEXISTSkeyfie ld?查看哈希表key中,指定的字段是否存在。3HGETkeyfield?获取存储在哈希表中指定字段的值/td>4HGET ALLkey?获取在哈希表中指定key的所有字段和值5HINCRBYkeyfieldincrement?为哈希表ke y中的指定字段的整数值加上增量increment。6HINCRBYFLOATkeyfieldincrement?为哈希 表key中的指定字段的浮点数值加上增量increment。7HKEYSkey?获取所有哈希表中的字段8HLENkey? 获取哈希表中字段的数量9HMGETkeyfield1[field2]?获取所有给定字段的值10HMSETkeyfield 1value1[field2value2]?同时将多个field-value(域-值)对设置到哈希表key中。11 HSETkeyfieldvalue?将哈希表key中的字段field的值设为value。12HSETNXkey fieldvalue?只有在字段field不存在时,设置哈希表字段的值。13HVALSkey?获取哈希表中所有值14HS CANkeycursor[MATCHpattern][COUNTcount]?迭代哈希表中的键值对。更多命令请参考:h ttp://redis.readthedocs.org/en/latest/index.htmlRedis列表(List)Red is列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)一个列表最多可以包含232 -1个元素(4294967295,每个列表超过40亿个元素)。实例redis127.0.0.1:6379>LPUSH w3ckeyredis(integer)1redis127.0.0.1:6379>LPUSHw3ckeymongodb (integer)2redis127.0.0.1:6379>LPUSHw3ckeymysql(integer)3red is127.0.0.1:6379>LRANGEw3ckey0101)"mysql"2)"mongodb"3)"re dis"在以上实例中我们使用了?LPUSH?将三个值插入了名为w3ckey的列表当中。Redis列表命令下表列出了列表相关的 基本命令:序号命令及描述1BLPOPkey1[key2]timeout?移出并获取列表的第一个元素,如果列表没有元素会阻 塞列表直到等待超时或发现可弹出元素为止。2BRPOPkey1[key2]timeout?移出并获取列表的最后一个元素,如 果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。3BRPOPLPUSHsourcedestinationtimeo ut?从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 4LINDEXkeyindex?通过索引获取列表中的元素5LINSERTkeyBEFORE|AFTERpivotval ue?在列表的元素前或者后插入元素6LLENkey?获取列表长度7LPOPkey?移出并获取列表的第一个元素8LPUSHke yvalue1[value2]?将一个或多个值插入到列表头部9LPUSHXkeyvalue?将一个或多个值插入到已存在的列 表头部10LRANGEkeystartstop?获取列表指定范围内的元素11LREMkeycountvalue?移除列 表元素12LSETkeyindexvalue?通过索引设置列表元素的值13LTRIMkeystartstop?对一个列 表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。14RPOPkey?移除并获取列 表最后一个元素15RPOPLPUSHsourcedestination?移除列表的最后一个元素,并将该元素添加到另一个列表并返 回16RPUSHkeyvalue1[value2]?在列表中添加一个或多个值17RPUSHXkeyvalue?为已存在的 列表添加值Redis集合(Set)Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复 的数据。Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为232-1?( 4294967295,每个集合可存储40多亿个成员)。实例redis127.0.0.1:6379>SADDw3ckeyr edis(integer)1redis127.0.0.1:6379>SADDw3ckeymongodb(integer) 1redis127.0.0.1:6379>SADDw3ckeymysql(integer)1redis127.0.0 .1:6379>SADDw3ckeymysql(integer)0redis127.0.0.1:6379>SMEMBE RSw3ckey1)"mysql"2)"mongodb"3)"redis"在以上实例中我们通过?SADD?命令向名为w3 ckey的集合插入的三个元素。Redis集合命令下表列出了Redis集合基本命令:序号命令及描述1SADDkeymem ber1[member2]?向集合添加一个或多个成员2SCARDkey?获取集合的成员数3SDIFFkey1[key2]? 返回给定所有集合的差集4SDIFFSTOREdestinationkey1[key2]?返回给定所有集合的差集并存储在de stination中5SINTERkey1[key2]?返回给定所有集合的交集6SINTERSTOREdestinatio nkey1[key2]?返回给定所有集合的交集并存储在destination中7SISMEMBERkeymember? 判断member元素是否是集合key的成员8SMEMBERSkey?返回集合中的所有成员9SMOVEsourcede stinationmember?将member元素从source集合移动到destination集合10SPOPk ey?移除并返回集合中的一个随机元素11SRANDMEMBERkey[count]?返回集合中一个或多个随机数12SREMk eymember1[member2]?移除集合中一个或多个成员13SUNIONkey1[key2]?返回所有给定集合的并集 14SUNIONSTOREdestinationkey1[key2]?所有给定集合的并集存储在destination集合 中15SSCANkeycursor[MATCHpattern][COUNTcount]?迭代集合中的元素Redis有 序集合(sortedset)Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都 会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(sco re)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为232-1?(42 94967295,每个集合可存储40多亿个成员)。实例redis127.0.0.1:6379>ZADDw3ckey1r edis(integer)1redis127.0.0.1:6379>ZADDw3ckey2mongodb(intege r)1redis127.0.0.1:6379>ZADDw3ckey3mysql(integer)1redis127 .0.0.1:6379>ZADDw3ckey3mysql(integer)0redis127.0.0.1:6379> ZADDw3ckey4mysql(integer)0redis127.0.0.1:6379>ZRANGEw3ckey 010WITHSCORES1)"redis"2)"1"3)"mongodb"4)"2"5)"mysql"6)"4 "在以上实例中我们通过命令?ZADD?向redis的有序集合中添加了三个值并关联上分数。Redis有序集合命令下表列出了r edis有序集合的基本命令:序号命令及描述1ZADDkeyscore1member1[score2member2]?向 有序集合添加一个或多个成员,或者更新已存在成员的分数2ZCARDkey?获取有序集合的成员数3ZCOUNTkeyminma x?计算在有序集合中指定区间分数的成员数4ZINCRBYkeyincrementmember?有序集合中对指定成员的分数加上 增量increment5ZINTERSTOREdestinationnumkeyskey[key...]?计算给定的一 个或多个有序集的交集并将结果集存储在新的有序集合key中6ZLEXCOUNTkeyminmax?在有序集合中计算指定字典 区间内成员数量7ZRANGEkeystartstop[WITHSCORES]?通过索引区间返回有序集合成指定区间内的成员8 ZRANGEBYLEXkeyminmax[LIMIToffsetcount]?通过字典区间返回有序集合的成员9ZRAN GEBYSCOREkeyminmax[WITHSCORES][LIMIT]?通过分数返回有序集合指定区间内的成员10ZR ANKkeymember?返回有序集合中指定成员的索引11ZREMkeymember[member...]?移除有序集 合中的一个或多个成员12ZREMRANGEBYLEXkeyminmax?移除有序集合中给定的字典区间的所有成员13ZREMR ANGEBYRANKkeystartstop?移除有序集合中给定的排名区间的所有成员14ZREMRANGEBYSCOREk eyminmax?移除有序集合中给定的分数区间的所有成员15ZREVRANGEkeystartstop[WITHSCO RES]?返回有序集中指定区间内的成员,通过索引,分数从高到底16ZREVRANGEBYSCOREkeymaxmin[WI THSCORES]?返回有序集中指定分数区间内的成员,分数从高到低排序17ZREVRANKkeymember?返回有序集合中指 定成员的排名,有序集成员按分数值递减(从大到小)排序18ZSCOREkeymember?返回有序集中,成员的分数值19ZUNI ONSTOREdestinationnumkeyskey[key...]?计算给定的一个或多个有序集的并集,并存储在新的 key中20ZSCANkeycursor[MATCHpattern][COUNTcount]?迭代有序集合中的元素 (包括元素成员和元素分值)RedisHyperLogLogRedis在2.8.9版本添加了HyperLogLog结构。 RedisHyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时 ,计算基数所需的空间总是固定的、并且是很小的。在Redis里面,每个HyperLogLog键只需要花费12KB内存 ,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为HyperL ogLog只会根据输入元素来计算基数,而不会储存输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。 什么是基数?比如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8}, 基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。实例以下实例演示了HyperLogLog的工作过程: redis127.0.0.1:6379>PFADDw3ckey"redis"1)(integer)1redis127 .0.0.1:6379>PFADDw3ckey"mongodb"1)(integer)1redis127.0.0.1: 6379>PFADDw3ckey"mysql"1)(integer)1redis127.0.0.1:6379>PFC OUNTw3ckey(integer)3RedisHyperLogLog命令下表列出了redisHyperLogLog 的基本命令:序号命令及描述1PFADDkeyelement[element...]?添加指定元素到HyperLogLo g中。2PFCOUNTkey[key...]?返回给定HyperLogLog的基数估算值。3PFMERGEdestk eysourcekey[sourcekey...]?将多个HyperLogLog合并为一个HyperLogLogRed is发布订阅Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Red is客户端可以订阅任意数量的频道。下图展示了频道channel1,以及订阅这个频道的三个客户端——client2、 client5和client1之间的关系:当有新消息通过PUBLISH命令发送给频道channel1时,这个消息就 会被发送给订阅它的三个客户端:实例以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为?redisChat:re dis127.0.0.1:6379>SUBSCRIBEredisChatReadingmessages...(press Ctrl-Ctoquit)1)"subscribe"2)"redisChat"3)(integer)1现在,我们先重 新开启个redis客户端,然后在同一个频道redisChat发布两次消息,订阅者就能接收到消息。redis127.0.0 .1:6379>PUBLISHredisChat"Redisisagreatcachingtechnique"(i nteger)1redis127.0.0.1:6379>PUBLISHredisChat"Learnredisby w3cschool.cc"(integer)1#订阅者的客户端会显示如下消息1)"message"2)"redisChat "3)"Redisisagreatcachingtechnique"1)"message"2)"redisChat "3)"Learnredisbyw3cschool.cc"Redis发布订阅命令下表列出了redis发布订阅常用命令 :序号命令及描述1PSUBSCRIBEpattern[pattern...]?订阅一个或多个符合给定模式的频道。2PUBSU Bsubcommand[argument[argument...]]?查看订阅与发布系统状态。3PUBLISHchann elmessage?将信息发送到指定的频道。4PUNSUBSCRIBE[pattern[pattern...]]?退订所有 给定模式的频道。5SUBSCRIBEchannel[channel...]?订阅给定的一个或多个频道的信息。6UNSUBSC RIBE[channel[channel...]]?指退订给定的频道。Redis事务Redis事务可以一次执行多个命令, 并且带有以下两个重要的保证:事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客 户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。一个事务从开始到执行会经历以下三个阶 段:开始事务。命令入队。执行事务。实例以下是一个事务的例子,它先以?MULTI?开始一个事务,然后将多个命令入队到事务中,最 后由?EXEC?命令触发事务,一并执行事务中的所有命令:redis127.0.0.1:6379>MULTIOKredis1 27.0.0.1:6379>SETbook-name"MasteringC++in21days"QUEUEDredi s127.0.0.1:6379>GETbook-nameQUEUEDredis127.0.0.1:6379>SADDt ag"C++""Programming""MasteringSeries"QUEUEDredis127.0.0.1:63 79>SMEMBERStagQUEUEDredis127.0.0.1:6379>EXEC1)OK2)"Masterin gC++in21days"3)(integer)34)1)"MasteringSeries"2)"C++" 3)"Programming"Redis事务命令下表列出了redis事务的相关命令:序号命令及描述1DISCARD?取消事 务,放弃执行事务块内的所有命令。2EXEC?执行所有事务块内的命令。3MULTI?标记一个事务块的开始。4UNWATCH?取消W ATCH命令对所有key的监视。5WATCHkey[key...]?监视一个(或多个)key,如果在事务执行之前这 个(或这些)key被其他命令所改动,那么事务将被打断。Redis脚本Redis脚本使用Lua解释器来执行脚本。Rei ds2.6版本通过内嵌支持Lua环境。执行脚本的常用命令为?EVAL。语法Eval命令的基本语法如下:redis127 .0.0.1:6379>EVALscriptnumkeyskey[key...]arg[arg...]实例以下实 例演示了redis脚本工作过程:redis127.0.0.1:6379>EVAL"return{KEYS[1],KEY S[2],ARGV[1],ARGV[2]}"2key1key2firstsecond1)"key1"2)"key2" 3)"first"4)"second"Redis脚本命令下表列出了redis脚本常用命令:序号命令及描述1EVALsc riptnumkeyskey[key...]arg[arg...]?执行Lua脚本。2EVALSHAsha1 numkeyskey[key...]arg[arg...]?执行Lua脚本。3SCRIPTEXISTSscri pt[script...]?查看指定的脚本是否已经被保存在缓存当中。4SCRIPTFLUSH?从脚本缓存中移除所有脚本。5S CRIPTKILL?杀死当前正在运行的Lua脚本。6SCRIPTLOADscript?将脚本script添加到脚本缓 存中,但并不立即执行这个脚本。Redis连接Redis连接命令主要是用于连接redis服务。实例以下实例演示了客户端如何通 过密码验证连接到redis服务,并检测服务是否在运行:redis127.0.0.1:6379>AUTH"password "OKredis127.0.0.1:6379>PINGPONGRedis连接命令下表列出了redis连接的基本命令:序号 命令及描述1AUTHpassword?验证密码是否正确2ECHOmessage?打印字符串3PING?查看服务是否运行4QUI T?关闭当前连接5SELECTindex?切换到指定的数据库Redis服务器Redis服务器命令主要是用于管理redis 服务。实例以下实例演示了如何获取redis服务器的统计信息:redis127.0.0.1:6379>INFO#Serve rredis_version:2.8.13redis_git_sha1:00000000redis_git_dirty:0redi s_build_id:c2238b38b1edb0e2redis_mode:standaloneos:Linux3.5.0-48 -genericx86_64arch_bits:64multiplexing_api:epollgcc_version:4.7. 2process_id:3856run_id:0e61abd297771de3fe812a3c21027732ac9f41fetc p_port:6379uptime_in_seconds:11554uptime_in_days:0hz:10lru_clock: 16651447config_file:#Clientsconnected_clients:1client-longest_ou tput_list:0client-biggest_input_buf:0blocked_clients:0#Memoryuse d_memory:589016used_memory_human:575.21Kused_memory_rss:2461696us ed_memory_peak:667312used_memory_peak_human:651.67Kused_memory_lu a:33792mem_fragmentation_ratio:4.18mem_allocator:jemalloc-3.6.0# Persistenceloading:0rdb_changes_since_last_save:3rdb_bgsave_in_pr ogress:0rdb_last_save_time:1409158561rdb_last_bgsave_status:okrdb _last_bgsave_time_sec:0rdb_current_bgsave_time_sec:-1aof_enabled: 0aof_rewrite_in_progress:0aof_rewrite_scheduled:0aof_last_rewrite _time_sec:-1aof_current_rewrite_time_sec:-1aof_last_bgrewrite_sta tus:okaof_last_write_status:ok#Statstotal_connections_received:2 4total_commands_processed:294instantaneous_ops_per_sec:0rejected_ connections:0sync_full:0sync_partial_ok:0sync_partial_err:0expire d_keys:0evicted_keys:0keyspace_hits:41keyspace_misses:82pubsub_ch annels:0pubsub_patterns:0latest_fork_usec:264#Replicationrole:ma sterconnected_slaves:0master_repl_offset:0repl_backlog_active:0re pl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backl og_histlen:0#CPUused_cpu_sys:10.49used_cpu_user:4.96used_cpu_sys _children:0.00used_cpu_user_children:0.01#Keyspacedb0:keys=94,ex pires=1,avg_ttl=41638810db1:keys=1,expires=0,avg_ttl=0db3:keys=1, expires=0,avg_ttl=0Redis服务器命令下表列出了redis服务器的相关命令:序号命令及描述1BGREWR ITEAOF?异步执行一个AOF(AppendOnlyFile)文件重写操作2BGSAVE?在后台异步保存当前数据库的数据到 磁盘3CLIENTKILL[ip:port][IDclient-id]?关闭客户端连接4CLIENTLIST?获取连接到 服务器的客户端连接列表5CLIENTGETNAME?获取连接的名称6CLIENTPAUSEtimeout?在指定时间内终止运 行来自客户端的命令7CLIENTSETNAMEconnection-name?设置当前连接的名称8CLUSTERSLOTS? 获取集群节点的映射数组9COMMAND?获取Redis命令详情数组10COMMANDCOUNT?获取Redis命令总数1 1COMMANDGETKEYS?获取给定命令的所有键12TIME?返回当前服务器时间13COMMANDINFOcommand -name[command-name...]?获取指定Redis命令描述的数组14CONFIGGETparameter ?获取指定配置参数的值15CONFIGREWRITE?对启动Redis服务器时所指定的redis.conf配置文件进行改 写16CONFIGSETparametervalue?修改redis配置参数,无需重启17CONFIGRESETSTA T?重置INFO命令中的某些统计数据18DBSIZE?返回当前数据库的key的数量19DEBUGOBJECTkey?获 取key的调试信息20DEBUGSEGFAULT?让Redis服务崩溃21FLUSHALL?删除所有数据库的所有key2 2FLUSHDB?删除当前数据库的所有key23INFO[section]?获取Redis服务器的各种信息和统计数值24LA STSAVE?返回最近一次Redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示25MONITOR?实时打印出 Redis服务器接收到的命令,调试用26ROLE?返回主从实例所属的角色27SAVE?异步保存数据到硬盘28SHUTDOWN[ NOSAVE][SAVE]?异步保存数据到硬盘,并关闭服务器29SLAVEOFhostport?将当前服务器转变为指定服务器 的从属服务器(slaveserver)30SLOWLOGsubcommand[argument]?管理redis的慢日志 31SYNC?用于复制功能(replication)的内部命令Redis数据备份与恢复Redis?SAVE?命令用于创建当前数据 库的备份。语法redisSave命令基本语法如下:redis127.0.0.1:6379>SAVE实例redis127 .0.0.1:6379>SAVEOK该命令将在redis安装目录中创建dump.rdb文件。恢复数据如果需要恢复数据,只需 将备份文件(dump.rdb)移动到redis安装目录并启动服务即可。获取redis目录可以使用?CONFIG?命令, 如下所示:redis127.0.0.1:6379>CONFIGGETdir1)"dir"2)"/usr/local/ redis/bin"以上命令?CONFIGGETdir?输出的redis安装目录为/usr/local/redis/bi n。Bgsave创建redis备份文件也可以使用命令?BGSAVE,该命令在后台执行。实例127.0.0.1:6379>BG SAVEBackgroundsavingstartedRedis安全我们可以通过redis的配置文件设置密码参数,这样客 户端连接到redis服务就需要密码验证,这样可以让你的redis服务更安全。实例我们可以通过以下命令查看是否设置了密码验证 :127.0.0.1:6379>CONFIGgetrequirepass1)"requirepass"2)""默认情况下 requirepass参数是空的,这就意味着你无需通过密码验证就可以连接到redis服务。你可以通过以下命令来修改该参数: 127.0.0.1:6379>CONFIGsetrequirepass"w3cschool.cc"OK127.0.0.1: 6379>CONFIGgetrequirepass1)"requirepass"2)"w3cschool.cc"设置密码 后,客户端连接redis服务就需要密码验证,否则无法执行命令。语法AUTH?命令基本语法格式如下:127.0.0.1:6379 >AUTHpassword实例127.0.0.1:6379>AUTH"w3cschool.cc"OK127.0.0.1:6 379>SETmykey"Testvalue"OK127.0.0.1:6379>GETmykey"Testvalue "Redis性能测试Redis性能测试是通过同时执行多个命令实现的。语法redis性能测试的基本命令如下:redis-ben chmark[option][optionvalue]实例以下实例同时执行10000个请求来检测性能:redis-ben chmark-n10000PING_INLINE:141043.72requestspersecondPING_BUL K:142857.14requestspersecondSET:141442.72requestspersecon dGET:145348.83requestspersecondINCR:137362.64requestspers econdLPUSH:145348.83requestspersecondLPOP:146198.83requests persecondSADD:146198.83requestspersecondSPOP:149253.73req uestspersecondLPUSH(neededtobenchmarkLRANGE):148588.42req uestspersecondLRANGE_100(first100elements):58411.21request spersecondLRANGE_300(first300elements):21195.42requestspe rsecondLRANGE_500(first450elements):14539.11requestsperse condLRANGE_600(first600elements):10504.20requestspersecond MSET(10keys):93283.58requestspersecondredis性能测试工具可选参数如下所示: 序号选项描述默认值1-h指定服务器主机名127.0.0.12-p指定服务器端口63793-s指定服务器socket4-c指定并发 连接数505-n指定请求数100006-d以字节的形式指定SET/GET值的数据大小27-k1=keepalive0=re connect18-rSET/GET/INCR使用随机key,SADD使用随机值9-P通过管道传输请求 110-q强制退出redis。仅显示query/sec值11--csv以CSV格式输出12-l生成循环,永久执行测试13 -t仅运行以逗号分隔的测试命令列表。14-IIdle模式。仅打开N个idle连接并等待。实例以下实例我们使用了多个参数来 测试redis性能:redis-benchmark-h127.0.0.1-p6379-tset,lpush-n 10000-qSET:146198.83requestspersecondLPUSH:145560.41reques tspersecond以上实例中主机为127.0.0.1,端口号为6379,执行的命令为set,lpush,请求数为1 0000,通过-q参数让结果只显示每秒执行的请求数。Redis客户端连接Redis通过监听一个TCP端口或者Unix socket的方式来接收来自客户端的连接,当一个连接建立后,Redis内部会进行以下一些操作:首先,客户端socket会 被设置为非阻塞模式,因为Redis在网络事件处理上采用的是非阻塞多路复用模型。然后为这个socket设置TCP_NODE LAY属性,禁用Nagle算法然后创建一个可读的文件事件用于监听这个客户端socket的数据发送最大连接数在Redis 2.4中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中这个值变成可配置的。maxclients的默认值是10000 ,你也可以在redis.conf中对这个值进行修改。configgetmaxclients1)"maxclients"2 )"10000"实例以下实例我们在服务启动时设置最大连接数为100000:redis-server--maxclients 100000客户端命令S.N.命令描述1CLIENTLIST返回连接到redis服务的客户端列表2CLIENTSETNAM E设置当前连接的名称3CLIENTGETNAME获取通过CLIENTSETNAME命令设置的服务名称4CLIENTPAU SE挂起客户端连接,指定挂起的时间以毫秒计5CLIENTKILL关闭客户端连接Redis管道技术Redis是一种基于客户端-服 务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:客户端向服务端发送一个查询请求,并监听Socke t返回,通常是以阻塞模式,等待服务端响应。服务端处理命令,并将结果返回给客户端。Redis管道技术Redis管道技术可以在服务 端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。实例查看redis管道,只需要启动redis 实例并输入以下命令:$(echo-en"PING\r\nSETw3ckeyredis\r\nGETw3ckey\r\n INCRvisitor\r\nINCRvisitor\r\nINCRvisitor\r\n";sleep10)|nc localhost6379+PONG+OKRedis:1:2:3以上实例中我们通过使用?PING?命令查看redis服务是否可 用,之后我们们设置了w3ckey的值为redis,然后我们获取w3ckey的值并使得visitor自增3次。在 返回的结果中我们可以看到这些命令一次性向redis服务提交,并最终一次性读取所有服务端的响应管道技术的优势管道技术最显著的优势 是提高了redis服务的性能。一些测试数据在下面的测试中,我们将使用Redis的Ruby客户端,支持管道技术特性,测试管道技术 对速度的提升效果。require''rubygems''require''redis''defbench(descr)start =Time.nowyieldputs"#{descr}#{Time.now-start}seconds"Endde fwithout_pipeliningr=Redis.new10000.times{r.ping}Enddef with_pipeliningr=Redis.newr.pipelined{10000.times{}}end bench("withoutpipelining"){without_pipelining}bench("withpi pelining"){with_pipelining}从处于局域网中的MacOSX系统上执行上面这个简单脚本的数据表明, 开启了管道操作后,往返时延已经被改善得相当低了。withoutpipelining1.185238secondswith pipelining0.250783seconds如你所见,开启管道后,我们的速度效率提升了5倍。Redis分区分区是分割数 据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。分区的优势通过利用多台计算机内存的和值,允许我们构造更大的数 据库。通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。分区的不足redis的一些特性 在分区方面表现的不是很好:涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这 两个set执行交集操作。涉及多个key的redis事务不能使用。当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文 件,并且从多个实例和主机备份持久化文件。增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能 力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。分区类型Red is有两种类型分区。假设有4个Redis实例R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个ke y,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。范围 分区最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例。比如,ID从0到10000的用户会保存到实例R0, ID从10001到20000的用户会保存到R1,以此类推。这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映 射表。这个表要被管理,同时还需要各种对象的映射表,通常对Redis来说并非是好的方法。哈希分区另外一种分区方法是hash分区。这 对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:用一个hash函数将key转换为一个数字,比如 使用crc32hash函数。对keyfoobar执行crc32(foobar)会输出类似93024922的整数。对这个整数取模 ,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922%4=2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。Java使用Redis安装开 始在Java中使用Redis前,我们需要确保已经安装了redis服务及Javaredis驱动,且你的机器上能正 常使用Java。Java的安装配置可以参考我们的?Java开发环境配置?接下来让我们安装Javaredis驱动:首先你需 要下载驱动包,下载jedis.jar,确保下载最新驱动包。在你的classpath中包含该驱动包。连接到redis服务imp ortredis.clients.jedis.Jedis;publicclassRedisJava{publicsta ticvoidmain(String[]args){//连接本地的Redis服务Jedisjedis=new Jedis("localhost");System.out.println("Connectiontoserversuc essfully");//查看服务是否运行System.out.println("Serverisrunning:"+j edis.ping());}}编译以上Java程序,确保驱动包的路径是正确的。$javacRedisJava.java$j avaRedisJavaConnectiontoserversucessfullyServerisrunning:P ONGRedisJavaStringExampleRedisJavaString(字符串)实例importredis .clients.jedis.Jedis;publicclassRedisStringJava{publicstatic voidmain(String[]args){//连接本地的Redis服务Jedisjedis=newJe dis("localhost");System.out.println("Connectiontoserversucess fully");//设置redis字符串数据jedis.set("w3ckey","Redistutorial"); //获取存储的数据并输出System.out.println("Storedstringinredis::"+jed is.get("w3ckey"));}}编译以上程序。$javacRedisStringJava.java$javaRedi sStringJavaConnectiontoserversucessfullyStoredstringinredis ::RedistutorialRedisJavaList(列表)实例importredis.clients.jedis .Jedis;publicclassRedisListJava{publicstaticvoidmain(Strin g[]args){//连接本地的Redis服务Jedisjedis=newJedis("localhost") ;System.out.println("Connectiontoserversucessfully");//存储数据到 列表中jedis.lpush("tutorial-list","Redis");jedis.lpush("tutorial- list","Mongodb");jedis.lpush("tutorial-list","Mysql");//获取存储 的数据并输出Listlist=jedis.lrange("tutorial-list",0,5);f or(inti=0;inginredis::"+list.get(i));}}}编译以上程序。$javacRedisListJava.jav a$javaRedisListJavaConnectiontoserversucessfullyStoredstring inredis::RedisStoredstringinredis::MongodbStoredstringin redis::MysqlRedisJavaKeys实例importredis.clients.jedis.Jedis; publicclassRedisKeyJava{publicstaticvoidmain(String[]args){//连接本地的Redis服务Jedisjedis=newJedis("localhost");System.out.println("Connectiontoserversucessfully");//获取数据并输出Listlist=jedis.keys("");for(inti=0;iconnect(''127.0.0.1'',6379);echo"Connectiontoserversucessfully";//查看服务是否运行echo"Serverisrunning:".$redis->ping();?>执行脚本,输出结果为:ConnectiontoserversucessfullyServerisrunning:PONGRedisPHPString(字符串)实例connect(''127.0.0.1'',6379);echo"Connectiontoserversucessfully";//设置redis字符串数据$redis->set("tutorial-name","Redistutorial");//获取存储的数据并输出echo"Storedstringinredis::".$redis->get("tutorial-name");?>执行脚本,输出结果为:ConnectiontoserversucessfullyStoredstringinredis::RedistutorialRedisPHPList(列表)实例connect(''127.0.0.1'',6379);echo"Connectiontoserversucessfully";//存储数据到列表中$redis->lpush("tutorial-list","Redis");$redis->lpush("tutorial-list","Mongodb");$redis->lpush("tutorial-list","Mysql");//获取存储的数据并输出$arList=$redis->lrange("tutorial-list",0,5);echo"Storedstringinredis::"print_r($arList);?>执行脚本,输出结果为:ConnectiontoserversucessfullyStoredstringinredis::RedisMongodbMysqlRedisPHPKeys实例connect(''127.0.0.1'',6379);echo"Connectiontoserversucessfully";//获取数据并输出$arList=$redis->keys("");echo"Storedkeysinredis::"print_r($arList);?>执行脚本,输出结果为:ConnectiontoserversucessfullyStoredstringinredis::tutorial-nametutorial-list |
|