redisconf 2016 talk - the redis api: simple, composable, powerful
Post on 16-Jan-2017
407 Views
Preview:
TRANSCRIPT
Copyright 2016 DynomiteDB
The Redis APISimple, Composable, Powerful
Akbar S. Ahmed@DynomiteDB
Copyright 2016 DynomiteDB
Simple
Copyright 2016 DynomiteDB
RESP (Redis protocol)
GETSETLSET ZUNION
Redis server
Redis API
Copyright 2016 DynomiteDB
RESP
GETSETLSET ZUNION
Pluggable backends Pluggable backendsPluggable backends
Redis API
Copyright 2016 DynomiteDB
Schema
Copyright 2016 DynomiteDB
Schema
SELECT firstnameFROM userwhere id = 7
user:id=7key
Copyright 2016 DynomiteDB
Data types
StringListSetSorted SetHash
Copyright 2016 DynomiteDB
String
h e l l o
greeting:english
Sequence of bytesX
Copyright 2016 DynomiteDB
String
h e l l o
GETSET
SETRANGEGETRANGE
greeting:english
STRLEN
APPEND
Copyright 2016 DynomiteDB
String with Integer value
3 5 7 8 4metrics:dau
INCR DECR
INCRBY DECRBY
Copyright 2016 DynomiteDB
String with Float value
3 . 1 4 1pie
INCRBYFLOAT
Copyright 2016 DynomiteDB
Listweb:signups
Bob Barney Ash
Ordered by insertionX
Duplicates allowedX
Fast head/tail operationsX
Copyright 2016 DynomiteDB
List commands
Bob Barney AshLPUSH
LPOP
RPUSH
RPOP
LRANGELTRIM
Copyright 2016 DynomiteDB
Setemployees
Bob
Jane
DavidUnorderedXUnique membersX
Set operationsX
Copyright 2016 DynomiteDB
SetSADDSREMSPOP
SISMEMBER
Bob
David
JaneSCARD
SuePam
SINTER
SUNION
SDIFF
Copyright 2016 DynomiteDB
Sorted set blog:posts:vote
sRESP 5High
availability24
Caching 350Redis API 467
Ordered by scoreXUnique membersX
Set operationsX
Copyright 2016 DynomiteDB
Sorted set
RESP 5High
availability24
Caching 350Redis API 467
ZADD
ZCARD
ZRANGEZREVRANGE
ZRANGEBYLEX
ZRANGEBYSCORE
ZCOUNTZLEXCOUNT
ZINCRBY
ZRANKZSCORE
ZINTERSTOREZUNIONSTORE
Copyright 2016 DynomiteDB
Hash company:id=7
Key ValueName Apple
Revenue 233BState CACity Cupertino
UnorderedXUnique membersX
Copyright 2016 DynomiteDB
Hash
Key ValueName Apple
Revenue 233BState CACity Cupertino
HGET / HMGET
HSET / HMSET
HKEYSHGETALL
Copyright 2016 DynomiteDB
Ordered Unique
Best for
String Index No ● Cache (text, JSON, binary)
● CountingList Insertio
nNo ● Fast head/tail operations
● Recent items
Set No Yes ● Existence / membership● Set operations
Sorted set
Score Yes ● Top x items● Set operations
Hash No Yes ● Cache● Database row / document
Copyright 2016 DynomiteDB
Simple, Composable, Powerful
Copyright 2016 DynomiteDB
Redis APICRM app
Database
Cache
Use case
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDB
if (sort === 'az') { // Get the first 10 companies sorted alphabetically cache.zrange(murmurhash.v2('companies:atoz'), 0, 9, handler);} else if (sort === 'revenue') { // Get the reverse range: sorted = high to low revenue cache.zrevrange(murmurhash.v2('companies:rev'), 0, 9, handler);} else if (sort === 'recent') { cache.lrange(murmurhash.v2('companies:recent'), 0, 9, handler);}
View Companies
Copyright 2016 DynomiteDB
handler()if (reply) { async.map(reply, getDetails, displayCompanies);} else { if (sort === 'az') { db.zrange(murmurhash.v2('companies:atoz'), 0, 9, handler); } else if (sort === 'revenue') { db.zrevrange(murmurhash.v2('companies:rev'), 0, 9, handler); } else if (sort === 'recent') { db.lrange(murmurhash.v2('companies:recent'), 0, 9, handler); }}
Copyright 2016 DynomiteDB
getDetails()cache.hgetall(key.getKeyHash(company), function(err, reply) { if (reply) { reply.slug = slug(reply.name.toLowerCase()); reply.qualified = (reply.qualified === 'true'); } else { db.hgetall(key.getKeyHash(company), ...); } cb(null, reply)});
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDB
Generate key// Generate text keyvar keyText = 'company:name=' + slug(company.name);
// Generate hashed keyvar keyHash = murmurhash.v2(keyText);
Copyright 2016 DynomiteDB
Save companycache.hmset(keyHash, 'name', company.name, 'phone', company.phone, 'website', company.website, 'revenue', company.revenue, 'step', company.step, 'qualified', company.qualified.toString(), saveToRecentCompanies);
db.hmset(....)
Copyright 2016 DynomiteDB
saveToRecentCompanies()cache.lpush( murmurhash.v2('companies:recent'), company.name, saveToAlphabetical);
db.lpush( murmurhash.v2('companies:recent'), company.name, saveToAlphabetical);
Copyright 2016 DynomiteDB
saveToAlphabetical()cache.zadd( murmurhash.v2('companies:alphabetical'), 1, company.name, saveToRevenue);
db.zadd( murmurhash.v2('companies:alphabetical'), 1, company.name, saveToRevenue);
Copyright 2016 DynomiteDB
saveToRevenue()cache.zadd( murmurhash.v2('companies:revenue'), company.revenue, company.name, renderNextPage);
db.zadd( murmurhash.v2('companies:revenue'), company.revenue, Company.name, renderNextPage);
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDB
Company detailscache.hgetall(key.getKeyHash(req.params.slug), showCompany);
Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB
Copyright 2016 DynomiteDB
Edit companyUpdating a company reuses 100% of the save company database and cache code.
Copyright 2016 DynomiteDB
Thank you
https://github.com/DynomiteDB/redisconf-2016-nodejshttps://github.com/DynomiteDB/redisconf-2016-go (soon)
https://github.com/DynomiteDB/crm-nodejs (soon)Java coming soon. Follow on Twitter for updates.
@DynomiteDB
top related