Fun with Ruby and Redis
-
Upload
javier-ramirez -
Category
Technology
-
view
116 -
download
0
description
Transcript of Fun with Ruby and Redis
![Page 1: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/1.jpg)
Javier Ramírez@supercoco9
Fun with
and
![Page 2: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/2.jpg)
What?Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. (http://redis.io)
Salvatore Sanfilippo@antirez
Pieter Noordhuis
@pnoordhuis
95 contributors at https://github.com/antirez/redis
Who?
![Page 3: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/3.jpg)
The Redis Manifesto
1.A DSL for Abstract Data Types2.Memory storage is #13.Fundamental data structures for a fundamental API4.Two levels of API5.Code is like a poem; it's not just something we write to reach some practical result6.We're against complexity7.We optimize for joy
![Page 4: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/4.jpg)
Redis
is fast
![Page 5: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/5.jpg)
unscientific benchmarks*
*on an AWS micro instance with the default install for postgresql and redis
PostgreSQL Redis
1K inserts 3.9s 0.07s
1K reads 0.113s 0.06s
10K inserts 42.9s 0.67s
10K reads 1.15s 0.6s
100K inserts 6.8m 7s
100K reads 11.59s 6.06s
100K pipelined
inserts
- 1.45s
100K pipelined
reads
- 1.22s
![Page 6: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/6.jpg)
Redis is game changing
Disclaimer: after using it, you'll find yourself doing things you wouldn't do before
![Page 7: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/7.jpg)
Some will not make sense
As every other technology, Redis has itssweet spot, but it's not a silver bullet
![Page 8: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/8.jpg)
Abusing sidekiq/RESQUE
![Page 9: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/9.jpg)
In memory data store
Redis stores all the data in memory all the time. Plan your architecture accordingly
![Page 10: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/10.jpg)
Persistance: RDB
Compact binary formatSaves snapshots every few minutesGood for backups and synchronizingIf Redis crashes, a few minutes worth of data will be lost
![Page 11: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/11.jpg)
Durability: AOFLog text formatConfigurable durabilityLarge file, can slow down startupIf Redis crashes, typically one second of data could be lost
![Page 12: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/12.jpg)
Connecting from Ruby
redis-rb exposes calls to all the methods in the redis protocol
other useful gems:github.com/soveran/nest => helps with key naminghttps://github.com/soveran/ohm => “ORM” for redisgithub.com/obie/redis_props => properties for AR objectsgithub.com/nateware/redis-objects => map redis types to ruby
objects github.com/agoragames/amico => redis-backed friendships
![Page 13: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/13.jpg)
DATA TYPESStringsHashesListsSetsSorted Sets
Key handlingTransactionsScriptingPub/SubServerConnection
untyped operations
![Page 14: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/14.jpg)
STRING commands
string commandsappend, get, getset, setgetrange, setrange, strlenbitcount, bitop, getbit, setbitmget, mset, msetnxsetnx, setex, psetexincr, incrby, incrbyfloat, decr, decrby, decrbyfloat
![Page 15: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/15.jpg)
LIST commands
llen, lindex, linsert, lrange, lrem, lset, ltrimlpop, lpush, lpushx, rpop, , rpush, rpushxblpop, brpop rpoplpush, brpoplpush
List commands
![Page 16: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/16.jpg)
Hash commands
hkeys, hvals, hlen, hgetall, hexists
hmget, hmsethdel, hget, hset, hsetnxhincrby, hincrbyfloat
at the hash level
at the attribute level
![Page 17: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/17.jpg)
Set commands
sadd, scard, smembers, sismember, srem, smove, srandmember, smovesdiff, sinter, sunionsdiffstore, sinterstore, sunionstore
Set commands
![Page 18: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/18.jpg)
team.euruko.users javier diego matz nikos
team.teowaki.users javier diego alberto
team.euruko location:greece contact:nikos edition:2013
team.teowaki location:london contact:diego
tags.matz ruby mruby
tags.nikos ruby css
tags.javier ruby
tags.diego ruby chef
users.javier.teams euruko teowaki
users.alberto.teams teowaki
users.nikos.teams euruko
users.matz.teams euruko
users.diego.teams euruko teowaki
r.sunion r.smembers('team.euruko').map{|m| "tags.#{m}"}=>["mruby", "ruby", "css", "chef"] r.sinter r.smembers('team.euruko').map{|m| "tags.#{m}"}=>["ruby"] r.diff r.smembers('team.euruko').map{|m| "tags.#{m}"}=>["mruby", "css", "chef"]
![Page 19: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/19.jpg)
sorted Set commands
zadd, zcard, zcount zincrby, zrank, zrem,zrevrank, zscorezrange, zrangebyscore, zremrangebyrank, zrevrangebyscore, zrevrange, zrevrangebyscore zinterstore, zunionstore
Sorted set commands
![Page 20: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/20.jpg)
countersAtomic counters can be safely invoked concurrently from anywhere
You can create global sequences with counters. Redis-objects block semantics allow for rewinding on errors
![Page 21: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/21.jpg)
Scripting with lua*You can use Lua for scripting Redis when you need to atomically execute a sequence of commands in which the output of a command is used as input for another
It reduces the need to use complex lock mechanisms and simplifies dependencies between clients
You can even extend the functionality of Redis by using Lua scripts
* no, mruby won't be supported
![Page 22: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/22.jpg)
LUA exampleExpiring attributes inside a Redis hash*
1
2
4
5
3
![Page 23: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/23.jpg)
Temporary data
Very simple to implement usage quota patterns (even better if done in Lua)
It's possible to set self-expiring keys
![Page 24: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/24.jpg)
Redis as a cache
maxmemory 128mbmaxmemory-policy allkeys-lru
#save 900 1#save 300 10#save 60 10000
Expire keys individually or turn off persistence and use Redis as a cache system with automatic eviction
Multiple levels of cache by using Redis on the webserver/middleware layer
http://wiki.nginx.org/HttpRedishttps://github.com/jodosha/redis-store
![Page 25: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/25.jpg)
Redis as a PUBSUB system
![Page 26: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/26.jpg)
redsmin: remote Monitor
![Page 27: Fun with Ruby and Redis](https://reader033.fdocuments.in/reader033/viewer/2022061223/54c676d84a7959b6298b459e/html5/thumbnails/27.jpg)
Shameless self promotion If you enjoyed this presentation, please thank me by
registering on http://teowaki.com
It's a site for developers, you can hang around for free, and I think it's quite cool
<3 <3 <3Javier Ramírez
@supercoco9