redis-io-copy

advertisement
REmote DIctionary Server.
http://redis.io/
open source, advanced key-value store, data
structure server
binzhang@ebay.com
http://www.yumianfeilong.com
Hello Redis
Install
$ wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz
$ tar xzf redis-2.4.8.tar.gz
$ cd redis-2.4.8
$ make
Start Redis server & make connection
[binzhang@phxrueidb04 redis-2.4.8]$ src/redis-server redis.conf
[16849] 04 Mar 02:03:59 * Server started, Redis version 2.4.8
[16849] 04 Mar 02:03:59 * The server is now ready to accept connections on
port 6379
Connect server
$ src/redis-cli
redis > set player:666:name binzhang
OK
redis > get player:666:name
"binzhang"
2
Learn More : data structure server
3
Agenda
Redis Manifesto 宣言
Data structures : strings, hashes, lists, sets and
sorted sets.
Leveraging Redis
Redis Admin and maintenance
The architecture of REDIS
Cases
4
Redis Manifesto
http://antirez.com/post/redis-manifesto.html
1. Redis is a DSL (Domain Specific Language) that manipulates
abstract data types and implemented as a TCP daemon. keys are
binary-safe strings and values are different kinds of abstract data
types.
2. Redis has persistence option but Memory storage is #1.
3. The Redis API is a direct consequence of fundamental data
structures.
4. Code is like a poem.
5. We believe designing systems is a fight against complexity. Most of
the time the best way to fight complexity is by not creating it at all.
6. Redis API has two levels: 1) a subset of the API fits naturally into a
distributed version of Redis and 2) a more complex API that
supports multi-key operations.
7. We optimize for joy. When there is no longer joy in writing code,
the best thing to do is stop.
5
Redis Manifesto
: where is Redis?
1. Redis is extremely fast, making it perfectly suited for applications that are writeheavy, data that changes often, and data that naturally fits one of Redis’s data
structures (for instance, analytics data).
2. A scenario where you probably shouldn’t use Redis is if you have a very large
dataset of which only a small part is “hot” (accessed often) or a case where
your dataset doesn’t fit in memory.
6
Who is using Redis
Taobao
Sina weibo
7
Agenda
Redis Manifesto 宣言
Simple/fast/
 Data structure : strings, hashes, lists, sets and sorted sets.
