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

40
Copyright 2016 DynomiteDB The Redis API Simple, Composable, Powerful Akbar S. Ahmed @DynomiteDB

Upload: dynomitedb

Post on 16-Jan-2017

412 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

The Redis APISimple, Composable, Powerful

Akbar S. Ahmed@DynomiteDB

Page 2: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Simple

Page 3: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

RESP (Redis protocol)

GETSETLSET ZUNION

Redis server

Redis API

Page 4: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

RESP

GETSETLSET ZUNION

Pluggable backends Pluggable backendsPluggable backends

Redis API

Page 5: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Schema

Page 6: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Schema

SELECT firstnameFROM userwhere id = 7

user:id=7key

Page 7: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Data types

StringListSetSorted SetHash

Page 8: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

String

h e l l o

greeting:english

Sequence of bytesX

Page 9: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

String

h e l l o

GETSET

SETRANGEGETRANGE

greeting:english

STRLEN

APPEND

Page 10: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

String with Integer value

3 5 7 8 4metrics:dau

INCR DECR

INCRBY DECRBY

Page 11: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

String with Float value

3 . 1 4 1pie

INCRBYFLOAT

Page 12: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Listweb:signups

Bob Barney Ash

Ordered by insertionX

Duplicates allowedX

Fast head/tail operationsX

Page 13: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

List commands

Bob Barney AshLPUSH

LPOP

RPUSH

RPOP

LRANGELTRIM

Page 14: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Setemployees

Bob

Jane

DavidUnorderedXUnique membersX

Set operationsX

Page 15: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

SetSADDSREMSPOP

SISMEMBER

Bob

David

JaneSCARD

SuePam

SINTER

SUNION

SDIFF

Page 16: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Sorted set blog:posts:vote

sRESP 5High

availability24

Caching 350Redis API 467

Ordered by scoreXUnique membersX

Set operationsX

Page 17: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Sorted set

RESP 5High

availability24

Caching 350Redis API 467

ZADD

ZCARD

ZRANGEZREVRANGE

ZRANGEBYLEX

ZRANGEBYSCORE

ZCOUNTZLEXCOUNT

ZINCRBY

ZRANKZSCORE

ZINTERSTOREZUNIONSTORE

Page 18: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Hash company:id=7

Key ValueName Apple

Revenue 233BState CACity Cupertino

UnorderedXUnique membersX

Page 19: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Hash

Key ValueName Apple

Revenue 233BState CACity Cupertino

HGET / HMGET

HSET / HMSET

HKEYSHGETALL

Page 20: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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

Page 21: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Simple, Composable, Powerful

Page 22: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Redis APICRM app

Database

Cache

Use case

Page 23: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 24: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 25: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 26: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 27: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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

Page 28: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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); }}

Page 29: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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)});

Page 30: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 31: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Generate key// Generate text keyvar keyText = 'company:name=' + slug(company.name);

// Generate hashed keyvar keyHash = murmurhash.v2(keyText);

Page 32: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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(....)

Page 33: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

saveToRecentCompanies()cache.lpush( murmurhash.v2('companies:recent'), company.name, saveToAlphabetical);

db.lpush( murmurhash.v2('companies:recent'), company.name, saveToAlphabetical);

Page 34: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

saveToAlphabetical()cache.zadd( murmurhash.v2('companies:alphabetical'), 1, company.name, saveToRevenue);

db.zadd( murmurhash.v2('companies:alphabetical'), 1, company.name, saveToRevenue);

Page 35: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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);

Page 36: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 37: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Company detailscache.hgetall(key.getKeyHash(req.params.slug), showCompany);

Page 38: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDBCopyright 2016 DynomiteDB

Page 39: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

Copyright 2016 DynomiteDB

Edit companyUpdating a company reuses 100% of the save company database and cache code.

Page 40: RedisConf 2016 talk - The Redis API: Simple, Composable, Powerful

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