summaryrefslogtreecommitdiff
path: root/docs/REDIS
diff options
context:
space:
mode:
Diffstat (limited to 'docs/REDIS')
-rw-r--r--docs/REDIS160
1 files changed, 0 insertions, 160 deletions
diff --git a/docs/REDIS b/docs/REDIS
deleted file mode 100644
index 54358d16f..000000000
--- a/docs/REDIS
+++ /dev/null
@@ -1,160 +0,0 @@
-Starting in Anope 1.9.9, Anope has Redis database support (http://redis.io/).
-This document explains the data structure used by Anope, and explains how
-keyspace notification works.
-
-This is not a tutorial on how to use Redis, see http://redis.io/documentation
-for that.
-
-Table of Contents
------------------
-1) Data structure
-2) Keyspace notifications
-3) Examples of modifying, deleting, and creating objects
-
-1) Data structure
-
- There are 4 key namespaces in Anope, they are:
-
- id - The keys in id are used to atomically create object ids for new
- objects. For example, if I were to create a new BotInfo I would first:
-
- redis 127.0.0.1:6379> INCR id:BotInfo
-
- To get the object ID of the new object.
-
- ids - The keys in ids contain a set of all object ids of the given type.
- For example:
-
- redis 127.0.0.1:6379> SMEMBERS ids:BotInfo
-
- Returns "1", "2", "3", "4", "5", "6", "7", "8" because I have 8 bots that
- have IDs 1, 2, 3, 4, 5, 6, 7, and 8, respectively.
-
- hash - The keys in hash are the actual objects, stored as hashes. For
- example, if I had just looked up all BotInfo ids and wanted to iterate
- over all of them, I woulld start by:
-
- redis 127.0.0.1:6379> HGETALL hash:BotInfo:1
-
- Which gets all keys and values from the hash of type BotInfo with id 1.
- This may return:
-
- "nick" -> "BotServ"
- "user" -> "services"
- "host" -> "services.anope.org"
- "created" -> "1368704765"
-
- value - The keys in value only exist to aid looking up object IDs. They
- are sets of object IDs and are used to map key+value pairs to objects.
- For example:
-
- redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nick:Adam
-
- Returns a set of object ids of NickAlias objects that have the key
- 'nick' set to the value 'Adam' in its hash. Clearly this can only
- ever contain at most one object, since it is not possible to have
- more than one registered nick with the same name, but other keys
- will contain more than one, such as:
-
- redis 127.0.0.1:6379> SMEMBERS value:NickCore:email:adam@anope.org
-
- Which would return all accounts with the email "adam@anope.org".
-
- redis 127.0.0.1:6379> SMEMBERS value:ChanAccess:mask:Adam
-
- Which would return all access entries set on the account "Adam".
-
- Behavior similar to SQL's AND, can be achieved using the
- SINTER command, which does set intersection on one or more sets.
-
-2) Keyspace notifications
-
- Redis 2.7 (unstable) and 2.8 (stable) and newer support keyspace notifications
- (http://redis.io/topics/notifications). This allows Redis to notify Anope of
- any external changes to objects in the database. Once notified, Anope will
- immediately update the object. Otherwise, Anope keeps all objects in memory
- and will not regularly read from the databaes once started.
-
- You can use this to modify objects in Redis and have them immediately reflected
- back into Anope. Additionally you can use this feature to run multiple Anope
- instances simultaneously from the same database (see also, Redis database
- replication).
-
- To use keyspace notifications you MUST execute
-
- redis 127.0.0.1:6379> CONFIG SET notify-keyspace-events KA
- OK
-
- or set notify-keyspace-events in redis.conf properly. Anope always executes
- CONFIG SET when it first connects.
-
- If you do not enable keyspace events properly Anope will be UNABLE to see any
- object modifications you do.
-
- The key space ids and value are managed entirely by Anope, you do
- not (and should not) modify them. Once you modify the object (hash), Anope will
- update them for you to correctly refelect any changes made to the object.
-
- Finally, always use atomic operations. If you are inserting a new object with
- multiple commands, or inserting multiple objects at once, specifically if the
- objects depend on each other, you MUST use a transaction.
-
-3) Examples of modifying, deleting, and creating objects
-
- These examples will ONLY work if you meet the criteria in section 2.
-
- If I want to change the email account 'Adam' to 'Adam@anope.org', I would execute the following:
-
- redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
-
- Which returns a value of "1", which is the object id I want to modify.
- Now to change the email:
-
- redis 127.0.0.1:6379> HSET hash:NickCore:1 email Adam@anope.org
-
- You can now see this in NickServ's INFO command:
- -NickServ- Email address: Adam@anope.org
-
- If I want to drop the account "Adam", I would execute the following:
-
- redis 127.0.0.1:6379> SMEMBERS value:NickCore:display:Adam
-
- Which returns a value of "1". I would then check:
-
- redis 127.0.0.1:6379> SMEMBERS value:NickAlias:nc:Adam
-
- To see what nicknames depend on this account to exist, as I will
- have to remove those too. This returns the values "2", and "3".
-
- Finally, I can drop the nick using a transaction via:
-
- redis 127.0.0.1:6379> MULTI
- OK
- redis 127.0.0.1:6379> DEL hash:NickAlias:2
- QUEUED
- redis 127.0.0.1:6379> DEL hash:NickAlias:3
- QUEUED
- redis 127.0.0.1:6379> DEL hash:NickCore:1
- QUEUED
- redis 127.0.0.1:6379> EXEC
-
- Or alternatively simply:
-
- redis 127.0.0.1:6379> DEL hash:NickAlias:2 hash:NickAlias:3 hash:NickCore:1
-
- If I wanted to create a BotServ bot, I would execute the following:
-
- redis 127.0.0.1:6379> INCR id:BotInfo
-
- Which returns a new object ID for me, in this example it will be "8".
- Now I can create the object:
-
- HMSET hash:BotInfo:8 nick redis user redis host services.anope.org realname "Services for IRC Networks"
-
- Note if you are using HSET instead of HMSET you will need to use a transaction, as shown in the above example.
- If you are watching your services logs you will immediately see:
-
- USERS: redis!redis@services.anope.org (Services for IRC Networks) connected to the network (services.anope.org)
-
- And the bot redis will be in BotServ's bot list.
- Notice how ids:BotInfo and the value keys are updated automatically.