Leveraging Redis
The architecture of REDIS
Redis Admin and maintenance
Cases
8
Data structure: Key-Value Data
Store
Keys are strings which identify pieces of data
(values)
Values are arbitrary byte arrays that Redis
doesn't care about
Redis is implemented as five specialized data
structures
Strings, hash, list, set, sort set
Pub/Sub
Querying with Redis ;
the above make Redis fast and easy to use, but not
9
Data structure : KEY value
Before we dive into the specific data types, it is important to look at a few things you should keep in
mind when designing the key structure that holds your data.
1.a key can contain any characters, you can use separators to define a namespace with a semantic
value for your business. An example might be using cache:project:319:tasks, where the colon acts as a
namespace separator.
2.When defining your keys, try to limit them to a reasonable size. Retrieving a key from storage
requires comparison operations, so keeping keys as small as possible is a good idea. Additionally,
smaller keys are more effective in terms of memory usage.
3.Even though keys shouldn’t be exceptionally large, there are no big performance improvements for
extremely small keys. This means you should design your keys in such a way that combines
readability (to help you) and regular key sizes (to help Redis).
10
Data structure : KEY value
Redis support different kind of values
1.Binary-safe strings.
2.Lists of binary-safe strings.
3.Hash map of strings
4.Sets of binary-safe strings, that are collection
of unique unsorted elements.
5.Sorted sets, similar to Sets but where every
element is associated to a floating number
score. The elements are taken sorted by score.
11
Data structure : strings,
hashes, lists, sets , sorted sets.
1. Strings: the simplest and most basic data type (max 512M in length)
2. Redis Strings are binary safe, this means that a Redis string can contain any kind of data, for
instance a JPEG image or a serialized Ruby object.
– redis > users:leto "{name: leto, planet: dune, likes: [spice]}"
– OK
The C structure sdshdr
– redis > x users:leto "{name: leto, planet: dune,
likes: in
[spice]}"
declared
sds.h represents a
– (integer) 0
redis > strlen users:leto
(integer) 42
redis > getrange users:leto 27 40
"likes: [spice]"
redis > append users:leto " OVER 9000!!"
(integer) 54
redis > get users:leto
"{name: leto, planet: dune, likes: [spice]} OVER 9000!!"
Redis string:
struct sdshdr { long len;
long free;
char buf[];
};
12
•
Data structure : strings, hashes,
lists, sets , sorted sets.
if we store a counter key, we can use commands such as INCR (or INCRBY) and DECR (or
DECRBY) to increment or decrement its contained value.
– To store page visit data, we could have a key
“visits:pageid:totals”
redis > SET visits:2:totals 1367894
OK
redis > get visits:2:totals
"1367894"
redis > INCR visits:635:totals
(integer) 1
redis > INCR visits:2:totals
(integer) 1367895
redis > get visits:2:totals
13
Data structure :
•
•
strings
, hashes
, lists, sets , sorted sets.
Much like traditional hashtables, hashes in Redis store several fields and their values inside a
specific key. so they are the perfect data type to represent objects (eg: A User with a number
of fields like name, surname, age, and so forth):
Example: Designing a key namespace to store our users.
redis> hset users:jdoe name "John Doe"
(integer) 1
redis> hmset users:jdoe email jdoe@test.com phone "+1555313940"
OK
redis> hincrby users:jdoe visits 1
(integer) 1
redis > hget users:jdoe phone
"+1555313940"
•
•
A hash with a few fields (where few means up to one hundred or so) is stored in a way that takes
very little space, so you can store millions of objects in a small Redis instance.
Every hash can store up to 232 - 1 field-value pairs (more than 4 billion).
14
•
•
•
•
•
•
•
•
•
Data structure : strings, hashes,
lists, sets , sorted sets.
HDEL key field [field ...] Delete one or more hash fields
HGETALL key Get all the fields and values in a hash
HINCRBY key field increment Increment the integer value of a hash field by the given number
HKEYS key Get all the fields in a hash
HLEN key Get the number of fields in a hash
HMGET key field [field ...] Get the values of all the given hash fields
HMSET key field value [field value ...] Set multiple hash fields to multiple values
HSETNX key field value Set the value of a hash field, only if the field does not exist
HVALS key Get all the values in a hash
redis > hgetall users:jdoe
1) "name"
2) "John Doe"
3) "email"
4) "jdoe@test.com"
5) "phone"
6) "+1555313940"
7) "visits"
8) "1"
15
Data structure :
•
strings
,
hashes,
lists
, sets , sorted sets.
Redis Lists are simply lists of strings, sorted by insertion order. It is possible to add elements
to a Redis List pushing new elements on the head (on the left) or on the tail (on the right) of
the list.
LPUSH mylist a # now the list is "a"
LPUSH mylist b # now the list is "b","a"
RPUSH mylist c # now the list is "b","a","c" (RPUSH was
used this time)
•
•
•
support for constant time insertion and deletion of elements near the head and tail, even
with many millions of inserted items. Accessing elements is very fast near the extremes of
the list but is slow if you try accessing the middle of a very big list, as it is an O(N) operation.
You might want to use lists in order to implement structures such as queues
The max length of a list is 232 - 1 elements (4294967295, more than 4 billion of elements per
list).
16
Data structure : strings, hashes,
lists, sets , sorted sets.
•
Model a timeline in a social network, using LPUSH in order to add new elements in the user
time line, and using LRANGE in order to retrieve a few of recently inserted items.
–
•
You can use LPUSH together with LTRIM (O(N))to create a list that never exceeds a given
number of elements, but just remembers the latest N elements.
–
•
Lrange to do paging
Capped Collections in MongoDB.
Lists can be used as a message passing primitive,
–
–
–
–
–
–
–
–
BLPOP key [key ...] timeout Remove and get the first element in a list, or block until one is available
BRPOP key [key ...] timeout Remove and get the last element in a list, or block until one is available
LINDEX key index Get an element from a list by its index
LLEN key Get the length of a list
LPOP key Remove and get the first element in a list
RPOP key Remove and get the last element in a list
LRANGE key start stop Get a range of elements from a list
LTRIM key start stop Trim a list to the specified range
17
Data structure :
•
•
•
•
strings
,
hashes, lists,
sets ,
sorted sets.
Sets are an unordered collection of Strings. It is possible to add, remove, and test for
existence of members in O(1) (constant time regardless of the number of elements contained
inside the Set).
Elements in a given set can have no duplicates. this means that adding a member does not
require a check if exists then add operation.
Sets are a natural fit for circles, because sets represent collections of data, and have native
functionality to do interesting things like intersections and unions.
The max number of members in a set is 232 - 1 (4294967295, more than 4 billion of members
per set).
–
–
–
You can track unique things using Redis Sets. Want to know all the unique IP addresses visiting a
given blog post? Simply use SADD every time you process a page view.
Redis Sets are good to represent relations.
You can use Sets to extract elements at random using the SPOP or SRANDMEMBER commands.
18
Data structure :
strings
,
hashes, lists,
sets ,
sorted sets.
 We want to store several circles for each of our users, so it makes sense for our key to
