From f08340aeffe25841fd7d4780bd93d423d978f6e3 Mon Sep 17 00:00:00 2001 From: Alexandre Dulaunoy Date: Sat, 10 Jan 2015 23:06:11 +0100 Subject: [PATCH] Overview of the Redis data structures --- doc/redis-datastruct.dot | 21 +++++++++++++++++++++ doc/redis-datastruct.png | Bin 0 -> 15767 bytes 2 files changed, 21 insertions(+) create mode 100644 doc/redis-datastruct.dot create mode 100644 doc/redis-datastruct.png diff --git a/doc/redis-datastruct.dot b/doc/redis-datastruct.dot new file mode 100644 index 0000000..e9b641f --- /dev/null +++ b/doc/redis-datastruct.dot @@ -0,0 +1,21 @@ +digraph g{ + a -> b + a [label="processed",shape=box,fillcolor="white",style="filled"]; + b [label="{Malware MD5, Malware MD5, ...}",shape=box,fillcolor="palegreen",style="filled,rounded"]; + + c -> d + c [label="type",shape=box,fillcolor="white",style="filled"]; + d [label="{http.user_agent, http.server, ...}",shape=box,fillcolor="palegreen",style="filled,rounded"]; + d -> g [dir=none]; + g [label="e:http.user_agent", shape=box]; + g -> h + h [label="{Mozilla...., Mozilla/4.0..., Wget...,... }",shape=box,fillcolor="palegreen",style="filled,rounded"]; + h -> e [dir=none]; + e -> f + e [label="v:MD5('Mozilla....')",shape=box,fillcolor="white",style="filled"]; + f [label="{Malware MD5, Malware MD5, ...}",shape=box,fillcolor="palegreen",style="filled,rounded"]; + + z [label="key", shape=box]; + y [label="set", shape=box, fillcolor="palegreen",style="filled,rounded"]; + +} diff --git a/doc/redis-datastruct.png b/doc/redis-datastruct.png new file mode 100644 index 0000000000000000000000000000000000000000..9280085142ef25af20841d338920b6a8f2509f55 GIT binary patch literal 15767 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