﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-分享ｊａｖａ带来的快乐-文章分类-Redis</title><link>http://www.blogjava.net/lyjjq/category/52011.html</link><description>我喜欢ｊａｖａ新东西</description><language>zh-cn</language><lastBuildDate>Wed, 25 Jul 2012 22:45:04 GMT</lastBuildDate><pubDate>Wed, 25 Jul 2012 22:45:04 GMT</pubDate><ttl>60</ttl><item><title>Redis Windows</title><link>http://www.blogjava.net/lyjjq/articles/382093.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 03 Jul 2012 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/382093.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/382093.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/382093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/382093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/382093.html</trackback:ping><description><![CDATA[<div id="blog_content" class="blog_content">简介：<br />Redis本质上是一个Key-Value类型的内存数据库，很像memcached，整个数据库统统加载在内存当中进行操作，定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作，Redis的性能非常出色，Redis最大的魅力是支持保存List链表和Set集合的数据结构，而且还支持对List进行各种操作，例如从List两端push和pop数据，取 List区间，排序等等，对Set支持各种集合的并集交集操作，此外单个value的最大限制是1GB，不像memcached只能保存1MB的数据，Redis可以用来实现很多有用的功能，比方说用他的List来做FIFO双向链表，实现一个轻量级的高性能消息队列服务，用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间，因此也可以被当作一个功能加强版的memcached来用。<br /><br />Windows版的Redis可到此处下载，非官方版<br /><a href="http://code.google.com/p/servicestack/wiki/RedisWindowsDownload" target="_blank">http://code.google.com/p/servicestack/wiki/RedisWindowsDownload</a><br /><br />Redis文件夹有以下几个文件<br />redis-server.exe：服务程序<br />指定redis的配置文件，如没有指定，则使用默认设置<br />D:\redis-2.0.0-rc2&gt;redis-server.exe redis.conf<br /><br />redis.conf配置选项如下<br />daemonize 是否以后台进程运行，默认为no<br />pidfile 如以后台进程运行，则需指定一个pid，默认为/var/run/redis.pid<br />bind 绑定主机IP，默认值为127.0.0.1（注释）<br />port 监听端口，默认为6379<br />timeout 超时时间，默认为300（秒）<br />loglevel 日志记录等级，有4个可选值，debug，verbose（默认值），notice，warning<br />logfile 日志记录方式，默认值为stdout<br />databases 可用数据库数，默认值为16，默认数据库为0<br />save &lt;seconds&gt; &lt;changes&gt; 指出在多长时间内，有多少次更新操作，就将数据同步到数据文件。这个可以多个条件配合，比如默认配置文件中的设置，就设置了三个条件。<br />save 900 1&nbsp; 900秒（15分钟）内至少有1个key被改变<br />save 300 10&nbsp; 300秒（5分钟）内至少有300个key被改变<br />save 60 10000&nbsp; 60秒内至少有10000个key被改变<br />rdbcompression 存储至本地数据库时是否压缩数据，默认为yes<br />dbfilename 本地数据库文件名，默认值为dump.rdb<br />dir 本地数据库存放路径，默认值为 ./<br />slaveof &lt;masterip&gt; &lt;masterport&gt; 当本机为从服务时，设置主服务的IP及端口（注释）<br />masterauth &lt;master-password&gt; 当本机为从服务时，设置主服务的连接密码（注释）<br />requirepass 连接密码（注释）<br />maxclients 最大客户端连接数，默认不限制（注释）<br />maxmemory &lt;bytes&gt; 设置最大内存，达到最大内存设置后，Redis会先尝试清除已到期或即将到期的Key，当此方法处理后，任到达最大内存设置，将无法再进行写入操作。（注释）<br />appendonly 是否在每次更新操作后进行日志记录，如果不开启，可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的，所以有的数据会在一段时间内只存在于内存中。默认值为no<br />appendfilename 更新日志文件名，默认值为appendonly.aof（注释）<br />appendfsync 更新日志条件，共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘，always表示每次更新操作后手动调用fsync()将数据写到磁盘，everysec表示每秒同步一次（默认值）。<br />vm-enabled 是否使用虚拟内存，默认值为no<br />vm-swap-file 虚拟内存文件路径，默认值为/tmp/redis.swap，不可多个Redis实例共享<br />vm-max-memory 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。<br /><br />Redis官方文档对VM的使用提出了一些建议:<br />当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.<br />当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.<br />最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件.<br />vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.redis-cli.exe：命令行客户端，测试用<br />D:\redis-2.0.0-rc2&gt;redis-cli.exe -h 127.0.0.1 -p 6379<br /><br />设置一个Key并获取返回的值:<br />$ ./redis-cli set mykey somevalue<br />OK<br />$ ./redis-cli get mykey<br />Somevalue<br /><br />如何添加值到list:<br />$ ./redis-cli lpush mylist firstvalue<br />OK<br />$ ./redis-cli lpush mylist secondvalue<br />OK<br />$ ./redis-cli lpush mylist thirdvalue<br />OK<br />$ ./redis-cli lrange mylist 0 -1<br />1. thirdvalue<br />2. secondvalue<br />3. firstvalue<br />$ ./redis-cli rpop mylist<br />firstvalue<br />$ ./redis-cli lrange mylist 0 -1<br />1. thirdvalue<br />2. secondvalue<br /><br />redis-check-dump.exe：本地数据库检查<br /><br />redis-check-aof.exe：更新日志检查<br /><br />redis-benchmark.exe：性能测试，用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的 ab 工具).<br />./redis-benchmark -n 100000 &#8211;c 50<br />====== SET ======<br />100007 requests completed in 0.88 seconds （译者注：100004 查询完成于 1.14 秒 ）<br />50 parallel clients （译者注：50个并发客户端）<br />3 bytes payload （译者注：3字节有效载荷)<br />keep alive: 1 （译者注：保持1个连接)<br />58.50% &lt;= 0 milliseconds（译者注：毫秒）<br />99.17% &lt;= 1 milliseconds<br />99.58% &lt;= 2 milliseconds<br />99.85% &lt;= 3 milliseconds<br />99.90% &lt;= 6 milliseconds<br />100.00% &lt;= 9 milliseconds<br />114293.71 requests per second（译者注：每秒 114293.71 次查询）<br /><br />Windows下测试并发客户端极限为60<br /><br />相关文章<br /><a href="http://www.rediscn.com/index.html" target="_blank">http://www.rediscn.com/index.html</a><br /><a href="http://code.google.com/p/redis/" target="_blank">http://code.google.com/p/redis/</a>（官网）<br /><a href="http://code.google.com/p/redis/wiki/CommandReference" target="_blank">http://code.google.com/p/redis/wiki/CommandReference</a><br />文章来源：http://www.madcn.net/?p=686</div><img src ="http://www.blogjava.net/lyjjq/aggbug/382093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-07-03 15:18 <a href="http://www.blogjava.net/lyjjq/articles/382093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis命令——Sorted Set相关 </title><link>http://www.blogjava.net/lyjjq/articles/381087.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 19 Jun 2012 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/381087.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/381087.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/381087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/381087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/381087.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content"><p>本文主要介绍Redis中与有序集合（Sorted <br />Set）相关的命令，内容主要来源于Redis的官方网站，如果需要请参考：http://redis.io/commands#sorted_set。</p><br /><p> </p><br /><p>1.ZADD<br />语法：ZADD key scroe <br />member<br />说明：该操作的时间复杂度为O(log(N))，此处N为有序集合中的元素个数。向key对应的有序集合中添加具有指定scroe的元素。如果元素在有序集合中已经存在，那么该元素具有的score将会被更新，并且元素将会被重新插到正确的位值以便确保正确的顺序。如果指定的key不存在，那么将会创建一个具有member这一唯一元素的一个新的有序集合。如果key存在，但是其对应的值不是有序集合，那么将会发生错误。命令中所指定的scroe值应该是能够转换为数字值的字符串，并且接受双精度浮点类型。<br />返回值：如果元素被添加，返回值为1；如果元素已经是有序集合中的一员并且scroe被更新，那么返回值为0。<br />该命令自1.1版本后可用。<br /><br />2.ZCARD<br />语法：ZCARD <br />key<br />说明：该操作的时间复杂度为O(1)。返回存储在key对应的有序集合中的元素的个数。<br />返回值：返回有序集合中元素的个数，如果key不存在，那么返回值为0。<br />该命令自1.1版本后可用。<br /><br />3.ZCOUNT<br />语法：ZCOUNT <br />key min <br />max<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为元素的个数，而M为min和max间的元素个数。返回key对应的有序集合中介于min和max间的元素的个数。<br />返回值：返回指定scroe范围内的元素的个数。<br />该命令自1.3.3版本后可用。<br /><br />4.ZINCRBY<br />语法：ZINCRBY <br />key increment <br />member<br />说明：该操作的时间复杂度为O(long(N))，此处N为有序集合中元素的个数。将key对应的有序集合中member元素的scroe加上increment。如果指定的member不存在，那么将会添加该元素，并且其score的初始值为increment。如果key不存在，那么将会创建一个新的有序列表，其中包含member这一唯一的元素。如果key对应的值不是有序列表，那么将会发生错误。指定的score的值应该是能够转换为数字值的字符串，并且接收双精度浮点数。同时，你也可用提供一个负值，这样将减少score的值。<br />返回值：返回member的新的score的值，表示为字符串。<br />该命令自1.1版本后可用。<br /><br />5.ZINTERSTORE<br />语法：ZINTERSTORE <br />destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <br />SUM|MIN|MAX]<br />说明：在最坏的情况下，该操作的时间复杂度为O(N*K)+O(M*log(M))，此处N为最小的有序集合，K为有序集合的个数，而M为结果有序集合中元素的个数。计算numkeys个由keys指定的有序集合的交集，并且将结果存储在destination中。在该命令中，在你传递输入keys之前，必须提供输入keys的个数和其它可选的参数。<br />在默认情况下，一个元素的结果score是具有该元素的所有有序集合的score的和。关于WEIGHTS和AGGREGATE选项，可以参看ZUNIONSTORE命令。如果目标已经存在，那么它将会被重写。<br />返回值：返回destination有序集合中元素的个数。<br />该命令自1.3.10版本后可用。<br /><br />6.ZRANGE<br />语法：ZRANGE <br />key start stop <br />[WITHSCORES]<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为有序集合中元素的个数，而M为将要返回的元素的个数。返回存储在key上的指定区域内的元素。元素将会按照从低到高的顺序进行排序。而对于具有相同score的元素，将会按照字典顺序进行排序。<br />当你需要按照从高到低的顺序进行排序元素时，请参考ZREVRANGE命令。在命令中，start和stop索引都是以0开始的，0表示第一个元素，1表示第二个元素，以此类推。它们同样可以是负值，以便从有序集合的尾部指定偏移值，此时，-1表示有序集合中的最后一个元素，-2表示倒数第二个元素，以此类推。超出边界的索引值将会产生错误。如果start超出有序集合的最大的索引值，或者start <br />&gt; <br />end，那么将会返回一个空集。如果stop超出有序集合的最大索引，那么会将其当作最后一个元素对待。<br />同时，可以向该命令传递WITHSCORES选项以便在返回元素时带上其scores信息。此时返回值列表将会是value1, <br />score1, ... , valueN, scoreN，而非value1, ... , <br />valueN。<br />返回值：返回指定区域内的元素列表。<br />该命令自1.1版本后可用。<br /><br />7.ZRANGEBYSCORE<br />语法：ZRANGEBYSCORE <br />key min max [WITHSCORES] [limit offset <br />count]<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为有序集合中元素的个数，而M为将要返回的元素的个数。如果M为常量，可以认为时间复杂度为O(log(N))。返回key对应的有序集合中score介于min和max之间的所有元素（包哈score等于min或者max的元素）。元素按照score从低到高的顺序排列。如果元素具有相同的score，那么会按照字典顺序排列。<br />可选的选项LIMIT可以用来获取一定范围内的匹配元素。如果偏移值较大，有序集合需要在获得将要返回的元素之前进行遍历，因此会增加O(N)的时间复杂度。可选的选项WITHSCORES可以使得在返回元素的同时返回元素的score，该选项自从Redis <br />2.0版本后可用。<br />排除区间端点和无穷值：<br />min和max可以是-inf和+inf，因此你能够在不知道score的最大值或最小值的情况下获取一定范围内的所有元素。在默认情况下，由min和max指定的区间是闭区间。同时可以通过在score的前面添加&#8220;(&#8221;前缀来指定一个开区间（不包括区间端点）。例如：<br />ZRANGEBYSCORE <br />zset (1 5<br />将会返回1 &lt; score &lt;= <br />5的所有元素。<br />返回值：指定score区间内的所有元素列表。<br />该命令自1.050版本后可用。<br /><br />8.ZRANK<br />语法：ZRANK <br />key <br />member<br />说明：该操作的时间复杂度为O(log(N))。返回key对应的有序集合中member元素的索引值，元素按照score从低到高进行排列。rank值（或index）是从0开始的，这意味着具有最低score值的元素的rank值为0。使用ZREVRANK可以获得从高到低排列的元素的rank（或index）。<br />返回值：如果有序集合中存在member，将会返回member的rank值，如果member不存在，或者指定的key不存在，那么返回值为nil。<br />该命令自1.3.4版本后可用。<br /><br />9.ZREM<br />语法：ZREM <br />key <br />member<br />说明：该操作的时间复杂度为O(log(N))，此处N为有序集合中元素的个数。从key对应的有序集合中移除指定的元素。如果member不是有序集合中的元素，那么将不执行任何操作。如果key存在但是其对应的值不是有序集合，那么将会发生错误。<br />返回值：如果member被移除，那么返回值为1；如果member不是有序集合中的元素，那么返回值为0。<br />该命令自1.1版本后可用。<br /><br />10.ZREMRANGEBYRANK<br />语法：ZREMRANGEBYRANK <br />key start <br />stop<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为有序集合中元素的个数，而M为将要移除的元素的个数。移除key对应的有序集合中rank值介于start和stop之间的所有元素。start和stop均是从0开始的，并且两者均可以是负值。当索引值为负值时，表明偏移值从有序集合中score值最高的元素开始。例如：-1表示具有最高score的元素，而-2表示具有次高score的元素，以此类推。<br />返回值：返回将要移除的元素的个数。<br />该命令自1.3.4版本后可用。</p><br /><p><br />11.ZREMRANGEBYSCORE<br />语法：ZREMRANGEBYSCORE key min <br />max<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为有序集合中元素的个数，而M为将要移除的元素的个数。移除key对应的有序集合中scroe位于min和max（包含端点）之间的所哟元素。从2.1.6版本后开始，区间端点min和max可以被排除在外，这和ZRANGEBYSCORE的语法一样。<br />返回值：返回将要移除的元素个数。<br />该命令自1.1版本后可用。<br /><br />12.ZREVRANGE<br />语法：ZREVRANGE <br />key start stop <br />[WITHSCORES]<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为有序集合中元素的个数，而M为将要返回的元素的个数。返回key对应的有序集合中指定区间的所有元素。这些元素按照score从高到低的顺序进行排列。对于具有相同的score的元素而言，将会按照递减的字典顺序进行排列。该命令与ZRANGE类似，只是该命令中元素的排列顺序与前者不同。<br />返回值：指定区间内的元素的列表。<br />该命令自1.1版本后可用。<br /><br />13.ZREVRANGEBYSCROE<br />语法：ZREVRANGEBYSCORE <br />key max min [WITHSCORES] [LIMIT offset <br />count]<br />说明：该操作的时间复杂度为O(log(N)+M)，此处N为有序集合中元素的个数，M为将要返回的元素的个数。如果M是个常量，那么可以认为时间复杂度为O(log(N))。<br />返回key对应的有序集合中score介于max和min（包含score等于max或者min的元素）之间的所有元素。该命令按照score从高到低的顺序对元素进行排序。如果两个元素具有相同的score，那么它们将会按照字典顺序进行排列。除去排列顺序的不同，ZREVRANGEBYSCORE命令与ZRANGEBYSCORE命令相同。<br />返回值：指定score区间内的元素的列表。<br />该命令自2.1.6版本后可用。<br /><br />14.ZREVRANK<br />语法：ZREVRANK <br />key <br />member<br />说明：该操作的时间复杂度为O(log(N))。返回key对应的有序集合中member的索引值，元素按照从高到低的顺序进行排列。rank值（或称为索引值）是从0开始计数的，因此具有最高score值的元素的rank值为0。你可以使用ZRANK命令来获取按照scroe值从低到高顺序排列的元素的rank值。<br />返回值：如果member在有序集合中存在，那么返回值为member的rank值；如果member不存在或者key不存在，那么返回值为nil。<br />该命令自1.3.4版本后可用。<br /><br />15.ZSCORE<br />语法：ZSCORE <br />key <br />member<br />说明：该命令的时间复杂度为O(1)。返回key对应的有序集合中member的score值。如果member在有序集合中不存在，那么将会返回nil。<br />返回值：返回member的score值（一个双精度浮点数字），表示为字符串。<br />该命令自1.1版本后可用。<br /><br />16.ZUNIONSTORE<br />语法：ZUNIONSTORE <br />destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <br />SUM|MIN|MAX]<br />说明：该操作的时间复杂度为O(N)+O(Mlog(M))，此处N为输入有序集合的总大小，M为结果集合中元素的个数。对keys对应的numkeys个有序集合计算合集，并将结果存储在destination中。在传递输入keys之前必须提供输入keys的个数和其它可选参数。在默认情况下，元素的结果score是包含该元素的所有有序集合中score的和。如果使用WEIGHTS选项，你可以对每一个有序集合指定一个操作因子。这意味着每一个有序集合中的每个元素的score在传递给聚合函数之前均会被乘以该因子。当WEIGHTS没有指定时，操作因子默认为1。<br />使用AGGREGATE选项，你可以指定交集中的结果如何被聚合。该选项默认值为SUM，在这种情况下，一个元素的所有score值均会被相加。当选项被设置为MIN或MAX时，结果集合中将会包含一个元素的最大或者最小的score值。如果destination已经存在，那么它将会被重写。<br />返回值：目标有序集合中的元素的个数。<br />该命令自1.3.10版本后可用。</p></div><img src ="http://www.blogjava.net/lyjjq/aggbug/381087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-06-19 12:48 <a href="http://www.blogjava.net/lyjjq/articles/381087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis命令——Sets相关 </title><link>http://www.blogjava.net/lyjjq/articles/381086.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 19 Jun 2012 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/381086.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/381086.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/381086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/381086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/381086.html</trackback:ping><description><![CDATA[<div id="article_content" class="article_content"><p>本文介绍Redis中与集合相关的命令，内容主要来源于Redis的官方网站，如有需要请参看：<a href="http://redis.io/commands#set">http://redis.io/commands#set</a>。</p><br /><p>1.SADD<br />语法：SADD key <br />member<br />说明：该操作的时间复杂度为O(1)。向存储在key上的集合中添加元素。如果该元素已经存在，那么将不会执行任何操作。如果指定的key不存在，那么将会创建一个新的集合，并且该集合中包含新添加的唯一一个元素。如果key对应的值不是set类型，那么将会发生错误。<br />返回值：如果向集合中添加了元素，那么返回值为1；如果member已经是该集合中的元素，那么返回值为0。<br />该命令自0.07版本后可用。<br /><br />2.SCARD<br />语法：SCARD <br />key<br />说明：该操作的时间复杂度为O(1)。返回key对应的集合中所存储的元素个数。<br />返回值：返回集合中的元素个数，如果key不存在，那么返回值为0。<br />该命令自0.07版本后可用。<br /><br />3.SDIFF<br />语法：SDIFF <br />key [key <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为包含在所有指定集合中元素个数。返回第一个集合与后续所有集合中的元素的差集。<br />返回值：结果集合的元素列表。<br />该命令自0.100版本后可用。<br /><br />4.SDIFFSTORE<br />语法：SDIFFSTORE <br />destination key [key <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为包含在所有指定集合中元素个数。该命令等同于SDIFF，但是该命令会将结果存储在destination中。如果目标已经存在，它将会被重写。<br />返回值：结果集合中的元素个数。<br />该命令自0.100版本后可用。<br /><br />5.SINTER<br />语法：SINTER <br />key [key <br />...]<br />说明：在最坏的情况下，该操作的时间复杂度为O(N*M)，此处N为最小的集合的元素个数，而M为所给集合的个数。返回所有指定集合的交集。如果keys不存在，那么它将被认为是空集合。如果指定的keys中有一个是空集合，那么结果集合也将为空集合。<br />返回值：结果集合中的元素列表。<br />该命令自0.07版本后可用。<br /><br />6.SINTERSTORE<br />语法：SINTERSTORE <br />destination key [key <br />...]<br />说明：该操作的时间复杂度为O(N*M)，此处N为最小的集合的元素个数，而M为所给集合的个数。该命令等同于SINTER，但是该命令并不直接返回结果集合，而是将其存储在destination中。<br />如果目标集合已经存在，那么它将被重写。<br />返回值：结果集合中的元素个数。<br />该命令自0.07版本后可用。<br /><br />7.SISMEMBER<br />语法：SISMEMBER <br />key <br />memeber<br />说明：该操作的时间复杂度为O(1)。查看指定的member是否是key对应的集合中的元素。<br />返回值：如果指定的member是集合中的元素，那么返回值为1；如果指定的元素不是集合中的元素，或者key不存在，那么返回值为0。<br />该命令自0.07版本后可用。<br /><br />8.SMEMBERS<br />语法：SMEMBERS <br />key<br />说明：该操作的时间复杂度为O(N)，此处N为集合的元素个数。返回存储在key上的集合中所有元素的个数。该命令与具有一个参数的SINTER命令效果相同。<br />返回值：返回集合中的所有元素。<br />该命令自0.07版本后可用。<br /><br />9.SMOVE<br />语法：SMOVE <br />source destination <br />member<br />说明：该操作的时间复杂度为O(1)。将元素member从集合source中移至destination中。该操作是原子性的。对别的客户端而言，在每一个给定的时刻，元素会使source或者destination中的一员。如果source集合不存在或者没有包含指定的元素，将不会执行任何操作，并且返回值为0。不然的话，元素将会从source中移除，并且添加到destination中。当指定的元素已经在destination集合中存在时，该元素仅仅会从source集合中移除。如果source或者destination对应的值不是集合类型，那么将会发生错误。<br />返回值：如果元素被移除，那么将会返回1；如果指定的元素不是source中的一员并且没有执行任何操作，那么返回值为0。<br />该命令自0.091版本后可用。<br /><br />10.SPOP<br />语法：SPOP <br />key<br />说明：该操作的时间复杂度为O(1)。从key对应的集合中移除并返回一个随机的元素。该操作与SRANDMEMBER类似，但是SRANDMEMBER会从集合中返回一个随机元素但是并不移除它。<br />返回值：返回被移除的元素，如果key不存在，那么返回值为nil。<br />该命令自0.101版本后可用。<br /><br />11.SRANDMEMBER<br />语法：SRANDMEMBER <br />key<br />说明：该操作的时间复杂度为O(1)。返回key对应的集合中的一个随机元素。该操作与SPOP类似，但是SPOP命令会移除随机选择的元素，SRANDMEMBER仅仅是在不改变原有集合的基础上返回该随机元素。<br />返回值：返回随机选取的元素，如果指定的key不存在，那么返回值为nil。<br />该命令自1.001版本后可用。<br /><br />12.SREM<br />语法：SREM <br />key <br />member<br />说明：从key对应的集合中移除指定的元素member。如果member不是集合中的一个元素，那么将不执行任何操作。<br />如果key对应的值并不是集合类型，那么将会发生错误。<br />返回值：如果元素被移除，那么返回值为1；如果member不是集合中的元素，那么返回值为0。<br />该命令自0.07版本后可用。<br /><br />13.SUNION<br />语法：SUNION <br />key [key <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为所有给定的集合中元素的总数。返回所有给定集合元素的合集。如果指定的key不存在，那么将会被看作空集对待。<br />返回值：结果集合中的元素列表。<br />该命令自0.091版本后可用。<br /><br />14.SUNINOSTORE<br />语法：SUNINOSTORE <br />destination key [key <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为给定集合中所有元素的总数。该命令等同于SUNION，但是该操作并不返回结果集合，而是将结果存储在destination中。如果destination已经存在，那么它将会被重写。<br />返回值：返回结果集合中元素的个数。</p></div><img src ="http://www.blogjava.net/lyjjq/aggbug/381086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-06-19 12:46 <a href="http://www.blogjava.net/lyjjq/articles/381086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis命令——Lists相关 </title><link>http://www.blogjava.net/lyjjq/articles/381085.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 19 Jun 2012 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/381085.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/381085.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/381085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/381085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/381085.html</trackback:ping><description><![CDATA[<h3>本文介绍Redis中与Lists相关的命令，内容主要来源于Redis的官方网站，如有需要请查看：<a href="http://redis.io/commands#list">http://redis.io/commands#list</a>。</h3><div id="article_content" class="article_content"><br /><p> </p><br /><p>1.BLPOP<br />语法：BLPOP key [key ...] <br />timeout<br />说明：该操作的时间复杂度为O(1)。BLPOP是一个阻塞形式的列表POP操作原语。它是LPOP命令的阻塞版本，因为在指定的列表中如果没有元素来弹出，该命令将会阻塞连接。当存储在key上的列表非空时，POP操作将会从列表的首部弹出一个元素。<br />非阻塞行为：<br />当调用BLPOP时，如果在指定的keys中至少有一个存储有非空的列表，那么将会从该列表的首部弹出一个元素，并且返回给用户该key和相应的值。在执行操作时将会按照给定的顺序检查指定的keys。假如存在三个keys，分别为list1、list2和list3，list1相应的列表实际上并不存在，而list2和list3上存储有非空的列表。如以下命令：<br />BLPOP <br />list1 list2 <br />list3<br />BLPOP将会确保从list2的首部返回一个元素。<br />阻塞行为：<br />如果在指定的keys中没有一个包含非空的列表，那么BLPOP将会阻塞连接，直到另外一个客户端对其中的一个列表执行了一个LPUSH或者RPUSH操作。<br />一旦新的数据出现在列表中，客户端将会返回接触阻塞的key的名称和弹出的值。当BLPOP命令引起一个客户端阻塞并且用户指定了非零的超期时间时，客户端在超过超期时间后将会解除阻塞并且返回一个nil值。timeout参数被解析为一个整型值。一个为0的超期时间用于表示无限期阻塞。<br />多个客户端阻塞在相同的keys上<br />多个客户端能够阻塞在相同的key上。它们将会被放入一个队列，并且会按照先来先服务的原则来执行操作。<br />位于MULTI/EXEC事务中的BLPOP命令<br />BLPOP可以与管道线（pipelining）结合使用，但是却不适应应用在MULTI/EXEC块中使用BLPOP命令。这将会阻塞整个服务器以便能够原子性地执行该块，在这种情况下另外的客户端无法执行push操作。位于MULTI/EXEC块中的BLPOP的行为是返回一个nil响应。就像超出超时时间的情况一样。<br />返回值：如果没有元素可以弹出并且超出超时时间，那么返回值为nil；在正常情况下将会返回由两个元素组成的块，其中第一个元素为指定的key，第二个元素为弹出的值。<br />该命令自1.3.1版本后可用。<br /><br />2.BRPOP<br />语法：BRPOP <br />key [key ...] <br />timeout<br />说明：该操作的时间复杂度为O(1)。BRPOP是一个阻塞形式的列表弹出原语。它是RPOP命令的阻塞版本，因为在指定的列表中如果没有元素存在，那么它将会阻塞连接。操作将会按照指定的顺序检查列表，并从第一个非空列表的尾部弹出一个元素。BRPOP操作大致与BLPOP元素相同，但是BRPOP命令从列表的尾部弹出元素。<br />返回值：如果没有元素弹出并且超时，那么返回值为nil；在正常情况下将会返回由两个元素组成的块，其中第一个元素为指定的key，而第二个元素为弹出的值。<br />该命令自1.3.1版本后可用。</p><br /><p> </p><br /><p>3.BRPOPLPUSH<br />语法：BRPOPLPUSH source destination <br />timeout<br />说明：该操作的时间复杂度为O(1)。BRPOPLPUSH命令式RPOPLPUSH操作的阻塞版本。当source包含元素时，命令的行为同RPOPLPUSH命令一致。当source为空时，Redis将会阻塞连接，直到另外一个客户端对source执行了一个push操作或者超出超时时间。一个为零的超时时间将会无限期阻塞。<br />返回值：在正常情况下会返回从source弹出并且压入destination中的元素。如果超出超期时间，将会返回一个null响应。<br />该命令自2.1.7版本后可用。<br /><br />4.LINDEX<br />语法：LINDEX <br />key <br />index<br />说明：该操作的时间复杂度为O(N)，此处N是为得到位于index处得元素将要遍历的元素的个数。如果是得到列表中第一个或者最后一个元素，那么时间复杂度为O(1)。<br />该操作将会返回存储在key上的列表中位于index处得元素。index的值从0开始，因此0意味着首元素，1表示列表中的第二个元素。如果index值为负，那么将会从列表的尾部进行遍历。此处，-1代表最后一个元素，-2代表倒数第二个元素，以此类推。当存储在key上的值不是列表时，将会返回错误。<br />返回值：返回请求的元素，如果index超出范围，那么返回值将为nil。<br />该命令自0.07版本后可用。<br /><br />5.LINSERT<br />语法：LINSERT <br />key BEFORE|AFTER pivot <br />value<br />说明：该操作的时间复杂度为O(N)，此处N为在找到枢轴pivot前需要遍历的元素个数。这意味着将元素插入到列表左端的时间复杂度可以认为为O(1)；而插入右端的时间复杂度为O(N)。插入存储在key上的列表的值可以位于pivot的左侧或者右侧。如果指定的key不存在时，那么它将会被认作一个空列表，并不执行任何操作。如果指定的key存在，但是所持有的值不是列表时，将会返回一个错误。<br />返回值：该操作将会返回插入操作完成后的列表的长度，如果枢轴没有找到，那么将会返回-1。<br />该命令自2.1.1版本后可用。<br /><br />6.LLEN<br />语法：LLEN <br />key<br />说明：该操作的时间复杂度为O(1)。返回存储在key上的列表的长度。如果key不存在，那么将会被认作一个空列表，并且返回者为0。如果存储在key上的值不是列表，那么将会返回一个错误。<br />返回值：存储在key上的列表的长度。<br />该命令自0.07版本后可用。<br /><br />7.LPOP<br />语法：LPOP <br />key<br />说明：该操作的时间复杂度为O(1)。移除并返回存储在key上的列表的首元素。<br />返回值：列表的首元素，如果指定的key不存在，那么返回值为nil。<br />该命令自0.07版本后可用。<br /><br />8.LPUSH<br />语法：LPUSH <br />key <br />value<br />说明：该操作的时间复杂度为O(1)。在存储在key上的列表的首部插入一个元素。如果指定的key不存在，那么该命令在正式执行前将会创建一个空列表。如果key对应的值不是列表类型，那么将会返回一个错误。<br />返回值：返回插入操作完成后列表的长度。<br />该命令自0.07版本后可用。<br /><br />9.LPUSHX<br />语法：LPUSHX <br />key <br />value<br />说明：该操作的时间复杂度为O(1)。如果指定的key存在，并且对应的值为列表类型时，那么在该列表的首部插入一个元素。与LPUSH相反，如果key不存在，那么将不会进行任何操作。<br />返回值：操作执行完成后列表的长度。<br />该命令自2.1.1版本后可用。<br /><br />10.LRANGE<br />语法：LRANGE <br />key start <br />stop<br />说明：该操作的时间复杂度为O(S+N)，此处S为开始元素的偏移，而N为指定区间的元素的个数。返回存储在key上的指定元素。开始元素的偏移值和stop的索引值均是以0开始，并且0代表列表中的第一个元素，而1代表第二个元素，以此类推。<br />偏移值可以是负值，表示从列表的尾部开始。例如，-1代表列表的最后一个元素，而-2代表列表中的倒数第二个元素。需要注意的是：如果有一个列表，元素编号为从0到100，那么LRANGE <br />list 0 <br />10将会返回11个元素，也就是说，该操作会包含列表中最后端的元素。<br />索引越界：越界索引将不会引发错误。如果开始值超出列表的范围，或者start的值大于end的值，那么将会返回一个空列表。如果end超出列表的范围，那么Redis将会将其作为列表中的最后一个元素对待。<br />返回值：返回指定区域中的元素的列表。<br />该命令自0.07版本后可用。<br /><br />11.LREM<br />语法：LREM <br />key count <br />value<br />说明：该命令的时间复杂度为O(N)，此处N为列表的长度。在key对应的列表中删除前count个其值为value的元素。count的值会按照如下方式来影响操作：<br />（1）count <br />&gt; 0：从列表首部开始移除其值为value的count个元素<br />（2）count &lt; <br />0：从列表尾部开始移除其值为value的|count|个元素<br />（3）count = <br />0：移除所有其值为value的元素<br />需要注意的是：不存在的key会被当作空列表存在。因此，如果key不存在，那么该命令将会始终返回0。<br />返回值：返回移除的元素的个数。<br />该命令自0.07版本后可用。<br /><br />12.LSET<br />语法：LSET <br />key index <br />value<br />说明：时间复杂度为O(N)，此处N为列表的长度。设置列表中第一个或者最后一个元素的时间复杂度为O(1)。将列表中index处的值设置为value。如果index超出列表的返回，那么发生错误。<br />返回值：状态码。<br />该命令自0.07版本后可用。<br /><br />13.LTRIM<br />语法：LTRIM <br />key start <br />stop<br />说明：该操作的时间复杂度为O(N)，此处N为操作将要移除的元素的个数。对一个已经存在列表进行LTRIM操作将会使得列表仅仅包含指定区间中的元素。start和stop的索引值均是以0开始的，这里0表示列表中的第一个元素，1表示第二个元素，以此类推。start和stop可以是负值，这意味着从偏移值是从列表的尾部开始，这里-1表示列表中的最后一个元素，而-2表示倒数第二个元素，以此类推。超出界限的索引值并不会产生错误：如果start的值超出列表的范围，或者start <br />&gt; <br />end，那么将会返回一个空列表。如果end超出列表的界限，那么Redis将会将其视作列表的最后一个元素。<br />返回值：状态码。<br />该命令自0.07版本后可用。<br /><br />14.RPOP<br />语法：RPOP <br />key<br />说明：该操作的时间复杂度为O(1)。移除并返回存储在key上的列表中的最后一个元素。<br />返回值：最后一个元素的值，如果key不存在，那么返回值为nil。<br />该命令自0.07版本后可用。<br /><br />15.RPOPLPUSH<br />语法：RPOPLPUSH <br />source <br />destination<br />说明：该操作的时间复杂度为O(1)。原子性地返回并移除存储在source列表中的最后一个元素，并将其压入由destination指定的列表中。如果source不存在，那么将不会进行任何操作，并且返回值为nil。如果source和destination相同，操作等同于将列表的最后一个元素移至列表的首部。因此，可以将该命令看作是列表的轮转操作。<br />返回值：弹出/压入的元素。<br />该命令自1.1版本后可用。<br /><br />16.RPUSH<br />语法：RPUSH <br />key <br />value<br />说明：该操作的时间复杂度为O(1)。将元素插入存储在key上的列表的尾部。如果key不存在，那么在执行操作之前会创建一个空列表。如果key对应的值不是列表，那么将会发生错误。<br />返回值：返回操作完成后列表的长度。<br />该命令自0.07版本后可用。<br /><br />17.RPUSHX<br />语法：RPUSHX <br />key <br />value<br />说明：该操作的时间复杂度为O(1)。如果key存在并且其值为列表，那么将value插入该列表的尾部。如果key不存在，那么将不进行任何操作。<br />返回值：返回操作完成后列表的长度。<br />该命令自2.1.1版本后可用。</p></div><img src ="http://www.blogjava.net/lyjjq/aggbug/381085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-06-19 12:45 <a href="http://www.blogjava.net/lyjjq/articles/381085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis命令——哈希（Hashes）相关 </title><link>http://www.blogjava.net/lyjjq/articles/381084.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 19 Jun 2012 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/381084.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/381084.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/381084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/381084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/381084.html</trackback:ping><description><![CDATA[<h3><span style="font-size: small;">本文主要介绍Redis中有关哈希的操作命令，内容主要来源于Redis的官方网站。如有需要请参考Redis的官方网站：<a href="http://redis.io/commands#hash">http://redis.io/commands#hash</a>。</span></h3><div id="article_content" class="article_content"><br /><p><span style="font-size: small;">1.HDEL<br />语法：HDEL key <br />field<br />说明：该操作的时间复杂度为O(1)。移除存储在key上的哈希中的指定域。<br />返回值：如果在哈希中存在指定的域并且被移除，返回值为1；如果指定的域不存在或者key不存在，返回值为0。<br />该命令自1.3.10版本后可用。<br /><br />2.HEXISTS<br />语法：HEXISTS <br />key <br />field<br />说明：该操作的时间复杂度为O(1)。查看存储在key上的哈希中是否存在指定的域。<br />返回值：如果哈希中包含指定的域，那么返回值为1；如果哈希中不包括指定的域或者key不存在，那么返回值为0。<br />该命令自1.3.10版本后可用。<br /><br />3.HGET<br />语法：HGET <br />key <br />field<br />说明：该操作的时间复杂度为O(1)。返回存储在key上的哈希中与field域关联的值。<br />返回值：返回与field域关联的值，如果在哈希中该域不存在或者key不存在，那么返回者为nil。<br />该命令自1.3.10版本后可用。<br /><br />4.HGETALL<br />语法：HGETALL <br />key<br />说明：该操作的时间复杂度为O(N)，此处N为hash的大小。返回存储在key上的哈希中所有的域和相关联的值。在返回值中，每一个域的名称后面会跟着相关联的值。因此，响应结果的长度是hash的大小的两倍。<br />该命令自1.3.10版本后可用。<br /><br />5.HINCRBY<br />语法：HINCRBY <br />key field <br />increment<br />说明：该操作的时间复杂度为O(1)。将存储在key上的哈希中field域相关联的值加上由increment指定的值。如果key不存在，那么将会创建该key，并且其值为hash类型。如果field域不存在或者具有一个不能表示为整型的字符串的值，那么在执行该操作前会将该值设置为0。HINCRBY支持的数据范围限定在64为有符号整数范围内。<br />返回值：返回增量操作完成后field域所关联的值。<br />该命令自1.3.10版本后可用。<br /><br />6.HKEYS<br />语法：HKEYS <br />key<br />说明：该操作的时间复杂度为O(N)，此处N为hash的大小。返回存储在key上的哈希中所有域的名称。<br />该命令自1.3.10版本后可用。<br /><br />7.HLEN<br />语法：HLEN <br />key<br />说明：该操作的时间复杂度为O(1)。返回存储在key上的哈希中所包含的所有域的数目。<br />返回值：返回hash中字段的数目，如果key不存在，那么返回值为0。<br />该命令自1.3.10版本后可用。<br /><br />8.HMGET<br />语法：HMGET <br />key field [field <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为被请求的字段的数目。返回存储在key上的哈希中各个指定域相关联的值。对于在哈希中不存在的域，返回值为nil。因为一个不存在的key被当做是空哈希对待，对一个不存在的key进行HMGET操作将会返回一个nil值的列表。<br />返回值：与指定域相关联的值的列表，并且按照它们被请求的顺序给出。<br />该命令自1.3.10版本后可用。<br /><br />9.HMSET<br />语法：HMSET <br />key field value [field value <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为将要被设置其值的域的个数。设置存储在key上的哈希中指定域的值。该命令会复写哈希中已经存在的域。如果key不存在，那么将会创建一个其值为哈希类型的新key。<br />返回值：返回状态码。<br />该命令自1.3.8版本后可用。<br /><br />10.HSET<br />语法：HSET <br />key field <br />value<br />说明：该操作的时间复杂度为O(1)。设置存储在key上的哈希中指定域的值。如果key不存在，那么将会创建一个持有哈希值的新key。如果指定的域在哈希中已经存在，那么其值将会被重写。<br />返回值：如果哈希中的域是一个新域并且其值被设置，那么返回值为1；如果哈希中已经存在该域并且该域被更新，那么返回值为0。<br />该命令自1.3.10版本后可用。<br /><br />11.HSETNX<br />语法：HSETNX <br />key field <br />value<br />说明：该操作的时间复杂度为O(1)。在指定域不存在的情况下，设置存储在key上的哈希中该域的值。如果该key不存在，那么将会创建一个持有哈希值的新key。如果指定的域已经存在，那么该操作不起作用。<br />返回值：如果指定的域在哈希中是一个新域并且其值被设置，那么返回值为1；如果哈希中该域已经存在，那么该命令不起作用。<br />该命令自1.3.8版本后可用。<br /><br />12.HVALS<br />语法：HVALS <br />key<br />说明：该操作的时间复杂度为O(N)，此处N为哈希的大小。返回存储在key上的哈希中存储的所有值。<br />返回值：返回哈希中存储的值的列表，如果该key不存在，那么将会返回一个空列表。<br />该命令自1.3.10版本后可用。</span> <br /></p></div><img src ="http://www.blogjava.net/lyjjq/aggbug/381084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-06-19 11:34 <a href="http://www.blogjava.net/lyjjq/articles/381084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis命令——字符串相关 </title><link>http://www.blogjava.net/lyjjq/articles/381083.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 19 Jun 2012 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/381083.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/381083.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/381083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/381083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/381083.html</trackback:ping><description><![CDATA[<div class="article_title"><span style="font-size: small;">1.APPEND<br />语法：APPEND key <br />value<br />说明：该操作的时间复杂度为O(1)。在假定被附加的值很少并且已经存在的值可以是任意大小的情况下，平均下来该操作的时间复杂度为O(1)。因为Redis所使用的动态字符串库在每次重新分配空间时均会将可用空间加倍。<br />该命令在key关联的值已经存在并且是字符串类型的情况下，将会把指定的值附加到已有字符串的尾部。如果key并不存在，它将会被创建并且被设置为空串。因此，APPEND命令在这种情况下与SET命令类似。<br />返回值：返回命令完成后字符串的长度。<br />该命令自1.3.3版本后可用。<br /><br />2.DECR<br />语法：DECR <br />key<br />说明：该操作的时间复杂度为O(1)。该命令将存储在key上的数字值减1。如果该key不存在，在进行该操作前将会将其设置为O。如果与key相关联的值具有错误的数据类型或者包含一个不能转换为整数的字符串时，该操作将会出现错误。该操作只针对于64位有符号整数。与之相对应的命令为INCR。<br />返回值：返回减1操作完成后的值。</span> <br /></div><div id="article_content" class="article_content"><br /><p><span style="font-size: small;">如果该key所包含的值的数据类型不符合要求，会返回如下错误信息：</span> </p><br /><p><span style="font-size: small;"><img alt="" src="http://hi.csdn.net/attachment/201105/11/0_1305121877X376.gif" /> <br /><br />该命令自0.0.7版本后可用。<br /><br />3.DECRBY<br />语法：DECRBY key <br />decrement<br />说明：该操作的时间复杂度为O(1)。将存储在key上的值减去由decrement指定的数。如果该key不存在，在进行操作前会将其设置为0。如果与key相关联的值具有错误的数据类型或者包含一个不能转换为整数的字符串时，该操作将会出现错误。该操作只针对于64位有符号整数。<br />返回值：返回减去指定值后的值。<br />该命令自0.0.7版本后可用。<br /><br />4.GET<br />语法：GET <br />key<br />说明：该操作的时间复杂度为O(1)。获取存储在key上的值。如果key并不存在，将会返回nil。如果存储在key上的值的数据类型并非string类型，那么将会出现错误，因为GET仅仅处理string类型的值。</span> <br /></p><br /><p><span style="font-size: small;">返回值：存储在key上的值，如果该key不存在，那么返回值为nil。</span> </p><br /><p><span style="font-size: small;">如果该key上存储的值的数据类型不符合要求，那么会返回如下出错信息：</span> </p><br /><p><span style="font-size: small;"><img alt="" src="http://hi.csdn.net/attachment/201105/11/0_1305122055BoOb.gif" /> <br /><br />该命令自0.0.7版本后可用。<br /><br />5.GETBIT<br />语法：GETBIT key <br />offset<br />说明：该操作的时间复杂度为O(1)。返回存储在key上的字符串在offset偏移处的所具有的位值。<br />如果指定的偏移值超出了字符串的长度，后续字符串被视作由0填充的一片连续空间。如果指定的key不存在，那么将被视为一个空串，在这种情况下，偏移值总会超出范围并且其值可以看作是由0填充的一片连续空间。<br />返回值：返回在offset偏移处的位值。</span> <br /></p><br /><p><span style="font-size: small;">该命令的典型输入如下所示：</span> </p><br /><p><span style="font-size: small;"><img alt="" src="http://hi.csdn.net/attachment/201105/11/0_13051223343j2J.gif" /> <br /><br />该命令自2.1.8版本后可用。<br /></span></p><br /><p> </p><br /><p><span style="font-size: small;">6.GETRANGE<br />语法：GETRANGE key start <br />end<br />说明：时间复杂度为O(N)，此处N为需要返回的字符串的长度。时间复杂度最终由返回的长度决定，因为从已经存在的字符串中创建一个子串代价很低，可以认为对于较小的字符串而言时间复杂度为O(1)</span> <br /><span style="font-size: small;">。需要注意的是：该命令被重新命名为GETRANGE，在Redis <br />2.0版本之前，该命令被称作SUBSTR。该命令返回存储在key上的字符串的特定子串，子串的范围有start和end两个偏移值指定，并且均包含端点。在该命令中可以指定负的偏移值，此时偏移值从字符串尾部开始计算。因此，-1意味着最后一个字符，-2意味着倒数第二个字符。<br />如果指定的偏移值超出了字符串固有的长度，那么命令将会限定结果的范围为字符串的真实长度。<br />返回值：返回取到的子串。<br />该命令自1.3.4版本后可用。<br /><br />7.GETSET<br />语法：GETSET <br />key <br />value<br />说明：该操作的时间复杂度为O(1)。原子性地将key上存储的值设置为value，并且返回原有的值。如果key存在但是所存储的值并不是字符串类型，那么将会返回错误。</span> <br /></p><br /><p><span style="font-size: small;">返回值：返回存储在key上的原有值，如果该key不存在，那么返回值为nil。</span> <br /></p><br /><p><span style="font-size: small;">该命令的典型输出如下所示：</span> </p><br /><p><span style="font-size: small;"><img alt="" src="http://hi.csdn.net/attachment/201105/11/0_1305122441rr66.gif" /> <br /><br />该命令自0.091版本后可用。<br /><br />8.INCR<br />语法：INCR <br />key<br />说明：该操作的时间复杂度为O(1)。将存储在key上的值加1。如果该key不存在，在进行操作前会将其设置为0。如果与key相关联的值具有错误的数据类型或者包含一个不能转换为整型的字符串，那么将会返回一个错误。该操作只针对于64为有符号数。需要注意的是：这是一个字符串操作，因为Redis中并没有一个专门的整型数据类型。存储在key上的字符串被解析为一个十进制的64位有符号整型以便执行该操作。Redis中对整数将以他们的整型表示存储，因此对于实际上表示一个整数的字符串值，依然会按照整形数据进行存储。<br />返回值：返回加1操作完成后的值。<br />该命令自0.07版本后可用。<br /><br />9.INCRBY<br />语法：INCRBY <br />key <br />increment<br />说明：该操作的时间复杂度为O(1)。对存储在key上的值加上increment指定的值。如果该key不存在，在执行该操作之前会先将其设置为0，然后再执行该操作。如果存储在该key上的值具有错误的数据类型或包含一个不能转换为整型的字符串值，那么将会返回一个错误。该操作只针对64位有符号整数。<br />返回值：返回操作完成后的值。<br />该命令自0.07版本后可用。<br /><br />10.MGET<br />语法：MGET <br />key [key <br />...]<br />说明：该操作的时间复杂度为O(N)，这里N表示将要取回的key的个数。返回存储在指定keys上的值。对于每一个其值的数据类型不是字符串类型或者不存在的key，返回值将会为nil。因此，执行该操作并不会出现失败的情况。<br />返回值：存储在指定keys上的值的列表。<br />该命令自0.07版本后可用。<br /><br />11.MSET<br />语法：MSET <br />key value [key value <br />...]<br />说明：该操作的时间复杂对为O(N)，此处N为将要设置其值的key的个数。对指定的keys设置相应的值。与SET命令一样，MSET将会使用新值替代原有的值，MSET操作是原子性的，因此所有指定的keys将会在一次操作过程中设置完成。<br />返回值：返回值总为OK，因为MSET命令不会失败。<br />该命令自1.001版本后可用。<br /><br />12.MSETNX<br />语法：MSETNX <br />key value [key value <br />...]<br />说明：该操作的时间复杂度为O(N)，此处N为将要设置其值的keys的个数。将给定的keys设置为相应的值。如果指定的keys中任何一个已经存在，那么该操作将不会被执行。因此，MSETNX可以用来对唯一的逻辑对象中的表示不同字段的keys设置其值，以便能够确保这些字段要么全部被成功设置要么均不会被设置。MSETNX操作是原子性的，因此所有的keys将会在一次操作过程中被设置。<br />返回值：如果所有的keys的值均被设置，那么返回值为1；如果没有key被设置其值，那么返回值为0。<br />该命令自1.001版本后可用。<br /><br />13.SET<br />语法：SET <br />key <br />value<br />说明：该操作的时间复杂度为O(1)。对指定key设置一个字符串值。如果该key已经具有值，该值将会被重写而不管它的数据类型。<br />返回值：返回值总是OK，因为SET操作不会失败。<br />该命令自0.07版本后可用。<br /><br />14.SETBIT<br />语法：SETBIT <br />key offset <br />value<br />说明：该操作的时间复杂度为O(1)。设置或者清除存储在key上的字符串在指定偏移处的位值。命令中的value可以指定为0或者1，根据value的不同，位值可以被设置或者被清除。当该key不存在时，将会创建一个新的字符串的值。字符串的长度可以增长以便能够包含offset偏移处的值。命令中的offset的值需要大于或者等于0，但是需要小于232。这会将位图（bitmaps）的大小限定在512MB以内。当存储在该key上的字符串被扩展时，增加的位将会被设置为0。需要注意的是，当设置最后一个可能的位（偏移值等于232-1）并且存储在该key上的字符串值还并没包含字符串值或者包含长度较小的字符串值时，Redis需要重新分配中间内存，这可能会阻塞服务器一段时间。一旦第一次分配空间分配完成后，对相同keys后续的SETBIT调用将不再有空间分配的开销。<br />返回值：返回在offset偏移处的原有的位值。<br />该命令自2.1.8版本后可用。<br /><br />15.SETEX<br />语法：SETEX <br />key seconds <br />value<br />说明：该操作的时间复杂度为O(1)。设置key上存储的值为value，并且该key在给定的seconds秒后超时。该命令等同于如下的命令：</span> <br /></p><br /><p><span style="font-size: small;">SET mykey value<br />EXPIRE mykey <br />seconds<br />SETEX操作是原子性的，并且可以使用位于MULTI/EXEC块中的上述两条命令来取代。该命令提供了对指定操作序列的一种替代方式，因为这一操作在Redis用作缓存时使用非常普遍。<br />返回值：返回Redis的状态码。<br />该命令自1.3.10版本后可用。<br /><br />16.SETNX<br />语法：SETNX <br />key <br />value<br />说明：该命令的时间复杂度为O(1)。如果指定的key不存在，那么将其值设置为一个字符串。在这种情况下，该命令等同于SET。当在key上已经存储有值时，将不进行任何操作。SETNX可以看作是&#8220;SET <br />if Not <br />eXists&#8221;的缩写。<br />返回值：如果该key的值被设置，返回值为1；如果该key没有被设置，那么返回值为0。<br />该命令自0.07版本后可用。<br /><br />17.SETRANGE<br />语法：SETRANGE <br />key offset <br />value<br />说明：该操作的时间复杂度为O(1)，其中并不包括拷贝新串的时间开销。通常情况下，字符串长度很小，因此平均下来时间复杂度可以看作是O(1)。不然的话，时间复杂度为O(M)，此处M的值为指定的value的长度。存储在key上字符串被重写的部分从指定的offset位值开始，长度与value所具有的长度相同。如果offset大于当前字符串的长度，字符串将会使用0来补充以便适应指定的offset。如果指定的key不存在，那么存储在其上的值被认为是空串，因此该命令将会确保该key会持有一个足够大的字符串以便能够设置其在offset偏移处的值。需要注意的是：你可以设置的最大的偏移值为229-1，因为Redis字符串的大小被限定在512MB以内。如果你希望超出该范围，你可以使用多个keys。<br />返回值：返回该命令完成后字符串的长度。<br />该命令自2.1.8版本后可用。<br /><br />18.STRLEN<br />语法：STRLEN <br />key<br />说明：该操作的时间复杂度为O(1)。返回存储在key上的字符串的长度。如果在该key上存储的值不是字符串类型，那么将返回一个错误。<br />返回值：返回存储在key上的字符串的长度；如果该key不存在，那么返回值为0。<br />该命令自2.1.2版本后可用。</span> <br /></p></div><img src ="http://www.blogjava.net/lyjjq/aggbug/381083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-06-19 11:33 <a href="http://www.blogjava.net/lyjjq/articles/381083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Redis命令——Keys相关 </title><link>http://www.blogjava.net/lyjjq/articles/381082.html</link><dc:creator>强强</dc:creator><author>强强</author><pubDate>Tue, 19 Jun 2012 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/lyjjq/articles/381082.html</guid><wfw:comment>http://www.blogjava.net/lyjjq/comments/381082.html</wfw:comment><comments>http://www.blogjava.net/lyjjq/articles/381082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyjjq/comments/commentRss/381082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyjjq/services/trackbacks/381082.html</trackback:ping><description><![CDATA[<p>&nbsp;</p><p>以下为Redis中有关Keys操作的一些命令，内容主要来源于Redis的官方文档。如有需要，请参阅Redis的官方文档：<a href="http://redis.io/commands#generic">http://redis.io/commands#generic</a>。</p><p>&nbsp;1.DEL<br />语法：DEL key [key <br />...]<br />说明：移除指定的keys，如果该key不存在则将会被忽略。该操作的时间复杂度为O(N)，这里N为将要移除的keys的个数。当将要移除的key对应除字符串类型外其它类型的值时，对该key进行操作的时间复杂度为O(M)，M为列表（list）、集合（set）、有序集合（sorted <br />set）或者哈希（hash）中所包含元素的个数。移除对应值为字符串类型的单个key的时间复杂度为O(1)。<br />返回值：将要移除的keys的个数。<br />该命令自0.07版本后可用。</p><p>2.EXISTS<br />语法：EXISTS <br />key<br />说明：判断指定的key是否存在。该操作的时间复杂度为O(1)。<br />返回值：如果指定的key存在，则返回值为1，否则返回值为0。<br />该命令自0.0.7版本后可用。</p><p>3.EXPIRE<br />语法：EXPIRE <br />key <br />seconds<br />说明：设置指定key的超时时间，超时后该key将会被自动删除。该操作的时间复杂度为O(1)。在Redis中，如果一个key与某个超时时间相关联，那么该key将被称为是易失的（volatile）。在2.1.3版本之前，已经存在的超时时间是不能被重写的。因此，如果一个key已经关联了某个过期时间，那么该命令将不会起作用并且返回值为0。但是自2.1.3版本后，Redis允许更新一个key的超时时间。另外，你可以使用PERSIST命令来移除一个key相关联的超时时间。<br />返回值：如果成功设置了超时时间，那么返回值为1；如果该key不存在或者不能够设置超时时间，那么返回值为0。</p><p>&nbsp;</p><p>该命令自0.0.9版本后可用。</p><p>4.EXPIREAT<br />语法：EXPIREAT key <br />timestemp<br />说明：该操作的时间复杂对为O(1)。该命令与EXPIRE命令有着相同的语义和效果，二者唯一的差别是：EXPIREAT命令中指定的并不是表示TTL（Time <br />To <br />Live）的秒数，而是一个确定的UNIX时间戳（即自1970年1月1日之后的秒数）。<br />返回值：如果成功设置了超时时间，那么返回值为1，如果该key不存在或者不能够设置超时时间，那么返回值为0。 </p><p>&nbsp;</p><p>&nbsp;</p><p><br />该命令自1.1版本后可用。</p><p>5.KEYS<br />语法：KEYS <br />pattern<br />说明：返回与指定模式相匹配的所用的keys。该操作的时间复杂度为O(N)，N为数据库中所拥有的keys的个数，并假设数据库中keys的名称与给定的匹配模式均具有有限的长度。虽然该操作的时间复杂度为O(N)，但是此处时间复杂度的常量系数相当低。需要注意的是：在生产环境中使用该命令需要特别注意，该命令在对规模较大的数据库进行操作时可能会损害性能。该命令主要是设计用来进行调试和进行特殊的操作，例如更改keyspace的布局（layout）等。 </p><p>&nbsp;</p><p>该命令所支持的匹配模式如下：<br />（1）?：用于匹配单个字符。例如，h?llo可以匹配hello、hallo和hxllo等；<br />（2）*：用于匹配零个或者多个字符。例如，h*llo可以匹配hllo和heeeello等；<br />（3）[]：可以用来指定模式的选择区间。例如h[ae]llo可以匹配hello和hallo，但是不能匹配hillo。<br />同时，可以使用&#8220;/&#8221;符号来转义特殊的字符</p><p>&nbsp;</p><p>例如，使用如下命令可以查看数据库中的所有keys：keys *</p><p><br />&nbsp;</p><p><br />返回值：返回匹配指定模式的keys的列表。 </p><p><br />该命令自0.0.7版本后可用。</p><p>6.MOVE<br />语法：MOVE key <br />db<br />说明：将指定的key从当前选择的数据库（使用SELECT命令）移动到目标数据库，该操作的时间复杂度为O(1)。当该key在目标数据库中已经存在或者它在源数据库中并不存在时，该命令将不进行任何操作。基于此可以将该命令用作一个锁定的原语操作（locking <br />primitive）。 </p><p><br />返回值：如果该key被移至目标数据库，那么返回值为1；如果该key未被移动，那么返回值为0。 </p><p>&nbsp;</p><p>该命令自0.0.7版本后可用。</p><p>7.OBJECT<br />语法：OBJECT <br />subcommand [arguments [arguments <br />...]]<br />说明：对于现阶段已经实现的子命令而言，时间复杂度均为O(1)。该命令允许用户查看与keys相关联的Redis对象的内部信息。对于调试或者理解keys是否正在使用特殊编码的数据类型以便节省空间，该命令非常有用。在使用Redis作为缓存时，你的应用程序可能需要使用OBJECT命令返回的信息来实现应用层次的key驱离策略（eviction <br />policies）。<br />该命令支持多种子命令，如下所示：<br />（1）OBJECT REFCOUNT <br />&lt;key&gt;：返回对与指定key相关联的值的引用个数。该命令对用户进行调试非常有帮助；<br />（2）OBJECT ENCODING <br />&lt;key&gt;：返回用于存储与指定key相关联的值的内部表示类型；<br />（3）OBJECT IDLETIME <br />&lt;key&gt;：返回与key相关联的值自存储以来处于空闲状态（IDLE）的秒数（未被read或write等操作所请求）。计时器的时间粒度为10秒，该值在后续版本中可能会发生变化。<br />对象可以使用如下不同的方式进行编码：<br />（1）string可以按照正常的字符串编码格式进行存储或者使用int类型（表示64位有符号数区间中整数的字符串可以按照这种方式进行编码以便节省存储空间）；<br />（2）lists可以被编码为ziplist或者linkedlist格式。对于规模较小的链表而言，可以使用ziplist来表示以便节省存储空间；<br />（3）sets可以被编码为intset或者hashtable格式。intset作为一种特别的编码方式可以用于仅有整数构成的规模较小的集合中；<br />（4）hashes可以被编码为zipmap或者hashtable。zipmap可以用于对规模较小的hashes进行编码；<br />（5）sorted <br />sets可以编码为ziplist或者skiplist。对于list类型，规模较小的有序集合（sorted <br />sets）可以使用ziplist进行编码，而skiplist可以用于对任何大小的有序集合进行编码。<br />需要注意的是：你一旦执行了一种使得Redis无法保持能够节约存储空间的编码方式的操作后，所有特殊编码的类型将会被自动转换为普通类型。<br />返回值：对于不同的子命令将会有不同的返回值。<br />（1）对于refcount和idletime子命令，返回值为整型（integers）。<br />（2）对于encoding子命令将会返回一个块回复（bulk <br />reply）。<br />（3）如果你要查看的object已经丢失，那么将会返回一个null块。 </p><p><br />可以通过如下实例进行测试：lpush mylist &#8220;hello world&#8221; </p><p>&nbsp;</p><p>&nbsp;</p><p><br />通过上述测试可以了解到，Redis <br />2.2.6版本中对对象处于IDLE状态的时间统计的时间粒度为10秒。<br />该命令自2.2.3版本后可用。</p><p>8.PERSIST<br />语法：PERSIST <br />key<br />说明：移除与key相关联的超时时间。该操作的时间复杂度为O(1)。<br />返回值：如果超时时间被移除，那么返回者为1；如果该key不存在或者没有与之相关联的超时时间，那么返回值将为0.</p><p>&nbsp;</p><p>该命令自2.1.2版本后可用。</p><p>9.RANDOMKEY<br />语法：RANDOMKEY<br />说明：从当前选择的数据库中返回一个随机的key。该操作的时间复杂度为O(1)。<br />返回值：返回随机key；如果数据库为空时，那么将返回nil。 </p><p>&nbsp;</p><p>该命令的实例如下所示：</p><p><br />&nbsp;<br />该命令自0.0.7版本后可用。 </p><p>&nbsp;</p><p>10.RENAME<br />语法：RENAME key <br />newkey<br />说明：将指定的key命名为newkey。该操作的时间复杂度为O(1)。当源和目标的名称相同或指定的key不存在时，将会返回一个错误。如果newkey已经存在时，它将会被重写。<br />返回值：返回Redis定义的状态码。<br />该命令自0.0.7版本后可用。</p><p>11.RENAMENX<br />语法：RENAMENX <br />key <br />newkey<br />说明：在newkey不存在的情况下将key命名为newkey。如果源和目标的名称相同或者指定的key不存在时返回一个错误。该操作的时间复杂度为O(1)。 </p><p>&nbsp;</p><p>返回值：如果key被命名为newkey，那么返回值为1；如果newkey已经存在，那么返回值为0。<br />该命令自0.0.7版本后可用。</p><p>12.SORT<br />语法：SORT <br />key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] <br />[ALPHA] [STORE destination]<br />说明：返回或按key存储包含在列表（list）、集合（set）或者有序集合（sorted <br />set）中的元素。该操作的时间复杂度为O(N+M*log(M))，此处N是将要排序的列表（list）或者集合（set）中元素的个数，而M为将要返回的元素个数。在元素未被排序时，复杂度在现阶段是O(N)。在下一个发行版本中，其中的拷贝这一步骤将会被避免。<br />在默认情况下，排序是数字型的，并且元素通过他们的值进行比较，值被解释为双精度浮点数。<br />假设mylist是一组数字的列表，最简单的SORT命令形式如下所示：<br />SORT <br />mylist </p><p><br />假设mylist中存储有1-10这些值，使用该命令会有如下的输出结果： </p><p>&nbsp;</p><p>&nbsp;</p><p>如果你希望使用降序顺序来排列元素，可以使用DESC修饰符，如下所示：<br />SORT mylist <br />DESC<br />当mylist中包含字符串并且你希望使用字母顺序进行排列时，可以使用ALPHA修饰符，如下所示：<br />SORT mylist <br />ALPHA </p><p><br />使用该命令后，会有以下输出结果： </p><p>&nbsp;</p><p><br />返回元素的个数可以通过LIMIT修饰符进行限制。使用该修饰符时需要指定起始元素的偏移值和将要返回的元素的总数。如下所示：<br />SORT mylist <br />LIMIT 0 <br />5<br />通过外部keys进行排序<br />有时候你希望通过使用外部keys作为权值而并非比较列表（list）、集合（set）或者有序集合（sorted <br />set）中的真实元素来进行排序。例如，假如<br />列表mylist中包含元素1、2和3，分别表示存储在object_1、object_2和object_3中对象的唯一ID。当这些对象具有存储在weight_1、weight_2和weight_3中的相关联的权值时，SORT可以使用这些权值来排序mylist。如下所示：<br />SORT <br />mylist BY <br />weight_*<br />BY选项选用了一个模式（本例中为weight_*）来生成用来排序的keys。这些keys的名称可以通过取代模式中的&#8220;*&#8221;符号来加以生成，用于取代&#8220;*&#8221;符号的值是mylist列表中能够首次匹配模式中的&#8220;*&#8221;符号的真实值（在本例中为1、2、和3）。</p><p>&nbsp;</p><p>假设在mylist列表中存有值1、2和3，object_1上存储有值object_1，object_2上存储有值object_2，object_3上存储有值object_3，weight_1上存储有值0.87，weight_2上存储有值3，weight_3上存储有值-6.4。如下所示：</p><p><br />&nbsp;</p><p><br />使用SORT mylist BY weight_*可以得到如下输出：</p><p>&nbsp;</p><p>&nbsp;</p><p>（1）跳过排序元素<br />可以给BY选项指定一个并不存在的key，这将会使得SORT命令跳过排序操作。这是一种在不进行排序的情况下取得外部keys的有效方式。如下所示：<br />SORT <br />mylist BY <br />nosort<br />（2）获取外部keys<br />在一些情况下，获取真正的对象而非它们的ID更为有用（object_1、object_2和object_3）。基于列表（list）、集合（set）或有序集合（sorted <br />set）中的元素获取外部keys可以通过使用如下命令来完成：<br />SORT mylist BY weight_* GET object_* </p><p>&nbsp;</p><p>在使用上述命令后，可以得到如下输出： </p><p>&nbsp;</p><p><br />GET选项可以被多次使用，从而对原有列表（list）、集合（set）或有序集合（sorted <br />set）中的每个元素取得更多的keys。同样，使用特殊的模式#，可以获取元素本身。如下所示：<br />SORT mylist BY weight_* GET <br />object_* GET # </p><p><br />使用上述命令后，可以得到如下输出： </p><p>&nbsp;</p><p><br />（3）存储排序操作的结果<br />在默认情况下，SORT向客户端返回排序后的元素。使用STORE选项，可以将结果存储在一个列表中，用户可以同时指定与列表相关联的key。如下所示：<br />SORT <br />mylist BY weight_* SRORE <br />resultkey<br />（4）在BY和GET选项中使用hashes<br />你可以对hash字段使用BY和GET选项，语法如下：<br />SORT mylist <br />BY weight_*-&gt;fieldname GET <br />object_*-&gt;fieldname<br />字符串&#8220;-&gt;&#8221;用来区分hash字段名称和key名称。<br />返回值：排序元素的列表。<br />该命令自0.0.7版本后可用。</p><p>13.TTL<br />语法：TTL <br />key<br />说明：如果指定的key有与之相关联的超时时间，那么将会返回该key还能存活的时间。该操作的时间复杂度为O(1)。这一自省能力使得Redis客户端能够查看一个指定的key还能够作为dataset的一部分存在多长时间。<br />返回值：以秒为单位的TTL（Time <br />To Live）；如果指定的key不存在或者没有与之相关联的超时时间，那么便会返回-1。<br />该命令自0.1000版本后可用。</p><p>14. <br />TYPE<br />语法： TYPE <br />key<br />说明：返回存储在指定key上的值所具有的数据类型的字符串描述。该操作的时间复杂度为O(1)。数据类型可以是：string、list、set、zset和hash。<br />返回值：存储在key上的值的数据类型，如果该key不存在，那么返回值为none。<br />该命令自0.0.7版本后可用。 </p><p>&nbsp;</p><img src ="http://www.blogjava.net/lyjjq/aggbug/381082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyjjq/" target="_blank">强强</a> 2012-06-19 11:29 <a href="http://www.blogjava.net/lyjjq/articles/381082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>