include a bit about the user and a bit about the actual circle. (circle:jdoe:family etc)
redis>
sadd
circle:jdoe:family
users:anna
redis>
sinter
circle:jdoe:family
circle:jdoe:soccer
redis> sadd circle:jdoe:family users:richard
1) "users:mike"
redis> sadd circle:jdoe:family users:mike
(integer)
redis> 1sunion circle:jdoe:family circle:jdoe:soccer
redis> sadd circle:jdoe:soccer users:mike
1) "users:anna"
redis> sadd circle:jdoe:soccer users:adam
2) "users:mike"
redis>
sadd circle:jdoe:soccer users:toby
redis> sadd circle:jdoe:soccer users:apollo
3) "users:apollo"
(integer) 1
4) "users:adam"
redis>
smembers circle:jdoe:family
5) "users:richard"
1) "users:richard"
"users:toby"
2)6)"users:mike"
3) "users:anna"
redis> hgetall users:mike
(...)
19
Data structure : strings, hashes,
lists, sets , sorted sets.
•
•
•
•
•
•
•
•
•
•
•
•
•
SADD key member [member ...] Add one or more members to a set
SCARD key Get the number of members in a set
SDIFF key [key ...] Subtract multiple sets
SDIFFSTORE destination key [key ...] Subtract multiple sets and store the resulting set in a
key
SINTER key [key ...]
Intersect multiple sets
SISMEMBER key member
Determine if a given value is a member of a set
SMEMBERS key
Get all the members in a set
SMOVE source destination member Move a member from one set to another
SPOP key Remove and return a random member from a set
SRANDMEMBER key Get a random member from a set
SREM key member [member ...] Remove one or more members from a set
SUNION key [key ...] Add multiple sets
SUNIONSTORE destination key [key ...] Add multiple sets and store the resulting set in a key
20
•
Data structure : strings, hashes,
sets.
Use setlists,
to sets , sorted
To get all the tags for a given object :
implement tags
redis>smembers news:1000:tags
1. 5
2. 1
3. 77
4. 2
– sadd
news:1000:tags
1
– (integer) 1
we may want the list of all the objects having as
– sadd
tags 1, 2, 10, and 27 at the same time
news:1000:tags
Sinter tag:1:objects tag:2:objects tag:10:objects
2
tag:27:objects
– (integer) 1
– sadd
21
news:1000:tags
Set: Wildcard autocomplete
• Split every username to three letter chunks
– Simonw => sim, imo, mon, onw
• Create a set for each chunk
– Sim => { simonw, asimov, fasim}
• If the user types “simo”, return the
intersection of the “sim” and “imo”.
22
1.
2.
3.
Data structure : strings, hashes,
lists, sets , sorted sets.
Every member of a Sorted Set is associated with score, that is to sort set, from the smallest to the greatest
score. members are unique, scores may be repeated.
With sorted sets you can add, remove, or update elements in a very fast way (in a time proportional to the
logarithm of the number of elements, O(log(N))).
Get ranges by score or by rank (position) in a very fast way.
– ZADD can be used both to add items to the set and to update the score of an existing member.
 The ZRANGE family of commands return items by their index position within the ordered set. The optional
WITHSCORES argument returns the score for each item in the same response.
 ZRANGEBYSCORE query the ordered set by score, instead of by index.
