]>
Commit | Line | Data |
---|---|---|
8fb13ce8 | 1 | |
2 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> | |
3 | <html> | |
4 | <head> | |
5 | <link type="text/css" rel="stylesheet" href="style.css" /> | |
6 | </head> | |
7 | <body> | |
8 | <div id="page"> | |
9 | ||
10 | <div id='header'> | |
11 | <a href="index.html"> | |
12 | <img style="border:none" alt="Redis Documentation" src="redis.png"> | |
13 | </a> | |
14 | </div> | |
15 | ||
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> <a href="#All data in memory, but saved on disk">All data in memory, but saved on disk</a><br> <a href="#Master-Slave replication made trivial">Master-Slave replication made trivial</a><br> <a href="#It's persistent but supports expires">It's persistent but supports expires</a><br> <a href="#Beyond key-value databases">Beyond key-value databases</a><br> <a href="#Multiple databases support">Multiple databases support</a><br> <a href="#Know more about Redis!">Know more about Redis!</a><br> <a href="#Redis Tutorial">Redis Tutorial</a><br> <a href="#License">License</a><br> <a href="#Credits">Credits</a> | |
20 | </div> | |
21 | ||
22 | <h1 class="wikiname">README</h1> | |
23 | ||
24 | <div class="summary"> | |
25 | ||
26 | </div> | |
27 | ||
28 | <div class="narrow"> | |
29 | = Introduction =<br/><br/>Redis is a database. To be specific, Redis is a database implementing a dictionary, where every key is associated with a value. For example I can set the key "surname_1992" to the string "Smith". | |
30 | What makes Redis different from many other key-value stores, is that every single value has a type. The following types are supported:<br/><br/><ul><li> <a href="Strings.html">Strings</a></li><li> <a href="Lists.html">Lists</a></li><li> <a href="Sets.html">Sets</a></li><li> <a href="SortedSets.html">Sorted Set</a> (since version 1.1)</li></ul> | |
31 | The type of a value determines what operations (called commands) are available for the value itself. | |
32 | For example you can append elements to a list stored at the key "mylist" using the LPUSH or RPUSH command 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, union, difference of Sets. Each command is performed through server-side atomic operations. | |
33 | Please refer to the <a href="CommandReference.html">Command Reference</a> to see the full list of operations associated to these data types.<br/><br/>In other words, you can look at Redis as a data structures server. A Redis user is virtually provided with an interface to <a href="http://en.wikipedia.org/wiki/Abstract_data_type" target="_blank">Abstract Data Types</a>, saving her from the responsibility to implement concrete data structures and algorithms. Indeed both algorithms and data structures in Redis are properly choosed in order to obtain the best performance.<h1><a name="All data in memory, but saved on disk">All data in memory, but saved on disk</a></h1>Redis loads and mantains the whole dataset into memory, but the dataset is persistent, since at the same time it is saved on disk, so that when the server is restarted data can be loaded back in memory.<br/><br/>There are two kind of persistence supported: the first one is called snapshotting. In this mode Redis, from time to time, writes a dump on disk asynchronously. The dataset is loaded from the dump every time the server is (re)started.<br/><br/>Redis can be configured to save the dataset when a certain number of changes is reached and after a given number of seconds elapses. For example, you can configure Redis to save after 1000 changes and at most 60 seconds since the last save. You can specify any combination for these numbers.<br/><br/>Because data is written asynchronously, when a system crash occurs, the last few queries can get lost (that is acceptable in many applications but not in all). In order to make this a non issue Redis supports another, safer persistence mode, called <a href="AppendOnlyFileHowto.html">Append Only File</a>, where every command received altering the dataset (so not a read-only command, but a write command) is written on an append only file ASAP. This commands are <i>replayed</i> when the server is restarted in order to rebuild the dataset in memory.<br/><br/>Redis Append Only File supports a very handy feature: the server is able to safely rebuild the append only file in background in a non-blocking fashion when it gets too long. You can find <a href="AppendOnlyFileHowto.html">more details in the Append Only File HOWTO</a>.<h1><a name="Master-Slave replication made trivial">Master-Slave replication made trivial</a></h1>Whatever will be the persistence mode you'll use Redis supports master-slave replications if you want to stay really safe or if you need to scale to huge amounts of reads.<br/><br/><b>Redis Replication is trivial to setup</b>. So trivial that all you need to do in order to configure a Redis server to be a slave of another one, with automatic synchronization if the link will go down and so forth, is the following config line: <code name="code" class="python">slaveof 192.168.1.100 6379</code>. <a href="ReplicationHowto.html">We provide a Replication Howto</a> if you want to know more about this feature.<h1><a name="It's persistent but supports expires">It's persistent but supports expires</a></h1>Redis can be used as a <b>memcached on steroids</b> because is as fast as memcached but with a number of features more. Like memcached, Redis also supports setting timeouts to keys so that this key will be automatically removed when a given amount of time passes.<h1><a name="Beyond key-value databases">Beyond key-value databases</a></h1>All these features 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="Multiple databases support">Multiple databases support</a></h1>Redis supports multiple databases with commands to atomically move keys from one database to the other. 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' commands.<h1><a name="Know more about Redis!">Know more about Redis!</a></h1>To really get a feeling about what Redis is and how it works please try reading <a href="IntroductionToRedisDataTypes.html">A fifteen minutes introduction to Redis data types</a>.<br/><br/>To know a bit more about how Redis works <i>internally</i> continue reading.<h1><a name="Redis Tutorial">Redis Tutorial</a></h1>(note, you can skip this section if you are only interested in "formal" doc.)<br/><br/>Later in this document you can find detailed information about Redis commands, | |
34 | the protocol specification, and so on. This kind of documentation is useful | |
35 | but... if you are new to Redis it is also BORING! The Redis protocol is designed | |
36 | so that is both pretty efficient to be parsed by computers, but simple enough | |
37 | to be used by humans just poking around with the 'telnet' command, so this | |
38 | section will show to the reader how to play a bit with Redis to get an initial | |
39 | feeling about it, and how it works.<br/><br/>To start just compile redis with 'make' and start it with './redis-server'. | |
40 | The server will start and log stuff on the standard output, if you want | |
41 | it 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> | |
42 | This is NOT required. The server will start even without a configuration file | |
43 | using 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"> | |
44 | $ telnet localhost 6379 | |
45 | Trying 127.0.0.1... | |
46 | Connected to localhost. | |
47 | Escape character is '^]'. | |
48 | SET foo 3 | |
49 | bar | |
50 | +OK | |
51 | </pre>The first line we sent to the server is "set foo 3". This means "set the key | |
52 | foo with the following three bytes I'll send you". The following line is | |
53 | the "bar" string, that is, the three bytes. So the effect is to set the | |
54 | key "foo" to the value "bar". Very simple!<br/><br/>(note that you can send commands in lowercase and it will work anyway, | |
55 | commands are not case sensitive)<br/><br/>Note that after the first and the second line we sent to the server there | |
56 | is a newline at the end. The server expects commands terminated by "\r\n" | |
57 | and sequence of bytes terminated by "\r\n". This is a minimal overhead from | |
58 | the point of view of both the server and client but allows us to play with | |
59 | Redis with the telnet command easily.<br/><br/>The last line of the chat between server and client is "+OK". This means | |
60 | our key was added without problems. Actually SET can never fail but | |
61 | the "+OK" sent lets us know that the server received everything and | |
62 | the command was actually executed.<br/><br/>Let's try to get the key content now:<br/><br/><pre class="codeblock python python" name="code"> | |
63 | GET foo | |
64 | $3 | |
65 | bar | |
66 | </pre>Ok that's very similar to 'set', just the other way around. We sent "get foo", | |
67 | the server replied with a first line that is just the $ character follwed by | |
68 | the number of bytes the value stored at key contained, followed by the actual | |
69 | bytes. Again "\r\n" are appended both to the bytes count and the actual data. In Redis slang this is called a bulk reply.<br/><br/>What about requesting a non existing key?<br/><br/><pre class="codeblock python python python" name="code"> | |
70 | GET blabla | |
71 | $-1 | |
72 | </pre>When the key does not exist instead of the length, just the "$-1" string is sent. Since a -1 length of a bulk reply has no meaning it is used in order to specifiy a 'nil' value and distinguish it from a zero length value. Another 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"> | |
73 | EXISTS nokey | |
74 | :0 | |
75 | EXISTS foo | |
76 | :1 | |
77 | </pre>As you can see the server replied ':0' the first time since 'nokey' does not | |
78 | exist, and ':1' for 'foo', a key that actually exists. Replies starting with the colon character are integer reply.<br/><br/>Ok... now you know the basics, read the <a href="CommandReference.html">REDIS COMMAND REFERENCE</a> section to | |
79 | learn all the commands supported by Redis and the <a href="ProtocolSpecification.html">PROTOCOL SPECIFICATION</a> | |
80 | section for more details about the protocol used if you plan to implement one | |
81 | for 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'. | |
82 | </div> | |
83 | ||
84 | </div> | |
85 | </div> | |
86 | </body> | |
87 | </html> | |
88 |