PageRenderTime 117ms CodeModel.GetById 33ms app.highlight 11ms RepoModel.GetById 50ms app.codeStats 0ms

HTML | 109 lines | 98 code | 10 blank | 1 comment | 0 complexity | 7ebb4801b64f7a3e882549ebb1c91239 MD5 | raw file
Possible License(s): BSD-3-Clause
  4    <head>
  5        <link type="text/css" rel="stylesheet" href="style.css" />
  6    </head>
  7    <body>
  8        <div id="page">
 10            <div id='header'>
 11            <a href="index.html">
 12            <img style="border:none" alt="Redis Documentation" src="redis.png">
 13            </a>
 14            </div>
 16            <div id="pagecontent">
 17                <div class="index">
 18<!-- This is a (PRE) block.  Make sure it's left aligned or your toc title will be off. -->
 19<b>README: Contents</b><br>&nbsp;&nbsp;<a href="#Introduction">Introduction</a><br>&nbsp;&nbsp;<a href="#Beyond key-value databases">Beyond key-value databases</a><br>&nbsp;&nbsp;<a href="#What are the differences between Redis and Memcached?">What are the differences between Redis and Memcached?</a><br>&nbsp;&nbsp;<a href="#What are the differences between Redis and Tokyo Cabinet / Tyrant?">What are the differences between Redis and Tokyo Cabinet / Tyrant?</a><br>&nbsp;&nbsp;<a href="#Does Redis support locking?">Does Redis support locking?</a><br>&nbsp;&nbsp;<a href="#Multiple databases support">Multiple databases support</a><br>&nbsp;&nbsp;<a href="#Redis Data Types">Redis Data Types</a><br>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#Implementation Details">Implementation Details</a><br>&nbsp;&nbsp;<a href="#Redis Tutorial">Redis Tutorial</a><br>&nbsp;&nbsp;<a href="#License">License</a><br>&nbsp;&nbsp;<a href="#Credits">Credits</a>
 20                </div>
 22                <h1 class="wikiname">README</h1>
 24                <div class="summary">
 26                </div>
 28                <div class="narrow">
 29                    <h1><a name="Introduction">Introduction</a></h1>Redis is a database. To be more specific redis is a very simple database
 30implementing a dictionary where keys are associated with values. For example
 31I can set the key &quot;surname_1992&quot; to the string &quot;Smith&quot;.<br/><br/>Redis takes the whole dataset in memory, but the dataset is persistent
 32since from time to time Redis writes a dump of the dataset on disk asynchronously. The dump is loaded every time the server is restarted. This means that if a system crash occurs the last few queries can get lost (that is acceptable in many applications), so we supported master-slave replication from the early days.<h1><a name="Beyond key-value databases">Beyond key-value databases</a></h1>In most key-value databases keys and values are simple strings. In Redis keys are just strings too, but the associated values can be Strings, Lists and Sets, and there are commands to perform complex atomic operations against this data types, so you can think at Redis as a data structures server.<br/><br/>For example you can append elements to a list stored at the key &quot;mylist&quot; using the LPUSH or RPUSH operation in O(1). Later you'll be able to get a range of elements with LRANGE or trim the list with LTRIM. Sets are very flexible too, it is possible to add and remove elements from Sets (unsorted collections of strings), and then ask for server-side intersection of Sets.<br/><br/>All this features, the support for sorting Lists and Sets, allow to use Redis as the sole DB for your scalable application without the need of any relational database. <a href="TwitterAlikeExample.html">We wrote a simple Twitter clone in PHP + Redis</a> to show a real world example, the link points to an article explaining the design and internals in very simple words.<h1><a name="What are the differences between Redis and Memcached?">What are the differences between Redis and Memcached?</a></h1>In the following ways:<br/><br/><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. Redis instead can be used as the main DB for the application. We <a href="TwitterAlikeExample.html">wrote a simple Twitter clone</a> using only Redis as database.</li></ul>
 33<ul><li> Like memcached Redis uses a key-value model, but while keys can just be strings, values in Redis can be lists and sets, and complex operations like intersections, set/get n-th element of lists, pop/push of elements, can be performed against sets and lists. It is possible to use lists as message queues.</li></ul>
 34<h1><a name="What are the differences between Redis and Tokyo Cabinet / Tyrant?">What are the differences between Redis and Tokyo Cabinet / Tyrant?</a></h1>Redis and Tokyo can be used for the same applications, but actually they are <b>ery</b> different beasts:<br/><br/><ul><li> Tokyo is purely key-value, everything beyond key-value storing of strings is delegated to an embedded Lua interpreter. AFAIK there is no way to guarantee atomicity of operations like pushing into a list, and every time you want to have data structures inside a Tokyo key you have to perform some kind of object serialization/de-serialization.</li></ul>
 35<ul><li> Tokyo stores data on disk, synchronously, this means you can have datasets bigger than memory, but that under load, like every kind of process that relay on the disk I/O for speed, the performances may start to degrade. With Redis you don't have this problems but you have another problem: the dataset in every single server must fit in your memory.</li></ul>
 36<ul><li> Redis is generally an higher level beast in the operations supported. Things like SORTing, Server-side set-intersections, can't be done with Tokyo. But 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 remember that in many scalable applications you need multiple servers talking with multiple servers, so the server-client model is almost always needed.</li></ul>
 37<h1><a name="Does Redis support locking?">Does Redis support locking?</a></h1>No, the idea is to provide atomic primitives in order to make the programmer
 38able to use redis with locking free algorithms. For example imagine you have
 3910 computers and 1 redis server. You want to count words in a very large text.
 40This large text is split among the 10 computers, every computer will process
 41its part and use Redis's INCR command to atomically increment a counter
 42for every occurrence of the word found.<br/><br/>INCR/DECR are not the only atomic primitives, there are others like PUSH/POP
 43on lists, POP RANDOM KEY operations, UPDATE and so on. For example you can
 44use Redis like a Tuple Space (<a href="" target="_blank"></a>) in
 45order to implement distributed algorithms.<br/><br/>(News: locking with key-granularity is now planned)<h1><a name="Multiple databases support">Multiple databases support</a></h1>Another synchronization primitive is the support for multiple DBs. By default DB 0 is selected for every new connection, but using the SELECT command it is possible to select a different database. The MOVE operation can move an item from one DB to another atomically. This can be used as a base for locking free algorithms together with the 'RANDOMKEY' or 'POPRANDOMKEY' commands.<h1><a name="Redis Data Types">Redis Data Types</a></h1>Redis supports the following three data types as values:<br/><br/><ul><li> Strings: just any sequence of bytes. Redis strings are binary safe so they can not just hold text, but images, compressed data and everything else.</li><li> Lists: lists of strings, with support for operations like append a new string on head, on tail, list length, obtain a range of elements, truncate the list to a given length, sort the list, and so on.</li><li> Sets: an unsorted set of strings. It is possible to add or delete elements from a set, to perform set intersection, union, subtraction, and so on.</li></ul>
 46Values can be Strings, Lists or Sets. Keys can be a subset of strings not containing newlines (&quot;\n&quot;) and spaces (&quot; &quot;).<br/><br/>Note that sometimes strings may hold numeric vaules that must be parsed by
 47Redis. An example is the INCR command that atomically increments the number
 48stored at the specified key. In this case Redis is able to handle integers
 49that can be stored inside a 'long long' type, that is a 64-bit signed integer.<h2><a name="Implementation Details">Implementation Details</a></h2>Strings are implemented as dynamically allocated strings of characters.
 50Lists are implemented as doubly linked lists with cached length.
 51Sets are implemented using hash tables that use chaining to resolve collisions.<h1><a name="Redis Tutorial">Redis Tutorial</a></h1>(note, you can skip this section if you are only interested in &quot;formal&quot; doc.)<br/><br/>Later in this document you can find detailed information about Redis commands,
 52the protocol specification, and so on. This kind of documentation is useful
 53but... if you are new to Redis it is also BORING! The Redis protocol is designed
 54so that is both pretty efficient to be parsed by computers, but simple enough
 55to be used by humans just poking around with the 'telnet' command, so this
 56section will show to the reader how to play a bit with Redis to get an initial
 57feeling about it, and how it works.<br/><br/>To start just compile redis with 'make' and start it with './redis-server'.
 58The server will start and log stuff on the standard output, if you want
 59it to log more edit redis.conf, set the loglevel to debug, and restart it.<br/><br/>You can specify a configuration file as unique parameter:<br/><br/><blockquote>./redis-server /etc/redis.conf</blockquote>
 60This is NOT required. The server will start even without a configuration file
 61using a default built-in configuration.<br/><br/>Now let's try to set a key to a given value:<br/><br/><pre class="codeblock python" name="code">
 62$ telnet localhost 6379
 64Connected to localhost.
 65Escape character is '^]'.
 66SET foo 3  
 69</pre>The first line we sent to the server is &quot;set foo 3&quot;. This means &quot;set the key
 70foo with the following three bytes I'll send you&quot;. The following line is
 71the &quot;bar&quot; string, that is, the three bytes. So the effect is to set the
 72key &quot;foo&quot; to the value &quot;bar&quot;. Very simple!<br/><br/>(note that you can send commands in lowercase and it will work anyway,
 73commands are not case sensitive)<br/><br/>Note that after the first and the second line we sent to the server there
 74is a newline at the end. The server expects commands terminated by &quot;\r\n&quot;
 75and sequence of bytes terminated by &quot;\r\n&quot;. This is a minimal overhead from
 76the point of view of both the server and client but allows us to play with
 77Redis with the telnet command easily.<br/><br/>The last line of the chat between server and client is &quot;+OK&quot;. This means
 78our key was added without problems. Actually SET can never fail but
 79the &quot;+OK&quot; sent lets us know that the server received everything and
 80the command was actually executed.<br/><br/>Let's try to get the key content now:<br/><br/><pre class="codeblock python python" name="code">
 81GET foo
 84</pre>Ok that's very similar to 'set', just the other way around. We sent &quot;get foo&quot;,
 85the server replied with a first line that is just a number of bytes the value
 86stored at key contained, followed by the actual bytes. Again &quot;\r\n&quot; are appended
 87both to the bytes count and the actual data.<br/><br/>What about requesting a non existing key?<br/><br/><pre class="codeblock python python python" name="code">
 88GET blabla
 90</pre>When the key does not exist instead of the length just the &quot;nil&quot; string is sent.
 91Another way to check if a given key exists or not is indeed the EXISTS command:<br/><br/><pre class="codeblock python python python python" name="code">
 92EXISTS nokey
 94EXISTS foo
 96</pre>As you can see the server replied '0' the first time since 'nokey' does not
 97exist, and '1' for 'foo', a key that actually exists.<br/><br/>Ok... now you know the basics, read the <a href="CommandReference.html">REDIS COMMAND REFERENCE</a> section to
 98learn all the commands supported by Redis and the <a href="ProtocolSpecification.html">PROTOCOL SPECIFICATION</a>
 99section for more details about the protocol used if you plan to implement one
100for a language missing a decent client implementation.<h1><a name="License">License</a></h1>Redis is released under the BSD license. See the COPYING file for more information.<h1><a name="Credits">Credits</a></h1>Redis is written and maintained by Salvatore Sanfilippo, Aka 'antirez'.<br/><br/>Enjoy,
103                </div>
105            </div>
106        </div>
107    </body>