(what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?
Transcript of (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?
![Page 1: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/1.jpg)
(what’s new in)
Redis 2.2October 27th 2010
Pieter Noordhuis
![Page 2: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/2.jpg)
Who am I?
• Live in Groningen, NL
• Redis contributor since March
• Backed by VMware
![Page 3: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/3.jpg)
So, what’s new?
• Memory efficiency
• Throughput improvements
• Improved EXPIRE semantics
![Page 4: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/4.jpg)
Memory efficiency(lists)
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
![Page 5: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/5.jpg)
Memory efficiency(lists)
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
![Page 6: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/6.jpg)
Memory efficiency(lists)
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
LPUSH RPUSHO(1)
![Page 7: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/7.jpg)
Memory efficiency(lists)
• O(1) is cool, but at what cost?
• Pointer overhead is constant per element
0%
25%
50%
75%
100%
64 128 192 256 320 384 448 512
Linked list memory efficiency by payload size
Payload size (bytes)
![Page 8: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/8.jpg)
The ziplist
• Save memory by using a little more CPU
• Pack list in a single block of memory
• Value header holds encoding / value length
• O(memory size) LPUSH / LPOP
Valueheader Value Value
header Value Valueheader ValueList
header
![Page 9: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/9.jpg)
The ziplist
• Linked list memory efficiency improves for larger payload. What is the gain of ziplists?
0x
2x
4x
6x
8x
10x
32 64 96 128 160 192 224 256
Ziplist memory gain by payload size
Payload size (bytes)
![Page 10: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/10.jpg)
The ziplist
• Gain of ~4x for 32 byte payload
• What is the throughput impact?
0 5000 10000 15000 20000
Time to LPUSH (32 byte payload) by list size
Tim
e
List size
ziplist linked list
![Page 11: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/11.jpg)
The ziplist
• Good fit for small payload, limited size
• Redis uses the hybrid approach
list-max-ziplist-entries (default: 1024)list-max-ziplist-value (default: 32)
![Page 12: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/12.jpg)
Memory efficiency(sets)
typedef struct dictEntry { void *key; void *val; struct dictEntry *next;} dictEntry;
Slot 0 value
Slot 1
Slot 2 value value
Slot 3 value
• Backed by a hash table
• O(1) access
• Commonly holds integers (think user IDs)
![Page 13: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/13.jpg)
Memory efficiency(sets)
• What is the cost of having the hash table?
• Only consider 8-byte integers
• Remember: lots of pointer-filled structs to guarantee O(1) lookup
![Page 14: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/14.jpg)
The intset
• Same idea as ziplist, but ordered
• Fixed width values allow binary search
• O(log N + memory size) SADD / SREM
• O(log N) SISMEMBER
IntegerIntsetheader
Integer Integer Integer Integer Integer
![Page 15: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/15.jpg)
The intset
• What is the gain of using an intset instead of a hash table (for this integer range)?
0x
5x
10x
15x
20x
0 5000 10000 15000 20000
Intset (32-bit signed integer range) memory gain by set size
Set size
![Page 16: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/16.jpg)
The intset
• Gain of ~10-15x
• What is the throughput impact?
0 5000 10000 15000 20000
Time to SADD 32-bit integer by set size
Tim
e
hash table intset
![Page 17: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/17.jpg)
The intset
• Good fit for size up to 20-50K
• As with ziplists, hybrid approach
set-max-intset-entries (default: 4096)
![Page 18: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/18.jpg)
Memory efficiency(misc.)
↓General keyspace overhead (VM enabled)
↓Sorted set metadata (~20%)
![Page 19: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/19.jpg)
Throughput
1. AE_READABLE
2. read(fd,buf);
3. while(request = parseRequest(buf)) process(request);
1. AE_WRITABLE
2. while(response = buildResponse()) write(fd,response);
![Page 20: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/20.jpg)
Throughput
(response)
• Glue responses into large chunks
• Fixed buffer per connection (7500 bytes)
• +1 for response with many bulk items
![Page 21: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/21.jpg)
Throughput
(response)
0
12500
25000
37500
50000
0 200 400 600 800 1000
LRANGE by response length
rps
2.0 2.2
![Page 22: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/22.jpg)
Throughput
(request)
• General overhaul of processing code
• Less complex & faster for multi bulk req.
0
3750
7500
11250
15000
0 100 200 300 400
MSET throughput by argument count
2.0 2.2
![Page 23: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/23.jpg)
EXPIRE(new behavior)
• Volatile keys (keys with EXPIRE set) are:
• <= 2.0: deleted on write
• >= 2.2: not touched
![Page 24: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/24.jpg)
EXPIRE(new behavior)
redis> SADD online:<timestamp> 15(integer) 1redis> EXPIRE online:<timestamp> 600(integer) 1redis> SADD online:<timestamp> 23(integer) 1redis> SADD online:<timestamp> 27(integer) 1redis> SMEMBERS online:<timestamp>1. "15"2. "23"3. "27"
![Page 25: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/25.jpg)
max-memory(purge policies)
• When max-memory is hit, purge:
• volatile key by random, TTL, LRU
• any key by random, LRU (memcached)
![Page 26: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/26.jpg)
Other things in 2.2
• Unix Sockets (tav)
• LINSERT, LPUSHX, RPUSHX (Robey Pointer)
• See “git diff 2.0.0” for things I’m forgetting...
![Page 27: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/27.jpg)
Work in progress
• hiredis: easy to use C-client that ships with a decoupled protocol parser
• Memory fragmentation (tcmalloc, slabs, ...)
![Page 28: (what’s new in) Redis 2(what’s new in) Redis 2.2 October 27th 2010 Pieter Noordhuis. Who am I?](https://reader033.fdocuments.us/reader033/viewer/2022042020/5e772ad663aee94dad64b3fd/html5/thumbnails/28.jpg)
Questions?