zadd friends:leto 100 ghanima 95 paul 95 chani 75 jessica 1 vladimir
redis > zrange friends:leto 0 -1 withscores
1) "vladimir"
2) "1"
3) "jessica"
4) "75"
5) "chani"
6) "95"
7) "paul"
8) "95"
9) "ghanima"
10) "100"
23
Data structure : strings, hashes,
lists, sets , sorted sets.
Zset as index : any time you need to look up data based on range queries, you should be storing it in a sorted set.
They're indexes that you have to maintain yourself.
redis > zadd hackers 1940 "Alan Kay" 1953 "Richard Stallman" 1969 "Linus Torvalds" 1912 "Alan Turing"
redis > zrange hackers 0 -1
1) "Alan Turing"
2) "Alan Kay"
3) "Richard Stallman"
4) "Linus Torvalds“
redis > zrangebyscore hackers 1950 1990
1) "Richard Stallman"
2) "Linus Torvalds“
redis > zrangebyscore hackers -inf 1950
1) "Alan Turing"
2) "Alan Kay"
redis > zremrangebyscore hackers 1940 1960
(integer) 2
redis > zrange hackers 0 10
1) "Alan Turing"
2) "Linus Torvalds"
24
Sort set : Prefix autocomplete
• Type “binz”, return “binzhang”
1. Turn the first 4 or 5 characters of the strings into an
integer (you can
imagine every char as a digit of a radix 256 number
for instance, but
there are better representation) and add all your
usernames into a sorted set with score=integer.
2. Then using ZRANGEBYSCORE you can get all the
elements between a given range.
--ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
25
sorted sets : Inverted-Index Text Search with Redis
1.
2.
3.
4.
5.
an inverted index - a bunch of sets mapping terms to document IDs.
Assign each document an ID
Apply stemming and stopwords first
Create an inverted index, with one set per word
Create a set of docIDs for each term
–
ZINTERSTORE destination-zset number-of-zsets-to-intersect zset1 [zset2 ...] [WEIGHTS weight1 [weight2 ...]]
[AGGREGATE SUM | MIN | MAX]
26
Learn More Data structure : Pub/Sub
• Redis has native support for the
publish/subscribe (or pub/sub) pattern
1. receivers subscribe to messages that match a
specific pattern (for instance, messages that are
sent to a specific “channel”),
2. an procedurer/emitter to send messages to me
3. emitter and receivers to be loosely coupled-- hey
don’t need to know each other.
• The pub/sub command
1.
PSUBSCRIBE pattern [pattern ...] Listen for messages published to channels matching the given
patterns
27
Learn More Data structure :
redis > PUBLISH irc:football "Rock you"
(integer) 0
redis > PUBLISH irc:football "have a good day"
(integer) 1
redis > PUBLISH irc:football "water"
Pub/Sub
redis > subscribe irc:football
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "irc:football"
3) (integer) 1
1) "message"
2) "irc:football"
3) "have a good day"
1) "message"
2) "irc:football"
3) "water"
28
Agenda
Redis Manifesto 宣言
Data structure : strings, hashes, lists, sets and
sorted sets.
Leveraging Redis
The architecture of REDIS
Redis Admin and maintenance
Cases
29
Leveraging Redis
1.
2.
3.
4.
5.
6.
7.
Operations on KEYS
Big O Notation
Sort
EXPIRE
Transaction
Optimistic locking using check-and-set ( select for update)
Pipelining ( commands in batch)
30
Keys operation
 KEYS pattern
Lists all the keys in the current database that match the given pattern. [slow]
 TYPE key-name Tells the type of the key. Possible types are: string, list, hash, set, zset, and
none.
 MONITOR
Outputs the commands received by the Redis server in real time. [debug
purpose only]
KEYS h*llo
KEYS h?llo
KEYS h[ae]llo.
redis > type circle:jdoe:soccer
Set
DEL/EXISTS/EXPIRE/TTL/PERSIST/RANDOMKEY/RE
NAME
Redis can handle up to 2^32 keys
31
Big O Notation
How fast a command is based on the number of
items we are dealing with.
O(1): fastest, Whether we are dealing with 5
items or 5 million, you'll get the same
performance.
 Sismember : if a value belongs to a set
O(N) : linear commands, fts etc
 Keys
 ltrim, N is the number of elements being removed.
O(log(N)):
32
 zadd is a O(log(N)) command, where N is the number of
