Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge branch 'unstable'

  • Loading branch information...
commit fc879abe4adb6c59ba6c280fa4e08ae291dd11eb 2 parents e4f6b8c + cf1eefa
@antirez antirez authored
Showing with 333 additions and 7,691 deletions.
  1. +0 −11 client-libraries/README
  2. +0 −48 doc/AppendCommand.html
  3. +0 −41 doc/AppendOnlyFileHowto.html
  4. +0 −39 doc/AuthCommand.html
  5. +0 −129 doc/Benchmarks.html
  6. +0 −41 doc/BgrewriteaofCommand.html
  7. +0 −39 doc/BgsaveCommand.html
  8. +0 −51 doc/BlpopCommand.html
  9. +0 −39 doc/BrpoplpushCommand.html
  10. +0 −47 doc/CommandReference.html
  11. +0 −42 doc/Comparisons.html
  12. +0 −76 doc/ConfigCommand.html
  13. +0 −38 doc/Configuration.html
  14. +0 −36 doc/ConnectionHandlingSidebar.html
  15. +0 −36 doc/ControlCommandsSidebar.html
  16. +0 −38 doc/Credits.html
  17. +0 −38 doc/DbsizeCommand.html
  18. +0 −41 doc/DelCommand.html
  19. +0 −37 doc/DesignPatterns.html
  20. +0 −44 doc/EventLibray.html
  21. +0 −42 doc/ExistsCommand.html
  22. +0 −96 doc/ExpireCommand.html
  23. +0 −70 doc/FAQ.html
  24. +0 −38 doc/Features.html
  25. +0 −39 doc/FlushallCommand.html
  26. +0 −39 doc/FlushdbCommand.html
  27. +0 −37 doc/FromSqlToDataStructures.html
  28. +0 −36 doc/GenericCommandsSidebar.html
  29. +0 −39 doc/GetCommand.html
  30. +0 −39 doc/GetbitCommand.html
  31. +0 −38 doc/GetsetCommand.html
  32. +0 −83 doc/HackingStrings.html
  33. +0 −36 doc/HashCommandsSidebar.html
  34. +0 −37 doc/Hashes.html
  35. +0 −39 doc/HdelCommand.html
  36. +0 −39 doc/HexistsCommand.html
  37. +0 −39 doc/HgetCommand.html
  38. +0 −40 doc/HgetallCommand.html
  39. +0 −45 doc/HincrbyCommand.html
  40. +0 −38 doc/HlenCommand.html
  41. +0 −40 doc/HmgetCommand.html
  42. +0 −40 doc/HmsetCommand.html
  43. +0 −40 doc/HsetCommand.html
  44. +0 −41 doc/HsetnxCommand.html
  45. +0 −43 doc/IncrCommand.html
  46. +0 −48 doc/InfoCommand.html
  47. +0 −152 doc/IntroductionToRedisDataTypes.html
  48. +0 −43 doc/KeysCommand.html
  49. +0 −39 doc/LastsaveCommand.html
  50. +0 −40 doc/LindexCommand.html
  51. +0 −36 doc/ListCommandsSidebar.html
  52. +0 −42 doc/Lists.html
  53. +0 −41 doc/LlenCommand.html
  54. +0 −41 doc/LpopCommand.html
  55. +0 −47 doc/LrangeCommand.html
  56. +0 −41 doc/LremCommand.html
  57. +0 −38 doc/LsetCommand.html
  58. +0 −47 doc/LtrimCommand.html
  59. +0 −52 doc/MgetCommand.html
  60. +0 −63 doc/MonitorCommand.html
  61. +0 −42 doc/MoveCommand.html
  62. +0 −44 doc/MsetCommand.html
  63. +0 −166 doc/MultiExecCommand.html
  64. +0 −51 doc/NonexistentCommands.html
  65. +0 −39 doc/ObjectHashMappers.html
  66. +0 −36 doc/Pipelining.html
  67. +0 −38 doc/ProgrammingExamples.html
  68. +0 −137 doc/ProtocolSpecification.html
  69. +0 −115 doc/PublishSubscribe.html
  70. +0 −68 doc/QuickStart.html
  71. +0 −38 doc/QuitCommand.html
  72. +0 −119 doc/README.html
  73. +0 −39 doc/RandomkeyCommand.html
  74. +0 −67 doc/Redis0100ChangeLog.html
  75. +0 −56 doc/Redis0900ChangeLog.html
  76. +0 −61 doc/RedisBigData.html
  77. +0 −37 doc/RedisCLI.html
  78. +0 −70 doc/RedisEventLibrary.html
  79. +0 −37 doc/RedisGuides.html
  80. +0 −38 doc/RedisInternals.html
  81. +0 −93 doc/RedisPipelining.html
  82. +0 −56 doc/RedisStatus.html
  83. +0 −40 doc/Redis_1_2_0_Changelog.html
  84. +0 −62 doc/Redis_2_0_0_Changelog.html
  85. +0 −59 doc/Redis_2_0_Whats_new.html
  86. +0 −39 doc/RenameCommand.html
  87. +0 −42 doc/RenamenxCommand.html
  88. +0 −43 doc/ReplicationHowto.html
  89. +0 −42 doc/ReplyTypes.html
  90. +0 −38 doc/RoadMap.html
  91. +0 −44 doc/RpoplpushCommand.html
  92. +0 −40 doc/RpushCommand.html
  93. +0 −41 doc/SaddCommand.html
  94. +0 −39 doc/SaveCommand.html
  95. +0 −41 doc/ScardCommand.html
  96. +0 −45 doc/SdiffCommand.html
  97. +0 −38 doc/SdiffstoreCommand.html
  98. +0 −39 doc/SelectCommand.html
  99. +0 −39 doc/SetCommand.html
  100. +0 −36 doc/SetCommandsSidebar.html
  101. +0 −45 doc/SetbitCommand.html
  102. +0 −42 doc/SetexCommand.html
  103. +0 −51 doc/SetnxCommand.html
  104. +0 −58 doc/SetrangeCommand.html
  105. +0 −36 doc/Sets.html
  106. +0 −39 doc/ShutdownCommand.html
  107. +0 −36 doc/SideBar.html
  108. +0 −40 doc/SinterCommand.html
  109. +0 −39 doc/SinterstoreCommand.html
  110. +0 −42 doc/SismemberCommand.html
  111. +0 −41 doc/SlaveofCommand.html
  112. +0 −38 doc/SmembersCommand.html
  113. +0 −44 doc/SmoveCommand.html
  114. +0 −75 doc/SortCommand.html
  115. +0 −36 doc/SortedSetCommandsSidebar.html
  116. +0 −36 doc/SortedSets.html
  117. +0 −38 doc/Speed.html
  118. +0 −38 doc/SponsorshipHistory.html
  119. +0 −40 doc/SpopCommand.html
  120. +0 −40 doc/SrandmemberCommand.html
  121. +0 −42 doc/SremCommand.html
  122. +0 −36 doc/StringCommandsSidebar.html
  123. +0 −37 doc/Strings.html
  124. +0 −39 doc/StrlenCommand.html
  125. +0 −52 doc/SubstrCommand.html
  126. +0 −40 doc/SunionCommand.html
  127. +0 −38 doc/SunionstoreCommand.html
  128. +0 −60 doc/SupportedLanguages.html
  129. +0 −37 doc/SupportedPlatforms.html
  130. +0 −38 doc/TemplateCommand.html
  131. +0 −38 doc/TtlCommand.html
  132. +0 −250 doc/TwitterAlikeExample.html
  133. +0 −46 doc/TypeCommand.html
  134. +0 −39 doc/UnstableSource.html
  135. +0 −156 doc/VirtualMemorySpecification.html
  136. +0 −66 doc/VirtualMemoryUserGuide.html
  137. +0 −43 doc/ZaddCommand.html
  138. +0 −41 doc/ZcardCommand.html
  139. +0 −42 doc/ZincrbyCommand.html
  140. +0 −42 doc/ZrangeCommand.html
  141. +0 −77 doc/ZrangebyscoreCommand.html
  142. +0 −43 doc/ZrankCommand.html
  143. +0 −42 doc/ZremCommand.html
  144. +0 −39 doc/ZremrangebyrankCommand.html
  145. +0 −39 doc/ZremrangebyscoreCommand.html
  146. +0 −41 doc/ZscoreCommand.html
  147. +0 −42 doc/ZunionCommand.html
  148. +0 −43 doc/ZunionstoreCommand.html
  149. +0 −43 doc/index.html
  150. BIN  doc/redis.png
  151. +0 −25 doc/style.css
  152. +4 −1 src/aof.c
  153. +3 −2 src/object.c
  154. +3 −0  src/rdb.c
  155. +43 −18 src/redis-cli.c
  156. +8 −4 src/redis.c
  157. +10 −6 src/redis.h
  158. +73 −73 src/replication.c
  159. +4 −1 src/t_set.c
  160. +129 −108 src/t_zset.c
  161. +7 −0 tests/test_helper.tcl
  162. +6 −0 tests/unit/type/set.tcl
  163. +43 −0 tests/unit/type/zset.tcl
