redisconf 2016 talk - the redis api: simple, composable, powerful

Post on 16-Jan-2017

413 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

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