sort
•
Sort the values within a list, set or sorted set.
redis > rpush users:leto:guesses 5 9 10 2 4 10 19 2
(integer) 8
redis > sort users:leto:guesses
1) "2"
2) "2"
3) "4"
4) "5"
5) "9"
6) "10"
7) "10"
8) "19"
redis 9> sadd friends:ghanima leto paul chani jessica alia duncan
(integer) 6
redis > sort friends:ghanima limit 0 3 desc alpha
1) "paul"
2) "leto"
3) "jessica"
•
•
Redis is single-thread, so sort on salve if large dataset
Sort can store result to a key, one pattern for paginating through expensive sort results
(millions of items, for example) is to save the result to a temporary key, set an expiry on it
and use that for pagination via the LRANGE command.
33
Transaction
Every Redis command is atomic, including the ones that do multiple things.
–
–
–
–
incr is essentially a get followed by a set
getset sets a new value and returns the original
setnx first checks if the key exists, and only sets the value if it does not
Msetnx fails if any key already exist (less important, now we’ve hash)
MULTI command can run multiple commands as an atomic group.
1.
Marks the start of a transaction block. Subsequent commands will be queued for atomic execution using EXEC.

DISCARD can be used in order to abort a transaction. In this case, no commands are executed and the state of the connection is restored to
normal.
2.
3.
The commands will be executed in order
The commands will be executed as a single atomic operation (without another client's command being executed halfway
through)
4. That either all or none of the commands in the transaction will be executed
redis > multi
OK
redis > hincrby groups:1percent balance -9000000000
QUEUED
redis > hincrby groups:1percent balance -9000000000
QUEUED
redis > exec
1) (integer) -9000000000
2) (integer) -18000000000
34
Optimistic locking using check-andset
•
WATCH / UNWATCH
–
keys are monitored in order to detect changes against them. If at least one watched key is modified before
the EXEC command, the whole transaction aborts, and EXEC returns a Null multi-bulk reply to notify that the
transaction failed
•
.
let's suppose Redis doesn't have INCR
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
•
Using WATCH to implement ZPOP
WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC
35
Expiration
1. Redis allows you to mark a key for expiration.
2. You can give it an absolute time in the form of a Unix timestamp (seconds since January 1,
1970) or a time to live in seconds.
a. expire pages:about 30
b. expireat pages:about 1356933600
-- delete key after 30 seconds
-- delete key at 12:00 a.m. December 31st, 2012.
c. ttl pages:about
d. persist pages:about
-- check ttl
-- remove expire limit
e. setex pages:about 30 '<h1>about us</h1>’
--set a string and specify a expire time
3. Lazy Expiration algorithm
Keys are expired simple when some clients tries to
access a key and the key is found to be time out
4. Once every second,
I. Tests 100 random keys from expired keys set.
II. Deletes all the keys found expired.
III. If more than 25 keys were expired, it starts again from
36
What if no available memory
 Redis will return an error on write operations, but read-only query still works
 Can specify “maxmemory” to define a hard limit for memory usage
 maxmemory-policy: specify the algorithm to use when we need to reclaim memory
a.
b.
c.
d.
e.
volatile-lru (default) remove a key among the ones with an expire set, trying to remove keys not recently used.
volatile-ttl remove a key among the ones with an expire set, trying to remove keys with short remaining time to live.
volatile-random remove a random key among the ones with an expire set.
allkeys-lru like volatile-lru, but will remove every kind of key, both normal keys or keys with an expire set.
allkeys-random like volatile-random, but will remove every kind of keys, both normal keys and keys with an expire set.
 LRU and minimal TTL algorithms