View
11 client-libraries/README
@@ -1,11 +0,0 @@
-An updated list of client libraries for Redis can be found here:
-
- http://redis.io/clients
-
-All the links are in the front page.
-
-Most mainstream (and less mainstream) languages are supported.
-
-If you plan to write a new client library for a missing language, please
-get in touch with the other developers writing a message to the Redis google
-group that is located here: http://groups.google.com/group/redis-db
View
48 doc/AppendCommand.html
@@ -1,48 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>AppendCommand: Contents</b><br>&nbsp;&nbsp;<a href="#APPEND _key_ _value_">APPEND _key_ _value_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Examples">Examples</a>
- </div>
-
- <h1 class="wikiname">AppendCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="StringCommandsSidebar.html">StringCommandsSidebar</a><h1><a name="APPEND _key_ _value_">APPEND _key_ _value_</a></h1>
-<i>Time complexity: O(1). The amortized time complexity is O(1) assuming the appended value is small and the already present value is of any size, since the dynamic string library used by Redis will double the free space available on every reallocation.</i><blockquote>If the <i>key</i> already exists and is a string, this command appends theprovided value at the end of the string.If the <i>key</i> does not exist it is created and set as an empty string, soAPPEND will be very similar to SET in this special case.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Integer reply</a>, specifically the total length of the string after the append operation.<h2><a name="Examples">Examples</a></h2><pre class="codeblock python" name="code">
-redis&gt; exists mykey
-(integer) 0
-redis&gt; append mykey &quot;Hello &quot;
-(integer) 6
-redis&gt; append mykey &quot;World&quot;
-(integer) 11
-redis&gt; get mykey
-&quot;Hello World&quot;
-</pre>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
41 doc/AppendOnlyFileHowto.html
@@ -1,41 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>AppendOnlyFileHowto: Contents</b><br>&nbsp;&nbsp;<a href="#Append Only File HOWTO">Append Only File HOWTO</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#General Information">General Information</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Log rewriting">Log rewriting</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Wait... but how does this work?">Wait... but how does this work?</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#How durable is the append only file?">How durable is the append only file?</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#What should I do if my Append Only File gets corrupted?">What should I do if my Append Only File gets corrupted?</a>
- </div>
-
- <h1 class="wikiname">AppendOnlyFileHowto</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="RedisGuides.html">RedisGuides</a>
-<h1><a name="Append Only File HOWTO">Append Only File HOWTO</a></h1><h2><a name="General Information">General Information</a></h2>Append only file is an alternative durability option for Redis. What this mean? Let's start with some fact:<br/><br/><ul><li> For default Redis saves snapshots of the dataset on disk, in a binary file called dump.rdb (by default at least). For instance you can configure Redis to save the dataset every 60 seconds if there are at least 100 changes in the dataset, or every 1000 seconds if there is at least a single change in the dataset. This is known as &quot;Snapshotting&quot;.</li><li> Snapshotting is not very durable. If your computer running Redis stops, your power line fails, or you write killall -9 redis-server for a mistake, the latest data written on Redis will get lost. There are applications where this is not a big deal. There are applications where this is not acceptable and Redis <b>was</b> not an option for this applications.</li></ul>
-What is the solution? To use append only file as alternative to snapshotting. How it works?<br/><br/><ul><li> It is an 1.1 only feature.</li><li> You have to turn it on editing the configuration file. Just make sure you have &quot;appendonly yes&quot; somewhere.</li><li> Append only files work this way: every time Redis receive a command that changes the dataset (for instance a SET or LPUSH command) it appends this command in the append only file. When you restart Redis it will first <b>re-play</b> the append only file to rebuild the state.</li></ul>
-<h2><a name="Log rewriting">Log rewriting</a></h2>As you can guess... the append log file gets bigger and bigger, every time there is a new operation changing the dataset. Even if you set always the same key &quot;mykey&quot; to the values of &quot;1&quot;, &quot;2&quot;, &quot;3&quot;, ... up to 10000000000 in the end you'll have just a single key in the dataset, just a few bytes! but how big will be the append log file? Very very big.<br/><br/>So Redis supports an interesting feature: it is able to rebuild the append log file, in background, without to stop processing client commands. The key is the command <a href="BGREWRITEAOF.html">BGREWRITEAOF</a>. This command basically is able to use the dataset in memory in order to rewrite the shortest sequence of commands able to rebuild the exact dataset that is currently in memory.<br/><br/>So from time to time when the log gets too big, try this command. It's safe as if it fails you will not lost your old log (but you can make a backup copy given that currently 1.1 is still in beta!).<h2><a name="Wait... but how does this work?">Wait... but how does this work?</a></h2>Basically it uses the same fork() copy-on-write trick that snapshotting already uses. This is how the algorithm works:<br/><br/><ul><li> Redis forks, so now we have a child and a parent.</li><li> The child starts writing the new append log file in a temporary file.</li><li> The parent accumulates all the new changes in an in-memory buffer (but at the same time it writes the new changes in the <b>old</b> append only file, so if the rewriting fails, we are safe).</li><li> When the child finished to rewrite the file, the parent gets a signal, and append the in-memory buffer at the end of the file generated by the child.</li><li> Profit! Now Redis atomically renames the old file into the new one, and starts appending new data into the new file.</li></ul>
-<h2><a name="How durable is the append only file?">How durable is the append only file?</a></h2>Check redis.conf, you can configure how many times Redis will fsync() data on disk. There are three options:<br/><br/><ul><li> Fsync() every time a new command is appended to the append log file. Very very slow, very safe.</li><li> Fsync() one time every second. Fast enough, and you can lose 1 second of data if there is a disaster.</li><li> Never fsync(), just put your data in the hands of the Operating System. The faster and unsafer method.</li></ul>
-The suggested (and default) policy is &quot;everysec&quot;. It is both very fast and pretty safe. The &quot;always&quot; policy is very slow in practice, even if it was improved in Redis 2.0.0 there is no way to make fsync() faster than it is.<h2><a name="What should I do if my Append Only File gets corrupted?">What should I do if my Append Only File gets corrupted?</a></h2>It is possible that the server crashes while writing the AOF file (this still should never lead to inconsistencies) corrupting the file in a way that is no longer loadable by Redis. When this happens you can fix this problem using the following procedure:<br/><br/><ul><li> Make a backup copy of your AOF file.</li><li> Fix the original file with: ./redis-check-aof --fix <code name="code" class="python">&lt;filename&gt;</code></li><li> Optionally use diff -u to check what is the difference between two files.</li><li> Restart the server with the fixed file.</li></ul>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/AuthCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>AuthCommand: Contents</b><br>&nbsp;&nbsp;<a href="#AUTH _password_">AUTH _password_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">AuthCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="ConnectionHandlingSidebar.html">ConnectionHandlingSidebar</a><h1><a name="AUTH _password_">AUTH _password_</a></h1><blockquote>Request for authentication in a password protected Redis server.A Redis server can be instructed to require a password before to allow clientsto issue commands. This is done using the <i>requirepass</i> directive in theRedis configuration file.</blockquote>
-<blockquote>If the password given by the client is correct the server replies withan OK status code reply and starts accepting commands from the client.Otherwise an error is returned and the clients needs to try a new password.Note that for the high performance nature of Redis it is possible to trya lot of passwords in parallel in very short time, so make sure to generatea strong and very long password so that this attack is infeasible.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Status code reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
129 doc/Benchmarks.html
@@ -1,129 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>Benchmarks: Contents</b><br>&nbsp;&nbsp;<a href="#How Fast is Redis?">How Fast is Redis?</a><br>&nbsp;&nbsp;<a href="#Latency percentiles">Latency percentiles</a>
- </div>
-
- <h1 class="wikiname">Benchmarks</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- <h1><a name="How Fast is Redis?">How Fast is Redis?</a></h1>Redis includes the <code name="code" class="python">redis-benchmark</code> utility that simulates <a href="SETs.html">SETs</a>/GETs done by N clients at the same time sending M total queries (it is similar to the Apache's <code name="code" class="python">ab</code> utility). Below you'll find the full output of the benchmark executed against a Linux box.<br/><br/><ul><li> The test was done with 50 simultaneous clients performing 100000 requests.</li><li> The value SET and GET is a 256 bytes string.</li><li> The Linux box is running <b>Linux 2.6</b>, it's <b>Xeon X3320 2.5Ghz</b>.</li><li> Text executed using the loopback interface (127.0.0.1).</li></ul>
-Results: <b>about 110000 <a href="SETs.html">SETs</a> per second, about 81000 GETs per second.</b><h1><a name="Latency percentiles">Latency percentiles</a></h1><pre class="codeblock python" name="code">
-./redis-benchmark -n 100000
-
-====== SET ======
- 100007 requests completed in 0.88 seconds
- 50 parallel clients
- 3 bytes payload
- keep alive: 1
-
-58.50% &lt;= 0 milliseconds
-99.17% &lt;= 1 milliseconds
-99.58% &lt;= 2 milliseconds
-99.85% &lt;= 3 milliseconds
-99.90% &lt;= 6 milliseconds
-100.00% &lt;= 9 milliseconds
-114293.71 requests per second
-
-====== GET ======
- 100000 requests completed in 1.23 seconds
- 50 parallel clients
- 3 bytes payload
- keep alive: 1
-
-43.12% &lt;= 0 milliseconds
-96.82% &lt;= 1 milliseconds
-98.62% &lt;= 2 milliseconds
-100.00% &lt;= 3 milliseconds
-81234.77 requests per second
-
-====== INCR ======
- 100018 requests completed in 1.46 seconds
- 50 parallel clients
- 3 bytes payload
- keep alive: 1
-
-32.32% &lt;= 0 milliseconds
-96.67% &lt;= 1 milliseconds
-99.14% &lt;= 2 milliseconds
-99.83% &lt;= 3 milliseconds
-99.88% &lt;= 4 milliseconds
-99.89% &lt;= 5 milliseconds
-99.96% &lt;= 9 milliseconds
-100.00% &lt;= 18 milliseconds
-68458.59 requests per second
-
-====== LPUSH ======
- 100004 requests completed in 1.14 seconds
- 50 parallel clients
- 3 bytes payload
- keep alive: 1
-
-62.27% &lt;= 0 milliseconds
-99.74% &lt;= 1 milliseconds
-99.85% &lt;= 2 milliseconds
-99.86% &lt;= 3 milliseconds
-99.89% &lt;= 5 milliseconds
-99.93% &lt;= 7 milliseconds
-99.96% &lt;= 9 milliseconds
-100.00% &lt;= 22 milliseconds
-100.00% &lt;= 208 milliseconds
-88109.25 requests per second
-
-====== LPOP ======
- 100001 requests completed in 1.39 seconds
- 50 parallel clients
- 3 bytes payload
- keep alive: 1
-
-54.83% &lt;= 0 milliseconds
-97.34% &lt;= 1 milliseconds
-99.95% &lt;= 2 milliseconds
-99.96% &lt;= 3 milliseconds
-99.96% &lt;= 4 milliseconds
-100.00% &lt;= 9 milliseconds
-100.00% &lt;= 208 milliseconds
-71994.96 requests per second
-</pre>Notes: changing the payload from 256 to 1024 or 4096 bytes does not change the numbers significantly (but reply packets are glued together up to 1024 bytes so GETs may be slower with big payloads). The same for the number of clients, from 50 to 256 clients I got the same numbers. With only 10 clients it starts to get a bit slower.<br/><br/>You can expect different results from different boxes. For example a low profile box like <b>Intel core duo T5500 clocked at 1.66Ghz running Linux 2.6</b> will output the following:
-<pre class="codeblock python python" name="code">
- ./redis-benchmark -q -n 100000
-SET: 53684.38 requests per second
-GET: 45497.73 requests per second
-INCR: 39370.47 requests per second
-LPUSH: 34803.41 requests per second
-LPOP: 37367.20 requests per second
-</pre>Another one using a 64 bit box, a Xeon L5420 clocked at 2.5 Ghz:<br/><br/><pre class="codeblock python python python" name="code">
- ./redis-benchmark -q -n 100000
-PING: 111731.84 requests per second
-SET: 108114.59 requests per second
-GET: 98717.67 requests per second
-INCR: 95241.91 requests per second
-LPUSH: 104712.05 requests per second
-LPOP: 93722.59 requests per second
-</pre>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
41 doc/BgrewriteaofCommand.html
@@ -1,41 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>BgrewriteaofCommand: Contents</b><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#BGREWRITEAOF">BGREWRITEAOF</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">BgrewriteaofCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="ControlCommandsSidebar.html">ControlCommandsSidebar</a><h3><a name="BGREWRITEAOF">BGREWRITEAOF</a></h3>
-<blockquote>Please for detailed information about the Redis Append Only File check<a href="AppendOnlyFileHowto.html">the Append Only File Howto</a>.</blockquote>
-<blockquote>BGREWRITEAOF rewrites the Append Only File in background when it gets toobig. The Redis Append Only File is a Journal, so every operation modifyingthe dataset is logged in the Append Only File (and replayed at startup).This means that the Append Only File always grows. In order to rebuildits content the BGREWRITEAOF creates a new version of the append only filestarting directly form the dataset in memory in order to guarantee thegeneration of the minimal number of commands needed to rebuild the database.</blockquote>
-<blockquote>The <a href="AppendOnlyFileHowto.html">Append Only File Howto</a> contains further details.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Status code reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/BgsaveCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>BgsaveCommand: Contents</b><br>&nbsp;&nbsp;<a href="#BGSAVE">BGSAVE</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">BgsaveCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="ControlCommandsSidebar.html">ControlCommandsSidebar</a><h1><a name="BGSAVE">BGSAVE</a></h1>
-<blockquote>Save the DB in background. The OK code is immediately returned.Redis forks, the parent continues to server the clients, the childsaves the DB on disk then exit. A client my be able to check if theoperation succeeded using the <a href="LastsaveCommand.html">LASTSAVE</a> command.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Status code reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
51 doc/BlpopCommand.html
@@ -1,51 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>BlpopCommand: Contents</b><br>&nbsp;&nbsp;<a href="#BLPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;">BLPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;</a><br>&nbsp;&nbsp;<a href="#BRPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;">BRPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Non blocking behavior">Non blocking behavior</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Blocking behavior">Blocking behavior</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Multiple clients blocking for the same keys">Multiple clients blocking for the same keys</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#blocking POP inside a MULTI/EXEC transaction">blocking POP inside a MULTI/EXEC transaction</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">BlpopCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="ListCommandsSidebar.html">ListCommandsSidebar</a><h1><a name="BLPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;">BLPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;</a></h1> 1.3.1) =
-<h1><a name="BRPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;">BRPOP _key1_ _key2_ ... _keyN_ _timeout_ (Redis &gt;</a></h1> 1.3.1) =
-<i>Time complexity: O(1)</i><blockquote>BLPOP (and BRPOP) is a blocking list pop primitive. You can see this commandsas blocking versions of <a href="LpopCommand.html">LPOP</a> and <a href="LpopCommand.html">RPOP</a> able toblock if the specified keys don't exist or contain empty lists.</blockquote>
-<blockquote>The following is a description of the exact semantic. We describe BLPOP butthe two commands are identical, the only difference is that BLPOP pops theelement from the left (head) of the list, and BRPOP pops from the right (tail).</blockquote>
-<h2><a name="Non blocking behavior">Non blocking behavior</a></h2><blockquote>When BLPOP is called, if at least one of the specified keys contain a nonempty list, an element is popped from the head of the list and returned tothe caller together with the name of the key (BLPOP returns a two elementsarray, the first element is the key, the second the popped value).</blockquote>
-<blockquote>Keys are scanned from left to right, so for instance if youissue <b>BLPOP list1 list2 list3 0</b> against a dataset where <b>list1</b> does notexist but <b>list2</b> and <b>list3</b> contain non empty lists, BLPOP guaranteesto return an element from the list stored at <b>list2</b> (since it is the firstnon empty list starting from the left).</blockquote>
-<h2><a name="Blocking behavior">Blocking behavior</a></h2><blockquote>If none of the specified keys exist or contain non empty lists, BLPOPblocks until some other client performs a <a href="RpushCommand.html">LPUSH</a> oran <a href="RpushCommand.html">RPUSH</a> operation against one of the lists.</blockquote>
-<blockquote>Once new data is present on one of the lists, the client finally returnswith the name of the key unblocking it and the popped value.</blockquote>
-<blockquote>When blocking, if a non-zero timeout is specified, the client will unblockreturning a nil special value if the specified amount of seconds passedwithout a push operation against at least one of the specified keys.</blockquote>
-<blockquote>The timeout argument is interpreted as an integer value. A timeout of zero means instead to block forever.</blockquote>
-<h2><a name="Multiple clients blocking for the same keys">Multiple clients blocking for the same keys</a></h2><blockquote>Multiple clients can block for the same key. They are put intoa queue, so the first to be served will be the one that started to waitearlier, in a first-blpopping first-served fashion.</blockquote>
-<h2><a name="blocking POP inside a MULTI/EXEC transaction">blocking POP inside a MULTI/EXEC transaction</a></h2><blockquote>BLPOP and BRPOP can be used with pipelining (sending multiple commands and reading the replies in batch), but it does not make sense to use BLPOP or BRPOP inside a MULTI/EXEC block (a Redis transaction).</blockquote>
-<blockquote>The behavior of BLPOP inside MULTI/EXEC when the list is empty is to return a multi-bulk nil reply, exactly what happens when the timeout is reached. If you like science fiction, think at it like if inside MULTI/EXEC the time will flow at infinite speed :) </blockquote>
-<h2><a name="Return value">Return value</a></h2><blockquote>BLPOP returns a two-elements array via a multi bulk reply in order to returnboth the unblocking key and the popped value.</blockquote>
-<blockquote>When a non-zero timeout is specified, and the BLPOP operation timed out,the return value is a nil multi bulk reply. Most client values will returnfalse or nil accordingly to the programming language used.</blockquote>
-<a href="ReplyTypes.html">Multi bulk reply</a>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/BrpoplpushCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>BrpoplpushCommand: Contents</b><br>&nbsp;&nbsp;<a href="#BRPOPLPUSH _srckey_ _dstkey_ _timeout_ (Redis &gt;">BRPOPLPUSH _srckey_ _dstkey_ _timeout_ (Redis &gt;</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">BrpoplpushCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
-
-<h1><a name="BRPOPLPUSH _srckey_ _dstkey_ _timeout_ (Redis &gt;">BRPOPLPUSH _srckey_ _dstkey_ _timeout_ (Redis &gt;</a></h1> 2.1.8) =
-<i>Time complexity: O(1)</i><blockquote>Blocking version of the <a href="RpoplpushCommand.html">RPOPLPUSH</a> command. Atomically removes and returnsthe last element (tail) of the source list at <i>srckey</i>, and as a side effect pushes the returned element in the head of the list at <i>dstkey</i>.</blockquote>
-If the source list is empty, the client blocks until another client pushes against the source list. Of course in such a case the push operation against the destination list will be performed after the command unblocks detecting a push against the source list.<br/><br/>Note that the command returns an error if the target key already exists but is not a list. The error is delayed at the time the push operation is attempted, that is, immediately if the source list is not empty, or when the first push against the source list happens in the case the command would block.<br/><br/>The timeout value can be 0 or a positive integer value. When it is zero the command will block forever, until something is pushed against <i>srckey</i>. Otherwise the command will wait the specified number of seconds at max, returning an nil value when the timeout expires.<br/><br/>The source and destination of the list can be the same, having the effect of rotating the list. Please check <a href="RpoplpushCommand.html">RPOPLPUSH</a> for more information.<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Bulk reply</a>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
47 doc/CommandReference.html
@@ -1,47 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>CommandReference: Contents</b><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Categorized Command List">Categorized Command List</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Connection handling">Connection handling</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Commands operating on all value types">Commands operating on all value types</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Commands operating on string values">Commands operating on string values</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Commands operating on lists">Commands operating on lists</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Commands operating on sets">Commands operating on sets</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Commands operating on sorted zsets (sorted sets)">Commands operating on sorted zsets (sorted sets)</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Commands operating on hashes">Commands operating on hashes</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Sorting">Sorting</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Transactions">Transactions</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Publish/Subscribe">Publish/Subscribe</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Persistence control commands">Persistence control commands</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Remote server control commands">Remote server control commands</a>
- </div>
-
- <h1 class="wikiname">CommandReference</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;= Redis Command Reference =<br/><br/>Every command name links to a specific wiki page describing the behavior of the command.<h2><a name="Categorized Command List">Categorized Command List</a></h2><h2><a name="Connection handling">Connection handling</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="QuitCommand.html">QUIT</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> close the connection </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="AuthCommand.html">AUTH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>password</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> simple password authentication if enabled </td></tr></table>
-<h2><a name="Commands operating on all value types">Commands operating on all value types</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ExistsCommand.html">EXISTS</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> test if a key exists </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="DelCommand.html">DEL</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> delete a key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="TypeCommand.html">TYPE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> return the type of the value stored at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="KeysCommand.html">KEYS</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>pattern</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> return all the keys matching a given pattern </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="RandomkeyCommand.html">RANDOMKEY</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> return a random key from the key space </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="RenameCommand.html">RENAME</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>oldname</i> <i>newname</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> rename the old key in the new one, destroying the newname key if it already exists </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="RenamenxCommand.html">RENAMENX</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>oldname</i> <i>newname</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> rename the <i>oldname</i> key to <i>newname</i>, if the <i>newname</i> key does not already exist </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="DbsizeCommand.html">DBSIZE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> return the number of keys in the current db </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ExpireCommand.html">EXPIRE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> set a time to live in seconds on a key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ExpireCommand.html">PERSIST</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> remove the expire from a key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="TtlCommand.html">TTL</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> get the time to live in seconds of a key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SelectCommand.html">SELECT</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>index</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Select the DB with the specified index </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="MoveCommand.html">MOVE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>dbindex</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Move the key from the currently selected DB to the <i>dbindex</i> DB </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="FlushdbCommand.html">FLUSHDB</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove all the keys from the currently selected DB </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="FlushallCommand.html">FLUSHALL</a></td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove all the keys from all the databases </td></tr></table>
-<h2><a name="Commands operating on string values">Commands operating on string values</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SetCommand.html">SET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set a <i>key</i> to a string <i>value</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="GetCommand.html">GET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the string value of the <i>key</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="GetsetCommand.html">GETSET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set a key to a string returning the old value of the key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SetnxCommand.html">SETNX</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set a key to a string value if the key does not exist </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SetexCommand.html">SETEX</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>time</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set+Expire combo command </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SetbitCommand.html">SETBIT</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>offset</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set bit at <i>offset</i> to <i>value</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="GetbitCommand.html">GETBIT</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>offset</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return bit value at <i>offset</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="MsetCommand.html">MSET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>value1</i> <i>key2</i> <i>value2</i> ... <i>keyN</i> <i>valueN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set multiple keys to multiple values in a single atomic operation </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="MsetCommand.html">MSETNX</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>value1</i> <i>key2</i> <i>value2</i> ... <i>keyN</i> <i>valueN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set multiple keys to multiple values in a single atomic operation if none of the keys already exist </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="MgetCommand.html">MGET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Multi-get, return the strings values of the keys </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="IncrCommand.html">INCR</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Increment the integer value of key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="IncrCommand.html">INCRBY</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>integer</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Increment the integer value of <i>key</i> by <i>integer</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="IncrCommand.html">DECR</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Decrement the integer value of key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="IncrCommand.html">DECRBY</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>integer</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Decrement the integer value of <i>key</i> by <i>integer</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="AppendCommand.html">APPEND</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Append the specified string to the string stored at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SubstrCommand.html">SUBSTR</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>start</i> <i>end</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return a substring of a larger string </td></tr></table>
-<h2><a name="Commands operating on lists">Commands operating on lists</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="RpushCommand.html">RPUSH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Append an element to the tail of the List value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="RpushCommand.html">LPUSH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Append an element to the head of the List value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LlenCommand.html">LLEN</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the length of the List value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LrangeCommand.html">LRANGE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>start</i> <i>end</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return a range of elements from the List at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LtrimCommand.html">LTRIM</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>start</i> <i>end</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Trim the list at key to the specified range of elements </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LindexCommand.html">LINDEX</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>index</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the element at index position from the List at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LsetCommand.html">LSET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>index</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set a new value as the element at index position of the List at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LremCommand.html">LREM</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>count</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove the first-N, last-N, or all the elements matching value from the List at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LpopCommand.html">LPOP</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return and remove (atomically) the first element of the List at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LpopCommand.html">RPOP</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return and remove (atomically) the last element of the List at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="BlpopCommand.html">BLPOP</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>key2</i> ... <i>keyN</i> <i>timeout</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Blocking LPOP </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="BlpopCommand.html">BRPOP</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>key2</i> ... <i>keyN</i> <i>timeout</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Blocking RPOP </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="RpoplpushCommand.html">RPOPLPUSH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>srckey</i> <i>dstkey</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return and remove (atomically) the last element of the source List stored at <i>srckey</i> and push the same element to the destination List stored at <i>dstkey</i> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="BrpoplpushCommand.html">BRPOPLPUSH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>srckey</i> <i>dstkey</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Like RPOPLPUSH but blocking of source key is empty </td></tr></table>
-<h2><a name="Commands operating on sets">Commands operating on sets</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SaddCommand.html">SADD</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Add the specified member to the Set value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SremCommand.html">SREM</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove the specified member from the Set value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SpopCommand.html">SPOP</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove and return (pop) a random element from the Set value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SmoveCommand.html">SMOVE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>srckey</i> <i>dstkey</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Move the specified member from one Set to another atomically </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ScardCommand.html">SCARD</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the number of elements (the cardinality) of the Set at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SismemberCommand.html">SISMEMBER</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Test if the specified value is a member of the Set at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SinterCommand.html">SINTER</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the intersection between the Sets stored at key1, key2, ..., keyN </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SinterstoreCommand.html">SINTERSTORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>dstkey</i> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Compute the intersection between the Sets stored at key1, key2, ..., keyN, and store the resulting Set at dstkey </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SunionCommand.html">SUNION</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the union between the Sets stored at key1, key2, ..., keyN </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SunionstoreCommand.html">SUNIONSTORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>dstkey</i> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Compute the union between the Sets stored at key1, key2, ..., keyN, and store the resulting Set at dstkey </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SdiffCommand.html">SDIFF</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the difference between the Set stored at key1 and all the Sets key2, ..., keyN </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SdiffstoreCommand.html">SDIFFSTORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>dstkey</i> <i>key1</i> <i>key2</i> ... <i>keyN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Compute the difference between the Set key1 and all the Sets key2, ..., keyN, and store the resulting Set at dstkey </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SmembersCommand.html">SMEMBERS</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return all the members of the Set value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SrandmemberCommand.html">SRANDMEMBER</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return a random member of the Set value at key </td></tr></table>
-<h2><a name="Commands operating on sorted zsets (sorted sets)">Commands operating on sorted zsets (sorted sets)</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZaddCommand.html">ZADD</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>score</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Add the specified member to the Sorted Set value at key or update the score if it already exist </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZremCommand.html">ZREM</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove the specified member from the Sorted Set value at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZincrbyCommand.html">ZINCRBY</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>increment</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> If the member already exists increment its score by <i>increment</i>, otherwise add the member setting <i>increment</i> as score </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZrankCommand.html">ZRANK</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the rank (or index) or <i>member</i> in the sorted set at <i>key</i>, with scores being ordered from low to high </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZrankCommand.html">ZREVRANK</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>member</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the rank (or index) or <i>member</i> in the sorted set at <i>key</i>, with scores being ordered from high to low </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZrangeCommand.html">ZRANGE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>start</i> <i>end</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return a range of elements from the sorted set at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZrangeCommand.html">ZREVRANGE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>start</i> <i>end</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return a range of elements from the sorted set at key, exactly like ZRANGE, but the sorted set is ordered in traversed in reverse order, from the greatest to the smallest score </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZrangebyscoreCommand.html">ZRANGEBYSCORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>min</i> <i>max</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return all the elements with score &gt;= min and score &lt;= max (a range query) from the sorted set </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZrangebyscoreCommand.html">ZCOUNT</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>min</i> <i>max</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the number of elements with score &gt;= min and score &lt;= max in the sorted set </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZcardCommand.html">ZCARD</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the cardinality (number of elements) of the sorted set at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZscoreCommand.html">ZSCORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>element</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the score associated with the specified element of the sorted set at key </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZremrangebyrankCommand.html">ZREMRANGEBYRANK</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>min</i> <i>max</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove all the elements with rank &gt;= min and rank &lt;= max from the sorted set </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZremrangebyscoreCommand.html">ZREMRANGEBYSCORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>min</i> <i>max</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove all the elements with score &gt;= min and score &lt;= max from the sorted set </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ZunionstoreCommand.html">ZUNIONSTORE / ZINTERSTORE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>dstkey</i> <i>N</i> <i>key1</i> ... <i>keyN</i> WEIGHTS <i>w1</i> ... <i>wN</i> AGGREGATE SUM|MIN|MAX </td><td style="border: 1px solid #aaa; padding: 5px;"> Perform a union or intersection over a number of sorted sets with optional weight and aggregate </td></tr></table>
-<h2><a name="Commands operating on hashes">Commands operating on hashes</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HsetCommand.html">HSET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field</i> <i>value</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set the hash field to the specified value. Creates the hash if needed. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HgetCommand.html">HGET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Retrieve the value of the specified hash field. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HmgetCommand.html">HMGET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field1</i> ... <i>fieldN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Get the hash values associated to the specified fields. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HmsetCommand.html">HMSET</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field1</i> <i>value1</i> ... <i>fieldN</i> <i>valueN</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Set the hash fields to their respective values. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HincrbyCommand.html">HINCRBY</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field</i> <i>integer</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Increment the integer value of the hash at <i>key</i> on <i>field</i> with <i>integer</i>. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HexistsCommand.html">HEXISTS</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Test for existence of a specified field in a hash </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HdelCommand.html">HDEL</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> <i>field</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Remove the specified field from a hash </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HlenCommand.html">HLEN</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the number of items in a hash. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HgetallCommand.html">HKEYS</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return all the fields in a hash. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HgetallCommand.html">HVALS</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return all the values in a hash. </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="HgetallCommand.html">HGETALL</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> </td><td style="border: 1px solid #aaa; padding: 5px;"> Return all the fields and associated values in a hash. </td></tr></table>
-<h2><a name="Sorting">Sorting</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SortCommand.html">SORT</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> <i>key</i> BY <i>pattern</i> LIMIT <i>start</i> <i>end</i> GET <i>pattern</i> ASC|DESC ALPHA </td><td style="border: 1px solid #aaa; padding: 5px;"> Sort a Set or a List accordingly to the specified parameters </td></tr></table>
-<h2><a name="Transactions">Transactions</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="MultiExecCommand.html">MULTI/EXEC/DISCARD/WATCH/UNWATCH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Redis atomic transactions </td></tr></table>
-<h2><a name="Publish/Subscribe">Publish/Subscribe</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="PublishSubscribe.html">SUBSCRIBE/UNSUBSCRIBE/PUBLISH</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Redis Public/Subscribe messaging paradigm implementation </td></tr></table>
-<h2><a name="Persistence control commands">Persistence control commands</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SaveCommand.html">SAVE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Synchronously save the DB on disk </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="BgsaveCommand.html">BGSAVE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Asynchronously save the DB on disk </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="LastsaveCommand.html">LASTSAVE</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Return the UNIX time stamp of the last successfully saving of the dataset on disk </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ShutdownCommand.html">SHUTDOWN</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Synchronously save the DB on disk, then shutdown the server </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="BgrewriteaofCommand.html">BGREWRITEAOF</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Rewrite the append only file in background when it gets too big </td></tr></table>
-<h2><a name="Remote server control commands">Remote server control commands</a></h2><table><tr><td style="border: 1px solid #aaa; padding: 5px;"> <b>Command</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Parameters</b> </td><td style="border: 1px solid #aaa; padding: 5px;"> <b>Description</b> </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="InfoCommand.html">INFO</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Provide information and statistics about the server </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="MonitorCommand.html">MONITOR</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Dump all the received requests in real time </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="SlaveofCommand.html">SLAVEOF</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Change the replication settings </td></tr><tr><td style="border: 1px solid #aaa; padding: 5px;"> <a href="ConfigCommand.html">CONFIG</a> </td><td style="border: 1px solid #aaa; padding: 5px;"> - </td><td style="border: 1px solid #aaa; padding: 5px;"> Configure a Redis server at runtime </td></tr></table>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
42 doc/Comparisons.html
@@ -1,42 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>Comparisons: Contents</b><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Memcached">Memcached</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Tokyo Cabinet / Toyo Tyrant">Tokyo Cabinet / Toyo Tyrant</a>
- </div>
-
- <h1 class="wikiname">Comparisons</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;if your are asking yourself how is Redis different fom other key-value stores here you will find it compared to some of the most popular contendors (all great software) in this category. <h2><a name="Memcached">Memcached</a></h2><ul><li> Memcached is not persistent, it just holds everything in memory without saving since its main goal is to be used as a cache, while Redis is <a href="Persistence.html">persistent</a>.</li></ul>
-<ul><li> Like memcached Redis uses a key-value model, but while keys can just be strings, values in Redis can be <a href="Lists.html">Lists</a>, <a href="Sets.html">Sets</a> or <a href="SortedSets.html">SortedSets</a> and complex operations like intersections, set/get n-th element of lists, pop/push of elements, can be performed against sets and lists.</li></ul>
-<h2><a name="Tokyo Cabinet / Toyo Tyrant">Tokyo Cabinet / Toyo Tyrant</a></h2>Redis and Tokyo Cabinet can be used for the same applications, but actually they are <i>very different</i> beasts. If you read Twitter messages of people involved in scalable things both products are reported to work well, but surely there are times where one or the other can be the best choice.<br/><br/><ul><li> Tokyo Cabinet writes synchronously on disk, Redis takes the whole dataset on memory and writes on disk asynchronously. Tokyo Cabinet is safer and probably a better idea if your dataset is going to be bigger than RAM, but Redis is faster (note that Redis supports master-slave replication that is trivial to setup, so you are safe anyway if you want a setup where data can't be lost even after a disaster). </li></ul>
-<ul><li> Redis supports higher level operations and data structures. Tokyo Cabinet supports a kind of database that is able to organize data into rows with named fields (in a way very similar to Berkeley DB) but can't do things like server side List and Set operations Redis is able to do: pushing or popping from Lists in an atomic way, in O(1) time complexity, server side Set intersections, Sorting of schema free data in complex ways (By the way TC supports sorting in the table-based database format). Redis on the other hand does not support the abstraction of tables with fields, the idea is that you can build this stuff in software easily if you really need a table-alike approach. </li></ul>
-<ul><li> Tokyo Cabinet does not implement a networking layer. You have to use a networking layer called Tokyo Tyrant that interfaces to Tokyo Cabinet so you can talk to Tokyo Cabinet in a client-server fashion. In Redis the networking support is built-in inside the server, and is basically the only interface between the external world and the dataset. </li></ul>
-<ul><li> Redis is reported to be much faster, especially if you plan to access Tokyo Cabinet via Tokyo Tyrant. Here I can only say that with Redis you can expect 100,000 operations/seconds with a normal Linux box and 50 concurrent clients. You should test Redis, Tokyo, and the other alternatives with your specific work load to get a feeling about performances for your application. </li></ul>
-<ul><li> Redis is not an on-disk DB engine like Tokyo: the latter can be used as a fast DB engine in your C project without the networking overhead just linking to the library. Still in many scalable applications you need multiple servers talking with multiple clients, so the client-server model is almost always needed, this is why in Redis this is built-in. </li></ul>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
76 doc/ConfigCommand.html
@@ -1,76 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>ConfigCommand: Contents</b><br>&nbsp;&nbsp;<a href="#CONFIG GET _pattern_ (Redis &gt;">CONFIG GET _pattern_ (Redis &gt;</a><br>&nbsp;&nbsp;<a href="#CONFIG SET _parameter_ _value_ (Redis &gt;">CONFIG SET _parameter_ _value_ (Redis &gt;</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#CONFIG GET _pattern_">CONFIG GET _pattern_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#CONFIG SET _parameter_ _value_">CONFIG SET _parameter_ _value_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Parameters value format">Parameters value format</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#See Also">See Also</a>
- </div>
-
- <h1 class="wikiname">ConfigCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="ControlCommandsSidebar.html">ControlCommandsSidebar</a><h1><a name="CONFIG GET _pattern_ (Redis &gt;">CONFIG GET _pattern_ (Redis &gt;</a></h1> 2.0)=
-<h1><a name="CONFIG SET _parameter_ _value_ (Redis &gt;">CONFIG SET _parameter_ _value_ (Redis &gt;</a></h1> 2.0)=<br/><br/><blockquote>The CONFIG command is able to retrieve or alter the configuration of a runningRedis server. Not all the configuration parameters are supported.</blockquote>
-<blockquote>CONFIG has two sub commands, GET and SET. The GET command is used to readthe configuration, while the SET command is used to alter the configuration.</blockquote>
-<h2><a name="CONFIG GET _pattern_">CONFIG GET _pattern_</a></h2><blockquote>CONFIG GET returns the current configuration parameters. This sub commandonly accepts a single argument, that is glob style pattern. All theconfiguration parameters matching this parameter are reported as alist of key-value pairs. Example:</blockquote><pre class="codeblock python" name="code">
-$ redis-cli config get '*'
-1. &quot;dbfilename&quot;
-2. &quot;dump.rdb&quot;
-3. &quot;requirepass&quot;
-4. (nil)
-5. &quot;masterauth&quot;
-6. (nil)
-7. &quot;maxmemory&quot;
-8. &quot;0\n&quot;
-9. &quot;appendfsync&quot;
-10. &quot;everysec&quot;
-11. &quot;save&quot;
-12. &quot;3600 1 300 100 60 10000&quot;
-
-$ redis-cli config get 'm*'
-1. &quot;masterauth&quot;
-2. (nil)
-3. &quot;maxmemory&quot;
-4. &quot;0\n&quot;
-</pre>The return type of the command is a <a href="ReplyTypes.html">bulk reply</a>.<h2><a name="CONFIG SET _parameter_ _value_">CONFIG SET _parameter_ _value_</a></h2><blockquote>CONFIG SET is used in order to reconfigure the server, setting a specificconfiguration parameter to a new value.</blockquote>
-<blockquote>The list of configuration parameters supported by CONFIG SET can beobtained issuing a <code name="code" class="python">CONFIG GET *</code> command.</blockquote>
-<blockquote>The configuration set using CONFIG SET is immediately loaded by the Redisserver that will start acting as specified starting from the next command.</blockquote>
-<blockquote>Example:</blockquote><pre class="codeblock python python" name="code">
-$ ./redis-cli
-redis&gt; set x 10
-OK
-redis&gt; config set maxmemory 200
-OK
-redis&gt; set y 20
-(error) ERR command not allowed when used memory &gt; 'maxmemory'
-redis&gt; config set maxmemory 0
-OK
-redis&gt; set y 20
-OK
-</pre><h2><a name="Parameters value format">Parameters value format</a></h2><blockquote>The value of the configuration parameter is the same as the one of thesame parameter in the Redis configuration file, with the following exceptions:</blockquote>
-<ul><li> The <code name="code" class="python">save</code> paramter is a list of space-separated integers. Every pair of integers specify the time and number of changes limit to trigger a save. For instance the command <code name="code" class="python">CONFIG SET save &quot;3600 10 60 10000&quot;</code> will configure the server to issue a background saving of the RDB file every 3600 seconds if there are at least 10 changes in the dataset, and every 60 seconds if there are at least 10000 changes. To completely disable automatic snapshots just set the parameter as an empty string.</li><li> All the integer parameters representing memory are returned and accepted only using bytes as unit.</li></ul>
-<h2><a name="See Also">See Also</a></h2>The <a href="InfoCommand.html">INFO</a> command can be used in order to read configuriaton parameters that are not available in the CONFIG command.
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
38 doc/Configuration.html
@@ -1,38 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>Configuration: Contents</b>
- </div>
-
- <h1 class="wikiname">Configuration</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- The <code name="code" class="python">redis.conf</code> file included in the source code distribution is a starting point, you should be able to modify it in order do adapt it to your needs without troubles reading the comments inside the file.<br/><br/>In order to start Redis using a configuration file just pass the file name as the sole argument when starting the server:<br/><br/><pre class="codeblock python" name="code">
-$ ./redis-server redis.conf
-</pre>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
36 doc/ConnectionHandlingSidebar.html
@@ -1,36 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>ConnectionHandlingSidebar: Contents</b>
- </div>
-
- <h1 class="wikiname">ConnectionHandlingSidebar</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;== Connection handling ==<br/><br/><ul><li> <a href="QuitCommand.html">QUIT</a></li><li> <a href="AuthCommand.html">AUTH</a></li></ul>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
36 doc/ControlCommandsSidebar.html
@@ -1,36 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>ControlCommandsSidebar: Contents</b>
- </div>
-
- <h1 class="wikiname">ControlCommandsSidebar</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;== Control Commands ==<br/><br/><ul><li> <a href="SaveCommand.html">SAVE</a></li><li> <a href="BgsaveCommand.html">BGSAVE</a></li><li> <a href="BgrewriteaofCommand.html">BGREWRITEAOF</a></li><li> <a href="LastsaveCommand.html">LASTSAVE</a></li><li> <a href="ShutdownCommand.html">SHUTDOWN</a></li><li> <a href="InfoCommand.html">INFO</a></li><li> <a href="MonitorCommand.html">MONITOR</a></li><li> <a href="SlaveofCommand.html">SLAVEOF</a></li></ul>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
38 doc/Credits.html
@@ -1,38 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>Credits: Contents</b><br>&nbsp;&nbsp;<a href="#Credits">Credits</a>
- </div>
-
- <h1 class="wikiname">Credits</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- <h1><a name="Credits">Credits</a></h1><ul><li> The Redis server was designed and written by <a href="http://invece.org" target="_blank">Salvatore Sanfilippo (aka antirez)</a></li><li> <a href="http://brainspl.at/" target="_blank">Ezra Zygmuntowicz (aka ezmobius)</a> - Ruby client lib initial version and hacking</li><li> <a href="http://qix.it" target="_blank">Ludovico Magnocavallo (aka ludo)</a> - Python clinet lib</li><li> <a href="http://www.adroll.com/" target="_blank">Valentino Volonghi of Adroll</a> - Erlang client lib</li><li> <b>brettbender</b> - found and fixed a bug in sds.c that caused the server to crash at least on 64 bit systems, and anyway to be buggy since we used the same vararg thing against vsprintf without to call va_start and va_end every time.</li><li> <a href="http://www.rot13.org/~dpavlin" target="_blank">Dobrica Pavlinusic</a> - Perl client lib</li><li> Brian Hammond - AUTH command implementation, C++ client lib</li><li> <a href="http://www.clorophilla.net/" target="_blank">Daniele Alessandri</a> - Lua client lib</li><li> Corey Stup - C99 cleanups</li><li> Taylor Weibley - Ruby client improvements</li><li> Bob Potter - Rearrange redisObject struct to reduce memory usage in 64bit environments</li><li> Luca Guidi and Brian McKinney - Ruby client improvements</li><li> Aman Gupta - SDIFF / SDIFFSTORE, other Set operations improvements, ability to disable clients timeout.</li><li> Diego Rosario Brogna - Code and ideas about dumping backtrace on sigsegv and similar error conditions.</li></ul>
-p.s. sorry to take this file in sync is hard in this early days. Please drop me an email if I forgot to add your name here!
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
38 doc/DbsizeCommand.html
@@ -1,38 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>DbsizeCommand: Contents</b><br>&nbsp;&nbsp;<a href="#DBSIZE">DBSIZE</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">DbsizeCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="GenericCommandsSidebar.html">GenericCommandsSidebar</a><h1><a name="DBSIZE">DBSIZE</a></h1><blockquote>Return the number of keys in the currently selected database.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Integer reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
41 doc/DelCommand.html
@@ -1,41 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>DelCommand: Contents</b><br>&nbsp;&nbsp;<a href="#DEL _key1_ _key2_ ... _keyN_">DEL _key1_ _key2_ ... _keyN_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">DelCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="GenericCommandsSidebar.html">GenericCommandsSidebar</a><h1><a name="DEL _key1_ _key2_ ... _keyN_">DEL _key1_ _key2_ ... _keyN_</a></h1>
-<i>Time complexity: O(1)</i><blockquote>Remove the specified keys. If a given key does not existno operation is performed for this key. The command returns the number ofkeys removed.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Integer reply</a>, specifically:<br/><br/><pre class="codeblock python" name="code">
-an integer greater than 0 if one or more keys were removed
-0 if none of the specified key existed
-</pre>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
37 doc/DesignPatterns.html
@@ -1,37 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>DesignPatterns: Contents</b>
- </div>
-
- <h1 class="wikiname">DesignPatterns</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- Use random keys instead of incremental keys in order to avoid a single-key that gets incremented by many servers. This can can't be distributed among servers.
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
44 doc/EventLibray.html
@@ -1,44 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>EventLibray: Contents</b><br>&nbsp;&nbsp;<a href="#Event Library">Event Library</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Why is an Event Library needed at all?">Why is an Event Library needed at all?</a>
- </div>
-
- <h1 class="wikiname">EventLibray</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
-
-<h1><a name="Event Library">Event Library</a></h1><h2><a name="Why is an Event Library needed at all?">Why is an Event Library needed at all?</a></h2>Let us figure it out through a series of Q&amp;As.<br/><br/>Q: What do you expect a network server to be doing all the time? &lt;br/&gt;
-A: Watch for inbound connections on the port its listening and accept them.<br/><br/>Q: Calling <a href="http://man.cx/accept%282%29" target="_blank">accept</a> yields a descriptor. What do I do with it?&lt;br/&gt;
-A: Save the descriptor and do a non-blocking read/write operation on it.<br/><br/>Q: Why does the read/write have to be non-blocking?&lt;br/&gt;
-A: If the file operation ( even a socket in Unix is a file ) is blocking how could the server for example accept other connection requests when its blocked in a file I/O operation.<br/><br/>Q: I guess I have to do many such non-blocking operations on the socket to see when it's ready. Am I right?&lt;br/&gt;
-A: Yes. That is what an event library does for you. Now you get it.<br/><br/>Q: How do Event Libraries do what they do?&lt;br/&gt;
-A: They use the operating system's <a href="http://www.devshed.com/c/a/BrainDump/Linux-Files-and-the-Event-Poll-Interface/" target="_blank">polling</a> facility along with timers.<br/><br/>Q: So are there any open source event libraries that do what you just described? &lt;br/&gt;
-A: Yes. Libevent and Libev are two such event libraries that I can recall off the top of my head.<br/><br/>Q: Does Redis use such open source event libraries for handling socket I/O?&lt;br/&gt;
-A: No. For various <a href="http://groups.google.com/group/redis-db/browse_thread/thread/b52814e9ef15b8d0/" target="_blank">reasons</a> Redis uses its own event library.
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
42 doc/ExistsCommand.html
@@ -1,42 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>ExistsCommand: Contents</b><br>&nbsp;&nbsp;<a href="#EXISTS _key_">EXISTS _key_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">ExistsCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="GenericCommandsSidebar.html">GenericCommandsSidebar</a><h1><a name="EXISTS _key_">EXISTS _key_</a></h1>
-<i>Time complexity: O(1)</i><blockquote>Test if the specified key exists. The command returns&quot;0&quot; if the key exists, otherwise &quot;1&quot; is returned.Note that even keys set with an empty string as value willreturn &quot;1&quot;.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Integer reply</a>, specifically:<br/><br/><pre class="codeblock python" name="code">
-1 if the key exists.
-0 if the key does not exist.
-</pre>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
96 doc/ExpireCommand.html
@@ -1,96 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>ExpireCommand: Contents</b><br>&nbsp;&nbsp;<a href="#EXPIRE _key_ _seconds_">EXPIRE _key_ _seconds_</a><br>&nbsp;&nbsp;<a href="#EXPIREAT _key_ _unixtime_ (Redis &gt;">EXPIREAT _key_ _unixtime_ (Redis &gt;</a><br>&nbsp;&nbsp;<a href="#PERSIST _key_ (Redis &gt;">PERSIST _key_ (Redis &gt;</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#How the expire is removed from a key">How the expire is removed from a key</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Restrictions with write operations against volatile keys">Restrictions with write operations against volatile keys</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Restrictions for write operations with volatile keys as sources">Restrictions for write operations with volatile keys as sources</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Setting the timeout again on already volatile keys">Setting the timeout again on already volatile keys</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Enhanced Lazy Expiration algorithm">Enhanced Lazy Expiration algorithm</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Version 1.0">Version 1.0</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Version 1.1">Version 1.1</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#FAQ: Can you explain better why Redis &lt; 2.1.3 deletes keys with an EXPIRE on write operations?">FAQ: Can you explain better why Redis &lt; 2.1.3 deletes keys with an EXPIRE on write operations?</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#FAQ: How this limitations were solved in Redis versions &gt; 2.1.3?">FAQ: How this limitations were solved in Redis versions &gt; 2.1.3?</a>
- </div>
-
- <h1 class="wikiname">ExpireCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="GenericCommandsSidebar.html">GenericCommandsSidebar</a><h1><a name="EXPIRE _key_ _seconds_">EXPIRE _key_ _seconds_</a></h1>
-<h1><a name="EXPIREAT _key_ _unixtime_ (Redis &gt;">EXPIREAT _key_ _unixtime_ (Redis &gt;</a></h1> 1.1)=
-<h1><a name="PERSIST _key_ (Redis &gt;">PERSIST _key_ (Redis &gt;</a></h1> 2.1.3) =
-<i>Time complexity: O(1)</i><blockquote>Set a timeout on the specified key. After the timeout the key will beautomatically deleted by the server. A key with an associated timeout issaid to be <i>volatile</i> in Redis terminology.</blockquote>
-<blockquote>Voltile keys are stored on disk like the other keys, the timeout is persistenttoo like all the other aspects of the dataset. Saving a dataset containingexpires and stopping the server does not stop the flow of time as Redisstores on disk the time when the key will no longer be available as Unixtime, and not the remaining seconds.</blockquote>
-<blockquote>EXPIREAT works exctly like EXPIRE but instead to get the number of secondsrepresenting the Time To Live of the key as a second argument (that is arelative way of specifing the TTL), it takes an absolute one in the form ofa UNIX timestamp (Number of seconds elapsed since 1 Gen 1970).</blockquote>
-<blockquote>EXPIREAT was introduced in order to implement <a href="AppendOnlyFileHowto.html">the Append Only File persistence mode</a>so that EXPIRE commands are automatically translated into EXPIREAT commands for the append only file. Of course EXPIREAT can alsoused by programmers that need a way to simply specify that a given key should expire at a given time in the future.</blockquote>
-<blockquote>Since Redis 2.1.3 you can update the value of the timeout of a key alreadyhaving an expire set. It is also possible to undo the expire at allturning the key into a normal key using the PERSIST command.</blockquote>
-<h2><a name="How the expire is removed from a key">How the expire is removed from a key</a></h2><blockquote>When the key is set to a new value using the SET command, or when a keyis destroied via DEL, the timeout is removed from the key.</blockquote>
-<h2><a name="Restrictions with write operations against volatile keys">Restrictions with write operations against volatile keys</a></h2><blockquote>IMPORTANT: Since Redis 2.1.3 or greater, there are no restrictions aboutthe operations you can perform against volatile keys, however older versionsof Redis, including the current stable version 2.0.0, has the followinglimitations:</blockquote>
-<blockquote>Write operations like LPUSH, LSET and every other command that has theeffect of modifying the value stored at a volatile key have a special semantic:basically a volatile key is destroyed when it is target of a write operation.See for example the following usage pattern:</blockquote>
-<pre class="codeblock python" name="code">
-% ./redis-cli lpush mylist foobar /Users/antirez/hack/redis
-OK
-% ./redis-cli lpush mylist hello /Users/antirez/hack/redis
-OK
-% ./redis-cli expire mylist 10000 /Users/antirez/hack/redis
-1
-% ./redis-cli lpush mylist newelement
-OK
-% ./redis-cli lrange mylist 0 -1 /Users/antirez/hack/redis
-1. newelement
-</pre><blockquote>What happened here is that LPUSH against the key with a timeout set deletedthe key before to perform the operation. There is so a simple rule, writeoperations against volatile keys will destroy the key before to perform theoperation. Why Redis uses this behavior? In order to retain an importantproperty: a server that receives a given number of commands in the samesequence will end with the same dataset in memory. Without the delete-on-writesemantic what happens is that the state of the server depends on the timethe commands were issued. This is not a desirable property in a distributed databasethat supports replication.</blockquote>
-<h2><a name="Restrictions for write operations with volatile keys as sources">Restrictions for write operations with volatile keys as sources</a></h2>Even when the volatile key is not modified as part of a write operation, if it is
-read in a composite write operation (such as SINTERSTORE) it will be cleared at the
-start of the operation. This is done to avoid concurrency issues in replication.
-Imagine a key that is about to expire and the composite operation is run against it.
-On a slave node, this key might already be expired, which leaves you with a
-desync in your dataset.<h2><a name="Setting the timeout again on already volatile keys">Setting the timeout again on already volatile keys</a></h2><blockquote>Trying to call EXPIRE against a key that already has an associated timeoutwill not change the timeout of the key, but will just return 0. If insteadthe key does not have a timeout associated the timeout will be set and EXPIREwill return 1.</blockquote>
-<h2><a name="Enhanced Lazy Expiration algorithm">Enhanced Lazy Expiration algorithm</a></h2><blockquote>Redis does not constantly monitor keys that are going to be expired.Keys are expired simply when some client tries to access a key, andthe key is found to be timed out.</blockquote>
-<blockquote>Of course this is not enough as there are expired keys that will neverbe accessed again. This keys should be expired anyway, so once everysecond Redis test a few keys at random among keys with an expire set.All the keys that are already expired are deleted from the keyspace. </blockquote>
-<h3><a name="Version 1.0">Version 1.0</a></h3><blockquote>Each time a fixed number of keys where tested (100 by default). So ifyou had a client setting keys with a very short expire faster than 100for second the memory continued to grow. When you stopped to insertnew keys the memory started to be freed, 100 keys every second in thebest conditions. Under a peak Redis continues to use more and more RAMeven if most keys are expired in each sweep.</blockquote>
-<h3><a name="Version 1.1">Version 1.1</a></h3><blockquote>Each time Redis:</blockquote>
-<ol><li> Tests 100 random keys from expired keys set.</li><li> Deletes all the keys found expired.</li><li> If more than 25 keys were expired, it start again from 1.</li></ol>
-<blockquote>This is a trivial probabilistic algorithm, basically the assumption isthat our sample is representative of the whole key space,and we continue to expire until the percentage of keys that are likelyto be expired is under 25%</blockquote>
-<blockquote>This means that at any given moment the maximum amount of keys alreadyexpired that are using memory is at max equal to max setting operations per second divided by 4.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Integer reply</a>, specifically:<br/><br/><pre class="codeblock python python" name="code">
-1: the timeout was set.
-0: the timeout was not set since the key already has an associated timeout
- (this may happen only in Redis versions &lt; 2.1.3, Redis &gt;= 2.1.3 will
- happily update the timeout), or the key does not exist.
-</pre><h2><a name="FAQ: Can you explain better why Redis &lt; 2.1.3 deletes keys with an EXPIRE on write operations?">FAQ: Can you explain better why Redis &lt; 2.1.3 deletes keys with an EXPIRE on write operations?</a></h2>
-Ok let's start with the problem:
-<pre class="codeblock python python python" name="code">
-redis&gt; set a 100
-OK
-redis&gt; expire a 360
-(integer) 1
-redis&gt; incr a
-(integer) 1
-</pre>
-I set a key to the value of 100, then set an expire of 360 seconds, and then incremented the key (before the 360 timeout expired of course). The obvious result would be: 101, instead the key is set to the value of 1. Why?
-There is a very important reason involving the Append Only File and Replication. Let's rework a bit our example adding the notion of time to the mix:
-<pre class="codeblock python python python python" name="code">
-SET a 100
-EXPIRE a 5
-... wait 10 seconds ...
-INCR a
-</pre>
-Imagine a Redis version that does not implement the &quot;Delete keys with an expire set on write operation&quot; semantic.
-Running the above example with the 10 seconds pause will lead to 'a' being set to the value of 1, as it no longer exists when INCR is called 10 seconds later.<br/><br/>Instead if we drop the 10 seconds pause, the result is that 'a' is set to 101.<br/><br/>And in the practice timing changes! For instance the client may wait 10 seconds before INCR, but the sequence written in the Append Only File (and later replayed-back as fast as possible when Redis is restarted) will not have the pause. Even if we add a timestamp in the AOF, when the time difference is smaller than our timer resolution, we have a race condition.<br/><br/>The same happens with master-slave replication. Again, consider the example above: the client will use the same sequence of commands without the 10 seconds pause, but the replication link will slow down for a few seconds due to a network problem. Result? The master will contain 'a' set to 101, the slave 'a' set to 1.<br/><br/>The only way to avoid this but at the same time have reliable non time dependent timeouts on keys is to destroy volatile keys when a write operation is attempted against it.<br/><br/>After all Redis is one of the rare fully persistent databases that will give you EXPIRE. This comes to a cost :)<h2><a name="FAQ: How this limitations were solved in Redis versions &gt; 2.1.3?">FAQ: How this limitations were solved in Redis versions &gt; 2.1.3?</a></h2>Since Redis 2.1.3 there are no longer restrictions in the use you can do of write commands against volatile keys, still the replication and AOF file are guaranteed to be fully consistent.<br/><br/>In order to obtain a correct behavior without sacrificing consistency now when a key expires, a DEL operation is synthesized in both the AOF file and against all the attached slaves. This way the expiration process is centralized in the master instance, and there is no longer a chance of consistency errors.<br/><br/>However while the slaves while connected to a master will not expire keys independently, they'll still take the full state of the expires existing in the dataset, so when a slave is elected to a master it will be able to expire the keys independently, fully acting as a master.
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
70 doc/FAQ.html
@@ -1,70 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>FAQ: Contents</b><br>&nbsp;&nbsp;<a href="#Isn't this key-value thing just hype?">Isn't this key-value thing just hype?</a><br>&nbsp;&nbsp;<a href="#Can I backup a Redis DB while the server is working?">Can I backup a Redis DB while the server is working?</a><br>&nbsp;&nbsp;<a href="#What's the Redis memory footprint?">What's the Redis memory footprint?</a><br>&nbsp;&nbsp;<a href="#I like Redis high level operations and features, but I don't like it takes everything in memory and I can't have a dataset larger the memory. Plans to change this?">I like Redis high level operations and features, but I don't like it takes everything in memory and I can't have a dataset larger the memory. Plans to change this?</a><br>&nbsp;&nbsp;<a href="#Why Redis takes the whole dataset in RAM?">Why Redis takes the whole dataset in RAM?</a><br>&nbsp;&nbsp;<a href="#If my dataset is too big for RAM and I don't want to use consistent hashing or other ways to distribute the dataset across different nodes, what I can do to use Redis anyway?">If my dataset is too big for RAM and I don't want to use consistent hashing or other ways to distribute the dataset across different nodes, what I can do to use Redis anyway?</a><br>&nbsp;&nbsp;<a href="#Do you plan to implement Virtual Memory in Redis? Why don't just let the Operating System handle it for you?">Do you plan to implement Virtual Memory in Redis? Why don't just let the Operating System handle it for you?</a><br>&nbsp;&nbsp;<a href="#Is there something I can do to lower the Redis memory usage?">Is there something I can do to lower the Redis memory usage?</a><br>&nbsp;&nbsp;<a href="#I have an empty Redis server but INFO and logs are reporting megabytes of memory in use!">I have an empty Redis server but INFO and logs are reporting megabytes of memory in use!</a><br>&nbsp;&nbsp;<a href="#What happens if Redis runs out of memory?">What happens if Redis runs out of memory?</a><br>&nbsp;&nbsp;<a href="#Does Redis use more memory running in 64 bit boxes? Can I use 32 bit Redis in 64 bit systems?">Does Redis use more memory running in 64 bit boxes? Can I use 32 bit Redis in 64 bit systems?</a><br>&nbsp;&nbsp;<a href="#How much time it takes to load a big database at server startup?">How much time it takes to load a big database at server startup?</a><br>&nbsp;&nbsp;<a href="#Background saving is failing with a fork() error under Linux even if I've a lot of free RAM!">Background saving is failing with a fork() error under Linux even if I've a lot of free RAM!</a><br>&nbsp;&nbsp;<a href="#Are Redis on disk snapshots atomic?">Are Redis on disk snapshots atomic?</a><br>&nbsp;&nbsp;<a href="#Redis is single threaded, how can I exploit multiple CPU / cores?">Redis is single threaded, how can I exploit multiple CPU / cores?</a><br>&nbsp;&nbsp;<a href="#I'm using some form of key hashing for partitioning, but what about SORT BY?">I'm using some form of key hashing for partitioning, but what about SORT BY?</a><br>&nbsp;&nbsp;<a href="#What is the maximum number of keys a single Redis instance can hold? and what the max number of elements in a List, Set, Ordered Set?">What is the maximum number of keys a single Redis instance can hold? and what the max number of elements in a List, Set, Ordered Set?</a><br>&nbsp;&nbsp;<a href="#What Redis means actually?">What Redis means actually?</a><br>&nbsp;&nbsp;<a href="#Why did you started the Redis project?">Why did you started the Redis project?</a>
- </div>
-
- <h1 class="wikiname">FAQ</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;= Why I need Redis if there is already memcachedb, Tokyo Cabinet, ...? =<br/><br/>Memcachedb is basically memcached done persistent. Redis is a different evolution
-path in the key-value DBs, the idea is that the main advantages of key-value DBs
-are retained even without a so severe loss of comfort of plain key-value DBs.
-So Redis offers more features:<br/><br/><ul><li> Keys can store different data types, not just strings. Notably Lists and Sets. For example if you want to use Redis as a log storage system for different computers every computer can just <code name="code" class="python">RPUSH data to the computer_ID key</code>. Don't want to save more than 1000 log lines per computer? Just issue a <code name="code" class="python">LTRIM computer_ID 0 999</code> command to trim the list after every push.</li></ul>
-<ul><li> Another example is about Sets. Imagine to build a social news site like <a href="http://reddit.com" target="_blank">Reddit</a>. Every time a user upvote a given news you can just add to the news_ID_upmods key holding a value of type SET the id of the user that did the upmodding. Sets can also be used to index things. Every key can be a tag holding a SET with the IDs of all the objects associated to this tag. Using Redis set intersection you obtain the list of IDs having all this tags at the same time.</li></ul>
-<ul><li> We wrote a <a href="http://retwis.antirez.com" target="_blank">simple Twitter Clone</a> using just Redis as database. Download the source code from the download section and imagine to write it with a plain key-value DB without support for lists and sets... it's <b>much</b> harder.</li></ul>
-<ul><li> Multiple DBs. Using the SELECT command the client can select different datasets. This is useful because Redis provides a MOVE atomic primitive that moves a key form a DB to another one, if the target DB already contains such a key it returns an error: this basically means a way to perform locking in distributed processing.</li></ul>
-<ul><li> <b>So what is Redis really about?</b> The User interface with the programmer. Redis aims to export to the programmer the right tools to model a wide range of problems. <b>Sets, Lists with O(1) push operation, lrange and ltrim, server-side fast intersection between sets, are primitives that allow to model complex problems with a key value database</b>.</li></ul>
-<h1><a name="Isn't this key-value thing just hype?">Isn't this key-value thing just hype?</a></h1>I imagine key-value DBs, in the short term future, to be used like you use memory in a program, with lists, hashes, and so on. With Redis it's like this, but this special kind of memory containing your data structures is shared, atomic, persistent.<br/><br/>When we write code it is obvious, when we take data in memory, to use the most sensible data structure for the work, right? Incredibly when data is put inside a relational DB this is no longer true, and we create an absurd data model even if our need is to put data and get this data back in the same order we put it inside (an ORDER BY is required when the data should be already sorted. Strange, dont' you think?).<br/><br/>Key-value DBs bring this back at home, to create sensible data models and use the right data structures for the problem we are trying to solve.<h1><a name="Can I backup a Redis DB while the server is working?">Can I backup a Redis DB while the server is working?</a></h1>Yes you can. When Redis saves the DB it actually creates a temp file, then rename(2) that temp file name to the destination file name. So even while the server is working it is safe to save the database file just with the <i>cp</i> unix command. Note that you can use master-slave replication in order to have redundancy of data, but if all you need is backups, cp or scp will do the work pretty well.<h1><a name="What's the Redis memory footprint?">What's the Redis memory footprint?</a></h1>Worst case scenario: 1 Million keys with the key being the natural numbers from 0 to 999999 and the string &quot;Hello World&quot; as value use 100MB on my Intel macbook (32bit). Note that the same data stored linearly in an unique string takes something like 16MB, this is the norm because with small keys and values there is a lot of overhead. Memcached will perform similarly.<br/><br/>With large keys/values the ratio is much better of course.<br/><br/>64 bit systems will use much more memory than 32 bit systems to store the same keys, especially if the keys and values are small, this is because pointers takes 8 bytes in 64 bit systems. But of course the advantage is that you can have a lot of memory in 64 bit systems, so to run large Redis servers a 64 bit system is more or less required.<h1><a name="I like Redis high level operations and features, but I don't like it takes everything in memory and I can't have a dataset larger the memory. Plans to change this?">I like Redis high level operations and features, but I don't like it takes everything in memory and I can't have a dataset larger the memory. Plans to change this?</a></h1>Short answer: If you are using a Redis client that supports consistent hashing you can distribute the dataset across different nodes. For instance the Ruby clients supports this feature. There are plans to develop redis-cluster that basically is a dummy Redis server that is only used in order to distribute the requests among N different nodes using consistent hashing.<h1><a name="Why Redis takes the whole dataset in RAM?">Why Redis takes the whole dataset in RAM?</a></h1>Redis takes the whole dataset in memory and writes asynchronously on disk in order to be very fast, you have the best of both worlds: hyper-speed and persistence of data, but the price to pay is exactly this, that the dataset must fit on your computers RAM.<br/><br/>If the data is larger then memory, and this data is stored on disk, what happens is that the bottleneck of the disk I/O speed will start to ruin the performances. Maybe not in benchmarks, but once you have real load from multiple clients with distributed key accesses the data must come from disk, and the disk is damn slow. Not only, but Redis supports higher level data structures than the plain values. To implement this things on disk is even slower.<br/><br/>Redis will always continue to hold the whole dataset in memory because this days scalability requires to use RAM as storage media, and RAM is getting cheaper and cheaper. Today it is common for an entry level server to have 16 GB of RAM! And in the 64-bit era there are no longer limits to the amount of RAM you can have in theory.<br/><br/>Amazon EC2 now provides instances with 32 or 64 GB of RAM.<h1><a name="If my dataset is too big for RAM and I don't want to use consistent hashing or other ways to distribute the dataset across different nodes, what I can do to use Redis anyway?">If my dataset is too big for RAM and I don't want to use consistent hashing or other ways to distribute the dataset across different nodes, what I can do to use Redis anyway?</a></h1>You may try to load a dataset larger than your memory in Redis and see what happens, basically if you are using a modern Operating System, and you have a lot of data in the DB that is rarely accessed, the OS's virtual memory implementation will try to swap rarely used pages of memory on the disk, to only recall this pages when they are needed. If you have many large values rarely used this will work. If your DB is big because you have tons of little values accessed at random without a specific pattern this will not work (at low level a page is usually 4096 bytes, and you can have different keys/values stored at a single page. The OS can't swap this page on disk if there are even few keys used frequently).<br/><br/>Another possible solution is to use both MySQL and Redis at the same time, basically take the state on Redis, and all the things that get accessed very frequently: user auth tokens, Redis Lists with chronologically ordered IDs of the last N-comments, N-posts, and so on. Then use MySQL as a simple storage engine for larger data, that is just create a table with an auto-incrementing ID as primary key and a large BLOB field as data field. Access MySQL data only by primary key (the ID). The application will run the high traffic queries against Redis but when there is to take the big data will ask MySQL for specific resources IDs.<br/><br/>Update: it could be interesting to test how Redis performs with datasets larger than memory if the OS swap partition is in one of this very fast Intel SSD disks.<h1><a name="Do you plan to implement Virtual Memory in Redis? Why don't just let the Operating System handle it for you?">Do you plan to implement Virtual Memory in Redis? Why don't just let the Operating System handle it for you?</a></h1>Yes, in order to support datasets bigger than RAM there is the plan to
-implement transparent Virtual Memory in Redis, that is, the ability to
-transfer large values associated to keys rarely used on Disk, and
-reload them transparently in memory when this values are requested in
-some way.<br/><br/>So you may ask why don't let the operating system VM do the work for
-us. There are two main reasons: in Redis even a large value stored at
-a given key, for instance a 1 million elements list, is not allocated
-in a contiguous piece of memory. It's actually <b>very</b> fragmented since
-Redis uses quite aggressive object sharing and allocated Redis Objects
-structures reuse.<br/><br/>So you can imagine the memory layout composed of 4096 bytes pages that
-actually contain different parts of different large values. Not only,
-but a lot of values that are large enough for us to swap out to disk,
-like a 1024k value, is just one quarter the size of a memory page, and
-likely in the same page there are other values that are not rarely
-used. So this value wil never be swapped out by the operating system.
-This is the first reason for implementing application-level virtual
-memory in Redis.<br/><br/>There is another one, as important as the first. A complex object in
-memory like a list or a set is something <b>10 times bigger</b> than the
-same object serialized on disk. Probably you already noticed how Redis
-snapshots on disk are damn smaller compared to the memory usage of
-Redis for the same objects. This happens because when data is in
-memory is full of pointers, reference counters and other metadata. Add
-to this malloc fragmentation and need to return word-aligned chunks of
-memory and you have a clear picture of what happens. So this means to
-have 10 times the I/O between memory and disk than otherwise needed.<h1><a name="Is there something I can do to lower the Redis memory usage?">Is there something I can do to lower the Redis memory usage?</a></h1>Yes, try to compile it with 32 bit target if you are using a 64 bit box.<br/><br/>If you are using Redis &gt;= 1.3, try using the Hash data type, it can save a lot of memory.<br/><br/>If you are using hashes or any other type with values bigger than 128 bytes try also this to lower the RSS usage (Resident Set Size): EXPORT MMAP_THRESHOLD=4096<h1><a name="I have an empty Redis server but INFO and logs are reporting megabytes of memory in use!">I have an empty Redis server but INFO and logs are reporting megabytes of memory in use!</a></h1>This may happen and it's prefectly ok. Redis objects are small C structures allocated and freed a lot of times. This costs a lot of CPU so instead of being freed, released objects are taken into a free list and reused when needed. This memory is taken exactly by this free objects ready to be reused.<h1><a name="What happens if Redis runs out of memory?">What happens if Redis runs out of memory?</a></h1>With modern operating systems malloc() returning NULL is not common, usually the server will start swapping and Redis performances will be disastrous so you'll know it's time to use more Redis servers or get more RAM.<br/><br/>The INFO command (work in progress in this days) will report the amount of memory Redis is using so you can write scripts that monitor your Redis servers checking for critical conditions.<br/><br/>You can also use the &quot;maxmemory&quot; option in the config file to put a limit to the memory Redis can use. If this limit is reached Redis will start to reply with an error to write commands (but will continue to accept read-only commands).<h1><a name="Does Redis use more memory running in 64 bit boxes? Can I use 32 bit Redis in 64 bit systems?">Does Redis use more memory running in 64 bit boxes? Can I use 32 bit Redis in 64 bit systems?</a></h1>Redis uses a lot more memory when compiled for 64 bit target, especially if the dataset is composed of many small keys and values. Such a database will, for instance, consume 50 MB of RAM when compiled for the 32 bit target, and 80 MB for 64 bit! That's a big difference.<br/><br/>You can run 32 bit Redis binaries in a 64 bit Linux and Mac OS X system without problems. For OS X just use <b>make 32bit</b>. For Linux instead, make sure you have <b>libc6-dev-i386</b> installed, then use <b>make 32bit</b> if you are using the latest Git version. Instead for Redis &lt;= 1.2.2 you have to edit the Makefile and replace &quot;-arch i386&quot; with &quot;-m32&quot;.<br/><br/>If your application is already able to perform application-level sharding, it is very advisable to run N instances of Redis 32bit against a big 64 bit Redis box (with more than 4GB of RAM) instead than a single 64 bit instance, as this is much more memory efficient. <h1><a name="How much time it takes to load a big database at server startup?">How much time it takes to load a big database at server startup?</a></h1>Just an example on normal hardware: It takes about 45 seconds to restore a 2 GB database on a fairly standard system, no RAID. This can give you some kind of feeling about the order of magnitude of the time needed to load data when you restart the server.<h1><a name="Background saving is failing with a fork() error under Linux even if I've a lot of free RAM!">Background saving is failing with a fork() error under Linux even if I've a lot of free RAM!</a></h1>Short answer: <code name="code" class="python">echo 1 &gt; /proc/sys/vm/overcommit_memory</code> :)<br/><br/>And now the long one:<br/><br/>Redis background saving schema relies on the copy-on-write semantic of fork in modern operating systems: Redis forks (creates a child process) that is an exact copy of the parent. The child process dumps the DB on disk and finally exits. In theory the child should use as much memory as the parent being a copy, but actually thanks to the copy-on-write semantic implemented by most modern operating systems the parent and child process will <i>share</i> the common memory pages. A page will be duplicated only when it changes in the child or in the parent. Since in theory all the pages may change while the child process is saving, Linux can't tell in advance how much memory the child will take, so if the <code name="code" class="python">overcommit_memory</code> setting is set to zero fork will fail unless there is as much free RAM as required to really duplicate all the parent memory pages, with the result that if you have a Redis dataset of 3 GB and just 2 GB of free memory it will fail.<br/><br/>Setting <code name="code" class="python">overcommit_memory</code> to 1 says Linux to relax and perform the fork in a more optimistic allocation fashion, and this is indeed what you want for Redis.<br/><br/>A good source to understand how Linux Virtual Memory work and other alternatives for <code name="code" class="python">overcommit_memory</code> and <code name="code" class="python">overcommit_ratio</code> is this classic from Red Hat Magaize, &quot;Understanding Virtual Memory&quot;: <a href="http://www.redhat.com/magazine/001nov04/features/vm/" target="_blank">http://www.redhat.com/magazine/001nov04/features/vm/</a> <h1><a name="Are Redis on disk snapshots atomic?">Are Redis on disk snapshots atomic?</a></h1>Yes, redis background saving process is always fork(2)ed when the server is outside of the execution of a command, so every command reported to be atomic in RAM is also atomic from the point of view of the disk snapshot.<h1><a name="Redis is single threaded, how can I exploit multiple CPU / cores?">Redis is single threaded, how can I exploit multiple CPU / cores?</a></h1>Simply start multiple instances of Redis in different ports in the same box and threat them as different servers! Given that Redis is a distributed database anyway in order to scale you need to think in terms of multiple computational units. At some point a single box may not be enough anyway.<br/><br/>In general key-value databases are very scalable because of the property that different keys can stay on different servers independently.<br/><br/>In Redis there are client libraries such Redis-rb (the Ruby client) that are able to handle multiple servers automatically using <i>consistent hashing</i>. We are going to implement consistent hashing in all the other major client libraries. If you use a different language you can implement it yourself otherwise just hash the key before to SET / GET it from a given server. For example imagine to have N Redis servers, server-0, server-1, ..., server-N. You want to store the key &quot;foo&quot;, what's the right server where to put &quot;foo&quot; in order to distribute keys evenly among different servers? Just perform the <i>crc</i> = CRC32(&quot;foo&quot;), then <i>servernum</i> = <i>crc</i> % N (the rest of the division for N). This will give a number between 0 and N-1 for every key. Connect to this server and store the key. The same for gets.<br/><br/>This is a basic way of performing key partitioning, consistent hashing is much better and this is why after Redis 1.0 will be released we'll try to implement this in every widely used client library starting from Python and PHP (Ruby already implements this support).<h1><a name="I'm using some form of key hashing for partitioning, but what about SORT BY?">I'm using some form of key hashing for partitioning, but what about SORT BY?</a></h1>With <a href="SortCommand.html">SORT</a> BY you need that all the <i>weight keys</i> are in the same Redis instance of the list/set you are trying to sort. In order to make this possible we developed a concept called <i>key tags</i>. A key tag is a special pattern inside a key that, if preset, is the only part of the key hashed in order to select the server for this key. For example in order to hash the key &quot;foo&quot; I simply perform the CRC32 checksum of the whole string, but if this key has a pattern in the form of the characters {...} I only hash this substring. So for example for the key &quot;foo{bared}&quot; the key hashing code will simply perform the CRC32 of &quot;bared&quot;. This way using key tags you can ensure that related keys will be stored on the same Redis instance just using the same key tag for all this keys. Redis-rb already implements key tags.<h1><a name="What is the maximum number of keys a single Redis instance can hold? and what the max number of elements in a List, Set, Ordered Set?">What is the maximum number of keys a single Redis instance can hold? and what the max number of elements in a List, Set, Ordered Set?</a></h1>In theory Redis can handle up to 2<sup>32 keys, and was tested in practice to handle at least 150 million of keys per instance. We are working in order to experiment with larger values.<br/><br/>Every list, set, and ordered set, can hold 2</sup>32 elements.<br/><br/>Actually Redis internals are ready to allow up to 2<sup>64 elements but the current disk dump format don't support this, and there is a lot time to fix this issues in the future as currently even with 128 GB of RAM it's impossible to reach 2</sup>32 elements.<h1><a name="What Redis means actually?">What Redis means actually?</a></h1>Redis means two things:
-<ul><li> it's a joke on the word Redistribute (instead to use just a Relational DB redistribute your workload among Redis servers)</li><li> it means REmote DIctionary Server</li></ul>
-<h1><a name="Why did you started the Redis project?">Why did you started the Redis project?</a></h1>In order to scale <a href="http://lloogg.com" target="_blank">LLOOGG</a>. But after I got the basic server working I liked the idea to share the work with other guys, and Redis was turned into an open source project.
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
38 doc/Features.html
@@ -1,38 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>Features: Contents</b><br>&nbsp;&nbsp;<a href="#Features (DRAFT)">Features (DRAFT)</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Speed">Speed</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Persistence">Persistence</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Support for Data Structures">Support for Data Structures</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Atomic Operations">Atomic Operations</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Variety of Supported Languages">Variety of Supported Languages</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Master/Slave Replication">Master/Slave Replication</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Sharding">Sharding</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Hot Backups">Hot Backups</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Simple to Install, Setup and Manage">Simple to Install, Setup and Manage</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Portable">Portable</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Liberal Licensing">Liberal Licensing</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#What's next?">What's next?</a>
- </div>
-
- <h1 class="wikiname">Features</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="SideBar.html">SideBar</a>
-<h1><a name="Features (DRAFT)">Features (DRAFT)</a></h1>Checking Redis for the first time? Here your will find the most important features, and pointers to a lot more information.<h2><a name="Speed">Speed</a></h2>Redis is written in ANSI C, and loads the whole dataset in memory, so it is wicked <i><b>fast</b>!</i> Up to 110,000 <a href="SETs.html">SETs</a>/second, 81,000 GETs/second can be achieved in an entry level Linux box. Read more about Redis <a href="Speed.html">Speed</a>.<br/><br/>Also Redis supports <a href="Pipelining.html">Pipelining</a> of commands and <a href="MultiBulkCommands.html">getting and setting m&Atilde;&ordm;ltiple values in a single command</a> to speed up communication with the client libraries.<h2><a name="Persistence">Persistence</a></h2>While all the data lives in memory, changes are <i>asynchronously</i> saved on disk using flexible policies based on elapsed time and/or number of updates since last save. <br/><br/>If you can't afford losing some data, starting on version 1.1 (currently in beta but you can download it from the Git repository) Redis supports an append-only file persistence mode. Check more on <a href="Persistence.html">Persistence</a>, or read the <a href="AppendOnlyFileHowto.html">AppendOnlyFileHowto</a> for more information.<h2><a name="Support for Data Structures">Support for Data Structures</a></h2>Values in Redis can be <a href="Strings.html">Strings</a> as in a conventional key-value store, but also <a href="Lists.html">Lists</a>, <a href="Sets.html">Sets</a>, and <a href="SortedSets.html">SortedSets</a> (to be support in <a href="RoadMap.html">version 1.1</a>). This data types allow pushing/poping elements, or adding/removing them, also perform server side union, intersection, difference between sets, and so forth depending on the types. Redis supports different kind of sorting abilities for <a href="Sets.html">Sets</a> and <a href="Lists.html">Lists</a>.<br/><br/>You can think in Redis as a <b>Data Structures Server</b>, that allows you to model non trivial problems. Read <a href="DataTypes.html">Data Types</a> to learn more about the way Redis handle <a href="Strings.html">Strings</a>, and the <a href="Commands.html">Commands</a> supported by <a href="Lists.html">Lists</a>, <a href="Sets.html">Sets</a> and <a href="SortedSets.html">SortedSets</a><h2><a name="Atomic Operations">Atomic Operations</a></h2>Redis operations working on the different Data Types are <b>atomic</b>, so setting or increasing a key, adding and removing elements from a set, increasing a counter will all be accomplished safely.<h2><a name="Variety of Supported Languages">Variety of Supported Languages</a></h2>Ruby, Python, Twisted Python, PHP, Erlang, Tcl, Perl, Lua, Java, Scala, Clojure, choose your poison. Check the list of <a href="SupportedLanguages.html">Supported Languages</a> for all the details.<br/><br/>If your favorite language is not supported yet, you can write your own client library, as the <a href="ProtocolSpecification.html">Protocol</a> is pretty simple.<h2><a name="Master/Slave Replication">Master/Slave Replication</a></h2>Redis supports a very simple and fast Master/Slave replication. Is so simple it takes only one line in the <a href="Configuration.html">configuration file</a> to set it up, and 21 seconds for a Slave to complete the initial sync of 10 MM key set in a Amazon EC2 instance.<br/><br/>Read more about Master/Slave <a href="Replication.html">Replication</a>. <h2><a name="Sharding">Sharding</a></h2>Distributing the dataset across multiple Redis instances is easy in Redis, as in any other key-value store. And this depends basically on the <a href="Supported.html">Languages</a> client libraries being able to do so. <br/><br/>Read more about <a href="Sharding.html">Sharding</a> if you want to know more abour distributing data and workload in Redis.<h2><a name="Hot Backups">Hot Backups</a></h2>TODO<h2><a name="Simple to Install, Setup and Manage">Simple to Install, Setup and Manage</a></h2>Installing Redis requires little more than downloading it, uncompressing it and running make. Management is near zero, so you can start using Redis in a matter of minutes.<br/><br/>Go on and read about Redis <a href="Installation.html">installation</a>, its <a href="Setup.html">Setup</a> and <a href="Management.html">Management</a>.<h2><a name="Portable">Portable</a></h2>Redis is written in ANSI C and works in most POSIX systems like Linux, BSD, Mac OS X, Solaris, and so on. Redis is reported to compile and work under WIN32 if compiled with Cygwin, but there is no official support for Windows currently.<h2><a name="Liberal Licensing">Liberal Licensing</a></h2>Redis is free software released under the very liberal BSD license.<h2><a name="What's next?">What's next?</a></h2>Want to get started with Redis? Try the <a href="QuickStart.html">Quick Start</a> you will be up and running in just a matter of minutes. <br/><br/>Check the <a href="CodeSamples.html">Code Samples</a> and find how you can use Redis with your favorite programming language.<br/><br/><a href="Comparisons.html">Compare</a> Redis with other key-value stores, like Tokyo Cabinet or Memcached.
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/FlushallCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>FlushallCommand: Contents</b><br>&nbsp;&nbsp;<a href="#FLUSHALL">FLUSHALL</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">FlushallCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="GenericCommandsSidebar.html">GenericCommandsSidebar</a><h1><a name="FLUSHALL">FLUSHALL</a></h1>
-<blockquote>Delete all the keys of all the existing databases, not just the currently selected one. This command never fails.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Status code reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/FlushdbCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>FlushdbCommand: Contents</b><br>&nbsp;&nbsp;<a href="#FLUSHDB">FLUSHDB</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">FlushdbCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="GenericCommandsSidebar.html">GenericCommandsSidebar</a><h1><a name="FLUSHDB">FLUSHDB</a></h1>
-<blockquote>Delete all the keys of the currently selected DB. This command never fails.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Status code reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
37 doc/FromSqlToDataStructures.html
@@ -1,37 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>FromSqlToDataStructures: Contents</b><br>&nbsp;&nbsp;<a href="#Introduction (IDEA MORE THAN A DRAFT)">Introduction (IDEA MORE THAN A DRAFT)</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Data Structures">Data Structures</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Dude where is my SELECT statement?">Dude where is my SELECT statement?</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#LISTs">LISTs</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#SETs">SETs</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#SORT to the rescue">SORT to the rescue</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="#SORT BY">SORT BY</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#HASHEs">HASHEs</a>
- </div>
-
- <h1 class="wikiname">FromSqlToDataStructures</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
-
-<h1><a name="Introduction (IDEA MORE THAN A DRAFT)">Introduction (IDEA MORE THAN A DRAFT)</a></h1><b>&Acirc;&iquest;Coming from SQLand?</b> <i>&Acirc;&iquest;Who doesn't?</i> Redis is simple, <i>primitive</i> when comapred to the world you are used to in the world of Relational Database Managers (RDBMS) and Structure Query Language (SQL), here you will find insight to build bridges between both worlds to model real life problems.<h2><a name="Data Structures">Data Structures</a></h2>When I was young, happy and single ;) I studied <b>Data Structures</b> at the university, actually I learnt Data Structures and Algorithms <i>before</i> learning anything about Databases, and particularly RDBMS and SQL. This is natural because you need to know about Data Structures and Algorithms to understand a Database.<br/><br/>Redis can be seen as a <b>Data Structures Server</b>, a very simple interface to a extremly fast and efficient <h2><a name="Dude where is my SELECT statement?">Dude where is my SELECT statement?</a></h2><h2><a name="LISTs">LISTs</a></h2>In SQL there is no such thing as a &quot;natural&quot; order, a SELECT statement without a ORDER BY clause will return data in a undefined order. In Redis <a href="LISTs.html">LISTs</a> address the problem of natural ordering, ...<h2><a name="SETs">SETs</a></h2>So you have a bunch of unordered data, <h2><a name="SORT to the rescue">SORT to the rescue</a></h2>But sometimes we <i>need</i> to actually sort a LIST in a order different from its natural or take a SET and have it ordered, there is where the <i>fast</i> SORT commands comes handy... <h3><a name="SORT BY">SORT BY</a></h3>Just SORTing keys would be kind of boring, sometimes useless right? Well, you can SORT...<h2><a name="HASHEs">HASHEs</a></h2>Umm, sorry you will have to wait for a <a href="RoadMap.html">upcoming version of Redis</a> to have Hashes, but here are Idioms you should house to manage Dictionary like data...
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
36 doc/GenericCommandsSidebar.html
@@ -1,36 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>GenericCommandsSidebar: Contents</b>
- </div>
-
- <h1 class="wikiname">GenericCommandsSidebar</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;== Generic Commands ==<br/><br/><ul><li> <a href="ExistsCommand.html">EXISTS</a></li><li> <a href="DelCommand.html">DEL</a></li><li> <a href="TypeCommand.html">TYPE</a></li><li> <a href="KeysCommand.html">KEYS</a></li><li> <a href="RandomkeyCommand.html">RANDOMKEY</a></li><li> <a href="RenameCommand.html">RENAME</a></li><li> <a href="RenamenxCommand.html">RENAMENX</a></li><li> <a href="DbsizeCommand.html">DBSIZE</a></li><li> <a href="ExpireCommand.html">EXPIRE</a></li><li> <a href="ExpireCommand.html">PERSIST</a></li><li> <a href="TtlCommand.html">TTL</a></li><li> <a href="SelectCommand.html">SELECT</a></li><li> <a href="MoveCommand.html">MOVE</a></li><li> <a href="FlushdbCommand.html">FLUSHDB</a></li><li> <a href="FlushallCommand.html">FLUSHALL</a></li><li> <a href="MultiExecCommand.html">Redis Transactions</a></li></ul>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/GetCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>GetCommand: Contents</b><br>&nbsp;&nbsp;<a href="#GET _key_">GET _key_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">GetCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="StringCommandsSidebar.html">StringCommandsSidebar</a><h1><a name="GET _key_">GET _key_</a></h1>
-<i>Time complexity: O(1)</i><blockquote>Get the value of the specified key. If the keydoes not exist the special value 'nil' is returned.If the value stored at <i>key</i> is not a string an erroris returned because GET can only handle string values.</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Bulk reply</a>
-
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
39 doc/GetbitCommand.html
@@ -1,39 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>GetbitCommand: Contents</b><br>&nbsp;&nbsp;<a href="#GETBIT _key_ _offset_ (Redis &gt;">GETBIT _key_ _offset_ (Redis &gt;</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a>
- </div>
-
- <h1 class="wikiname">GetbitCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
-
-<h1><a name="GETBIT _key_ _offset_ (Redis &gt;">GETBIT _key_ _offset_ (Redis &gt;</a></h1> 2.1.8) =
-<i>Time complexity: O(1)</i><blockquote>Returns the bit value at <i>offset</i> in the string value stored at <i>key</i>.</blockquote>
-When <i>offset</i> is beyond the string length, the string is assumed to be a contiguous space with 0 bits. When <i>key</i> does not exist it is assumed to be an empty string, so <i>offset</i> is always out of range and the value is also assumed to be a contiguous space with 0 bits.<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Integer reply</a>, specifically: the bit value stored at <i>offset</i>.
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
38 doc/GetsetCommand.html
@@ -1,38 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>GetsetCommand: Contents</b><br>&nbsp;&nbsp;<a href="#GETSET _key_ _value_">GETSET _key_ _value_</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Return value">Return value</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Design patterns">Design patterns</a>
- </div>
-
- <h1 class="wikiname">GetsetCommand</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
- &iuml;&raquo;&iquest;#sidebar <a href="StringCommandsSidebar.html">StringCommandsSidebar</a><h1><a name="GETSET _key_ _value_">GETSET _key_ _value_</a></h1>
-<i>Time complexity: O(1)</i><blockquote>GETSET is an atomic <i>set this value and return the old value</i> command.Set <i>key</i> to the string <i>value</i> and return the old value stored at <i>key</i>.The string can't be longer than 1073741824 bytes (1 GB).</blockquote>
-<h2><a name="Return value">Return value</a></h2><a href="ReplyTypes.html">Bulk reply</a><h2><a name="Design patterns">Design patterns</a></h2><blockquote>GETSET can be used together with INCR for counting with atomic reset whena given condition arises. For example a process may call INCR against thekey <i>mycounter</i> every time some event occurred, but from time totime we need to get the value of the counter and reset it to zero atomicallyusing <code name="code" class="python">GETSET mycounter 0</code>.</blockquote>
- </div>
-
- </div>
- </div>
- </body>
-</html>
-
View
83 doc/HackingStrings.html
@@ -1,83 +0,0 @@
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
-<html>
- <head>
- <link type="text/css" rel="stylesheet" href="style.css" />
- </head>
- <body>
- <div id="page">
-
- <div id='header'>
- <a href="index.html">
- <img style="border:none" alt="Redis Documentation" src="redis.png">
- </a>
- </div>
-
- <div id="pagecontent">
- <div class="index">
-<!-- This is a (PRE) block. Make sure it's left aligned or your toc title will be off. -->
-<b>HackingStrings: Contents</b><br>&nbsp;&nbsp;<a href="#Hacking Strings">Hacking Strings</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Creating Redis Strings">Creating Redis Strings</a>
- </div>
-
- <h1 class="wikiname">HackingStrings</h1>
-
- <div class="summary">
-
- </div>
-
- <div class="narrow">
-
-<h1><a name="Hacking Strings">Hacking Strings</a></h1>The implementation of Redis strings is contained in <b></b>sds.c<b></b> ( sds stands for Simple Dynamic Strings ).<br/><br/>The C structure <i>sdshdr</i> declared in <b>sds.h</b> represents a Redis string:<br/><br/><pre class="codeblock python" name="code">
-struct sdshdr {
- long len;
- long free;
- char buf[];
-};
-</pre>The <i>buf</i> character array stores the actual string.<br/><br/>The <i>len</i> field stores the length of <i>buf</i>. This makes obtaining the length
-of a Redis string an O(1) operation.<br/><br/>The <i>free</i> field stores the number of additional bytes available for use.<br/><br/>Together the <i>len</i> and <i>free</i> field can be thought of as holding the metadata of the
-<i>buf</i> character array.<h2><a name="Creating Redis Strings">Creating Redis Strings</a></h2>A new data type named <code name="code" class="python">sds</code> is defined in <b>sds.h</b> to be a synonymn for a character pointer:<br/><br/><pre class="codeblock python python" name="code">
-typedef char *sds;
-</pre><code name="code" class="python">sdsnewlen</code> function defined in <b>sds.c</b> creates a new Redis String: <br/><br/><pre class="codeblock python python python" name="code">
-sds sdsnewlen(const void *init, size_t initlen) {
- struct sdshdr *sh;
-
- sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
-#ifdef SDS_ABORT_ON_OOM
- if (sh == NULL) sdsOomAbort();
-#else
- if (sh == NULL) return NULL;
-#endif
- sh-&gt;len = initlen;
- sh-&gt;free = 0;
- if (initlen) {
- if (init) memcpy(sh-&gt;buf, init, initlen);
- else memset(sh-&gt;buf,0,initlen);
- }
- sh-&gt;buf[initlen] = '\0';
- return (char*)sh-&gt;buf;
-}
-</pre>Remember a Redis string is a variable of type <code name="code" class="python">struct sdshdr</code>. But <code name="code" class="python">sdsnewlen</code> returns a character pointer!!<br/><br/>That's a trick and needs some explanation.<br/><br/>Suppose I create a Redis string using <code name="code" class="python">sdsnewlen</code> like below:<br/><br/><pre class="codeblock python python python python" name="code">
-sdsnewlen(&quot;redis&quot;, 5);
-</pre>This creates a new variable of type <code name="code" class="python">struct sdshdr</code> allocating memory for <i>len</i> and <i>free</i>
-fields as well as for the <i>buf</i> character array.<br/><br/><pre class="codeblock python python python python python" name="code">
-sh = zmalloc(sizeof(struct sdshdr)+initlen+1); // initlen is length of init argument.
-</pre>After <code name="code" class="python">sdsnewlen</code> succesfully creates a Redis string the result is something like:<br/><br/><pre class="codeblock python python python python python python" name="code">
------------
-|5|0|redis|
------------
-^ ^
-sh sh-&gt;buf
-</pre><code name="code" class="python">sdsnewlen</code> returns sh-&gt;buf to the caller.<br/><br/>What do you do if you need to free the Redis string pointed by <code name="code" class="python">sh</code>?<br/><br/>You want the pointer <code name="code" class="python">sh</code> but you only have the pointer <code name="code" class="python">sh-&gt;buf</code>.<br/><br/>Can you get the pointer <code name="code" class="python">sh</code> from <code name="code" class="python">sh-&gt;buf</code>?<br/><br/>Yes. Pointer arithmetic. Notice from the above ASCII art that if you subtract
-the size of two longs from <code name="code" class="python">sh-&gt;buf</code> you get the pointer <code name="code" class="python">sh</code>. <br/><br/>The sizeof two longs happens to be the size of <code name="code" class="python">struct sdshdr</code>.<br/><br/>Look at <code name="code" class="python">sdslen</code> function and see this trick at work:<br/><br/><pre class="codeblock python python python python python python python" name="code">
-size_t sdslen(const s