a)
b)
are not precise algorithms
for default Redis will check three keys(“maxmemory-samples”) and pick the one that was used less recently
redis > set newkey "maxsize"
(error) ERR command not allowed when used memory > 'maxmemory'
37
Redis Pipelining(How)
Send multiple commands to the server without waiting for the replies at all, and finally read the
replies in a single step.
$ (echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
+PONG
+PONG
+PONG
Not paying the cost of RTT for every call;
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
38
Redis Pipelining(why we need)
• Redis is a TCP server using the client-server
model and what is called a Request/Response
protocol.
– The client sends a query to the server, and reads
from the socket, usually in a blocking way, for the
server response.
– The server processes the command and sends
the response back to the client.
So for instance a four commands sequence is something like this:
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Network Round Trip: Latency?
Server: 3
Client: INCR X
Server: 4
39
Agenda
Redis Manifesto 宣言
Data structure : strings, hashes, lists, sets and
sorted sets.
Leveraging Redis

Keys/O(n)/sort/expire/transaction/watch
Redis Admin and maintenance









Select database
Monitor Redis
Configure Persistence
Starting a Redis Slave
Handling a Dataset larger than memory
Upgrade Redis
BackUp Redis
Sharding Redis
Benchmarks
40
Databases in Redis
1.A database contains a set of data.
2.A database is to group all of an application's
data together and to keep it separate from
another application's.
3.databases are simply identified by a number
with the default database being number 0.
4.Number of databases is set via “databases”
param in config
5.change to a different database via select
command
41
Monitor Redis
1. MONITOR , is actually part of the Redis replication system. If you telnet directly to Redis and
type monitor, you'll see a live dump of all commands executing against the database. This is
really useful for debugging.
2. config set slowlog-log-slower-than 0
3. Redis-stat : similar like prstat
4. Info command
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
–
redis > info
redis_version:2.4.8
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.1.2
process_id:5898
uptime_in_seconds:163519
uptime_in_days:1
lru_clock:1033766
used_cpu_sys:1.19
used_cpu_user:2.36
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
connected_clients:2
connected_slaves:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:1384280
42
Configure Persistence(1)

Persistence Mode: snapshotting and AOF. It should be configured in a way that suits your
dataset and usage patterns.
1. snapshotting, which consists of saving the entire database to disk in the RDB format (a
compressed database dump). This can be done periodically at set times, or every time a
configurable number of keys changes.
# save <seconds> <changes>
save 900 1 --after 900 sec (15 min) if at least 1 key changed
save 300 10 --after 300 sec (5 min) if at least 10 keys changed
save 60 10000 --after 60 sec if at least 10000 keys changed
2. The alternative is using an Append Only File (AOF). This might be a better option if you have
a large dataset or your data doesn’t change very frequently.
./redis-server --appendonly yes
3.
4.
5.
6.
It is possible to combine both AOF and RDB in the same instance.
Master ->> Slave can be a option.
Both are sequential IO
When Redis starts, it will read RDB or AOF to load all data into memory.
43
Configure Persistence(2)
1. Snapshotting
–
–
–
performs point-in-time snapshots of dataset at specified intervals. (
a full dump of your database to disk, overwriting the previous dump only if successful.
Can manually trigger snapshotting with the SAVE and BGSAVE commands.
•
•
–
BGSAVE forks the main Redis process and saves the DB to disk in the background.
SAVE performs the same operation as BGSAVE but does so in the foreground, thereby blocking your Redis server.
are also used when performing a master -> slave synchronization.
2. Append Only File(AOF)
–
–
–
keeps a log of the commands that change your dataset in a separate file.
an append only log. no seeks, nor corruption problems (redis-check-aof )
Appendfsync: how often the AOF gets synched to disk (fsync syscall) :
•
–
Always (be able to group commit), every sec, and no.
BGREWRITEAOF rewrites the AOF to match the current database; can reduce size of AOF greatly. (For
example, if you are incrementing a counter 100 times, you'll end up with a single key in your dataset
containing the final value, but 100 entries in your AOF. 99 of those entries are not needed to rebuild the
current state.)
44
Redis Admin and maintenance:
Master --Slave
 Use slave : Load balance read queires, standby, Backup ,DW queries
 master-slave replication natively:



A master can have multiple slaves.
Slaves are able to accept other slaves connections.
Redis replication is non-blocking on the master side, this means that the master will continue to serve
queries when one or more slaves perform the first synchronization.
 configure replication on the configuration file before starting a server


slaveof master-ip-or-hostname masterport
masterauth master-password
 by connecting to a running server and using the SLAVEOF command.


SLAVEOF master-ip-or-hostname [masterport]
CONFIG SET masterauth password
45
Handling a Dataset Larger Than
Memory
•
Memory (VM) since version 2.0 (deprecated after Redis 2.4) .
vm-enabled yes
vm-swap-file
•
Allow a dataset bigger than your available RAM by swapping rarely used values to disk and
keeping all the keys and the frequently used values in memory.
1.
2.
3.
4.
5.
The keys are always kept in memory. Values can be swapped.
Redis server might end up blocking clients in order to fetch the values from disk.
Slow snapshot, Redis needs to read all the values swapped to disk in order to write them to the RDB file. AOF
is better at this case.
VM also affects the speed of replication, because Redis masters need to perform a BGSAVE when a new slave
connects.
SSDs such as Flash is encouraged
46
Upgrading Redis
Redis can’t do online binary upgrades
solution
1. starting a new Redis server in slave mode,
2. switching over the clients to the slave
3. promoting the new server to the master role.
make sure to test before doing it on your
production servers.
47
Backing up Redis
• Depending on which Redis persistence model
you’re using.
1.With the default persistence model
(snapshotting), you’re best off using a
snapshot as a backup. /* cold backup */
redis-cli BGSAVE
Copy
2.If you’re using only AOF, you’ll have to back up
your log in order to be able to replay it on
startup.
48
Sharding Redis
•
Where is Redis Cluster
–
•
Under development. Probably reasonable beta for
summer 2012 and ship the first stable one before end
of 2012.
Have to implemented in the client library or
application
–
–
you should probably use consistent hashing.
you will not be able to perform some operations that
affect multiple keys, because those keys might be in
different shards (servers).
49
Benchmarks--- How fast is Redis?
•
redis-benchmark utility that simulates SETs/GETs done by N clients at the same time sending M total
queries
[hadoop@phxrueidb03 src]$ ./redis-benchmark -q -n 100000
PING (inline): 97370.98 requests per second
PING: 101214.58 requests per second
MSET (10 keys): 66357.00 requests per second
SET: 105263.16 requests per second
GET: 103199.18 requests per second
INCR: 104493.20 requests per second
LPUSH: 104931.80 requests per second
LPOP: 104384.13 requests per second
SADD: 104931.80 requests per second
SPOP: 103950.10 requests per second
LPUSH (again, in order to bench LRANGE): 104931.80 requests per second
LRANGE (first 100 elements): 44964.03 requests per second
LRANGE (first 300 elements): 22825.84 requests per second
LRANGE (first 450 elements): 16564.52 requests per second
LRANGE (first 600 elements): 12701.64 requests per second
50
Benchmarks- Redis VS memcached
51
Benchmarks--- How fast is Redis?
•
Redis is a server: all commands involve network or IPC roundtrips. Cost of most operations is
precisely dominated by network/protocol management.
–
•
•
Redis commands return an acknowledgment for all usual commands.
Redis is an in-memory data store with some optional persistency options. Some persistency
option would bring latency.
–
•
low latency network
huge page & SSD
Redis is a single-threaded server. It is not designed to benefit from multiple CPU cores.
People are supposed to launch several Redis instances to scale out on several cores if needed.
–
Redis favors fast CPUs with large caches and not many cores.
52
Agenda
Redis Manifesto 宣言
Data structure : strings, hashes, lists, sets and
sorted sets.
Leveraging Redis
Redis Admin and maintenance
Configure Persistence/Redis Slave/Handling a
Dataset larger than memory
Upgrade Redis/BackUp Redis/Sharding Redis/
benchmarks
The architecture of REDIS
 How Redis works
53
How Redis works
How a command received by a client is processed internally by Redis:
1.
2.
Redis uses a single thread that manages synchronously all network connection. A thin event library has
been implemented to abstract several unix system calls (epoll, select, kqueue).
Requests are managed with commands. Using a command table and according what event is read from
sockets a command handler is invoked to perform desired action.
54
Latency in Redis
•
Latency induced by network and communication
–
•
Single threaded nature of Redis
–
–
•
–
a request is slow to serve all the other clients will wait for this request to be served
commands operating on many elements, like SORT, LREM, SUNION and others. For instance taking
the intersection of two big sets can take a considerable amount of time.
run all your slow queries on replciations
Latency generated by fork
–
•
•
a mostly single threaded design ( I/O threads in background since 2.4)
all the requests are served sequentially
Latency generated by slow commands
–
–
•
use aggregated commands (MSET/MGET) and Pipelining
The fork operation (running in the main thread) can induce latency by itself.
Latency induced by swapping (operating system paging)
Latency due to AOF and disk I/O
55
Memory efficient for list

adlist.h: A generic doubly linked list implementation
typedef struct list {
listNode *head;
listNode *tail;
void *(*dup)(void *ptr);
void (*free)(void *ptr);
int (*match)(void *ptr, void *key);
unsigned int len;
} list;
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
void *value;
} listNode;


O(1) is cool but *prev/*next would take amounts of bytes if *value is few bytes.
Ziplist (list-max-ziplist-entries 512 & list-max-ziplist-value 64)
I.Save memory by using a little more CPU
II.Pack list in a single block of memory
III.Value header holds encoding / value length
IV.O(memory size) LPUSH / LPOP
V.Good fit for small payload, limited size
56
Memory efficient for hash
•
Zmap (hash-max-zipmap-entries 512 & hash-max-zipmap-value 64)
–
•
keys and values are prefixed length "objects", the lookup will take O(N) where N is the number of elements in the
zipmap and *not* the number of bytes needed to represent the zipmap.
Other data structure also have similar improve ( sort sets, intset)
57
Skip-list for sort set
1.
2.
3.
4.
5.
6.
Consists of several levels, Each level is a sorted list
All keys appear in level 1
If key x appears in level n, then it also appears in all levels below n
An element in level n points (via down pointer) to the element with same key in the level below
Each level has int_min and int_max
Top points to the smallest element in the highest level
58
Memory structure

lazy rehashing:The more operation you run into an hash table that is rhashing, the more rehashing "steps" are
performed, so if the server is idle the rehashing is never complete and some more memory is used by the hash table.

active rehashing: uses 1 millisecond every 100 milliseconds of CPU time in order to help rehashing the main Redis hash
table (the one mapping top-level keys to values).
59
memory fragmentation

Info
used_memory:21279952
memory allocated to redis
used_memory_human:20.29M
used_memory_rss:23654400
memory from OS, result of ps or top
used_memory_peak:21704152
used_memory_peak_human:20.70M
mem_fragmentation_ratio:1.11
= used_memory_rss/used_memory
mem_allocator:jemalloc-2.2.5
default in linux 2.4 and 2.6
 String:
 dictEntry(12bytes)+sds(store key)+redisObject(12bytes)+sds(store value)
Set hello word = 16(dictEtnry) + 16 (redisObject) + 16(“hello”) + 16(“world”),
60
Redis Security
1. Redis is designed to be accessed by trusted clients inside trusted environments.

Firewall on redis port
2. Redis is not optimized for maximum security but for maximum performance and simplicity.
3. Authentication feature


The password is in clear text inside redis.conf file and client configuration
AUTH command, like every other Redis command, is sent unencrypted
4. Data encryption support - None
5. Disabling of specific commands -- rename-command FLUSHALL ""
61
Agenda
Redis Manifesto 宣言
Data structure : strings, hashes, lists, sets and
sorted sets.
Leveraging Redis
Redis Admin and maintenance
The architecture of REDIS
Event library /Memory efficient
Latency /Security
Cases
 http://lloogg.com
 a simple Twitter clone
62
CASE 1: http://lloogg.com/
1.
2.
3.
List, lpush,ltrim show access history
Strings:incr show pageveiws
zset: show opt references, ref as a score
63
a simple Twitter clone
Register:
INCR global:nextUserId => 1000
SET uid:1000:username antirez
SET uid:1000:password p1pp0
Circles and posts:
SET username:antirez:uid 1000
uid:1000:followers => Set of uids of all the followers users
uid:1000:following => Set of uids of all the following user
uid:1000:posts => a List of post ids, every new post is LPUSHed here.
Cookie:
SET uid:1000:auth fea5e81ac8ca77622bed1c2132a021f9
SET auth:fea5e81ac8ca77622bed1c2132a021f9 1000
New post
INCR global:nextPostId => 10343
SET post:10343 "$owner_id|$time|I'm having fun with Retwis"
Pageing
$posts = $r->lrange($key,$start,$start+$count);
Making it horizontally scalable
1. Split by hash key
LPUSH to user’s followers
foreach($followers as $fid) {
$r->push("uid:$fid:posts",$postid,false);
}
Push to latest news:
$r->push("global:timeline",$postid,false);
$r->ltrim("global:timeline",0,1000);
64
Sina weibo
65
Summary
Redis Manifesto
 Memory #1;data structure server
Data structure :
 strings, hashes, lists, sets and sorted sets, pub sub
Leveraging Redis
 KEYS/Big O /Sort/EXPIRE/Transaction/Optimistic locking/Pipelining
Redis Admin and maintenance
 Select /Redis/Persistence/Replication/
 VM/Upgrade/BackUp/Sharding /Benchmarks
The architecture of REDIS
 Event library /Memory efficient
 Latency /Security
Cases
66
Redis
• Q&A
67
Download