SlideShare a Scribd company logo
WebエンジニアのためのはじめてのredisWebエンジニアのためのはじめてのredis
@nasa9084@nasa9084
$ whoami$ whoami
Masahiro Kitamura
@nasa9084
VirtualTech Japan Inc.
KEYWORDS: emacs python golang(new!) whiske?y
redisredis
What is "redis"?What is "redis"?
remote dictionary server
Key-Value Store (KVS)
Varied Data Structure
in-memory
having persistence
easy and fast
compatible w/Python, Ruby, …
→web engineers should learn redis!
Key-value Store (KVS)Key-value Store (KVS)
dict(Python)
hash(Perl, Ruby)
map(C++, Java, Go)
namespaces
Comparison with RDBMSsComparison with RDBMSs
Function RDBMS Redis
using simply △ ◎
high speed processing △ ◎
horizontal distribution × ◎
high availability △ ◎
persistency ◎ ○
complex query ◎ ×
transaction ◎ △
consistency ◎ △
Comparison with memcachedComparison with memcached
memcached redis
good at Cache Cache
data structure only string varied structure
persistency × ○
Disk I/O NOT DO can be disable
speed high high
multi thread ○ ×
memory efficiency △ ○
Redis Data StructureRedis Data Structure
StringString
String
replace
get length
number
INCR / DECR
max: 512MB
binary safe
can insert pictures, etc
StringString
redis python
> SET hoge fugafuga
OK
> GET hoge
"fugafuga"
> SET point 10
OK
> GET point
"10"
> INCR point
(integer) 11
> GET point
"11"
from redis import Redis
redis = Redis()
redis.set('hoge', 'fugafuga')
print(redis.get('hoge'))
#=> b'fugafuga'
redis.set('point', 10)
print(redis.get('point'))
#=> b'10'
redis.incr('point')
print(redis.get('point'))
#=> b'11'
ListList
List of Strings
Implemented with Linked List
insert or access to head or tail:
access to mid:
max size: 232-1 elements
O(1)
O(N)
ListList
redis python
> LPUSH 1 2 3
(integer) 3
> LRANGE piyo 0 -1
"3"
"2"
"1"
> LPOP piyo
"3"
> LRANGE piyo 0 -1
"2"
"1"
from redis import Redis
redis = Redis()
redis.lpush('piyo', 1, 2, 3)
print(redis.lrange('piyo', 0, -1))
#=> [b'3', b'2', b'1']
print(redis.lpop('piyo'))
#=> b'3'
print(redis.lrange('piyo', 0, -1))
#=> [b'2', b'1']
SetSet
Set of Strings
un-ordered
no duplication
add, delete, access avarage:
max size: 232-1 elements
O(1)
SetSet
redis python
> SADD foo 1 3 5
(integer) 3
> SMEMBERS foo
"1"
"3"
"5"
> SADD foo 1
(integer) 0
> SMEMBERS foo
"1"
"3"
"5"
from redis import Redis
redis = Redis()
redis.sadd('foo', 1, 3, 5)
print(redis.smembers('foo'))
#=>{b'3', b'5', b'1'}
redis.sadd('foo', 1)
print(redis.smembers('foo'))
#=>{b'3', b'5', b'1'}
Sorted Set (ZSet)Sorted Set (ZSet)
Set of Strings
no duplication
each members are ordered with its Score
take Score:
add:
O(1)
O(log N)
Sorted Set (ZSet)Sorted Set (ZSet)
redis python
> ZADD bar 20 ham
(integer) 1
> ZADD bar 10 egg
(integer) 1
> ZADD bar 30 spam
(integer) 1
> ZRANGE bar 0 -1 WITHSCORES
1) "egg"
2) "10"
3) "ham"
4) "20"
5) "spam"
6) "30"
from redis import Redis
redis = Redis()
redis.zadd('bar', 'ham', 20)
redis.zadd('bar', 'egg', 10)
redis.zadd('bar', 'spam', 30)
print(
redis.zrange('bar', 0, -1, withscores=True)
)
#=>[(b'egg', 10.0), (b'ham', 20.0), (b'spam', 30.0)]
HashHash
String to String map
Java: HashMap<String, String>
Go: ~map[string]string
add, delete, access:
max size: 232-1 pairs
O(1)
HashHash
redis python
> HSET bar 0:00 5
(integer) 1
> HGETALL bar
1) "0:00"
2) "5"
> HMSET bar 1:00 5 2:00 6
(integer) 2
> HKEYS bar
1) "0:00"
2) "1:00"
3) "2:00"
> HGET bar 0:00
"5"
from redis import Redis
redis = Redis()
redis.hset('bar', '0:00', '5')
print(redis.hgetall('bar'))
#=>{b'0:00': b'5'}
add_dict = {
'1:00': '5',
'2:00': '6'
}
redis.hmset('bar', add_dict)
print(redis.hkeys('bar'))
#=>[b'0:00', b'1:00', b'2:00]
print(redis.hget('bar', '0:00'))
#=>b'5'
UsecasesUsecases
data having expirationdata having expiration
can set expiration to key
EXPIRE key seconds
`key` is expired after `seconds` seconds
EXPIREAT key timestamp
`key` is expired on `timestamp`
for example,for example,
Session ID
One Time Token
Sample CodeSample Code
from redis import Redis
from uuid import uuid4
class User:
def generate_apikey(self):
redis = Redis(host='localhost', port=6389)
if redis.exists(self.token):
return self.token
new_apikey = 'hbt-' + str(uuid4())
ttl = 10 * 60 * 60 # 10 minutes
redis.setex(new_apikey, self.name, ttl)
self.apikey = new_apikey
return self.apikey
https://github.com/web-apps-tech/hubotmaker.git
https://hubot.web-apps.tech/
Real Time RankingReal Time Ranking
sorted set
zadd key score member
keyにscore点を持ったmemberを追加する add
a `member` that has `score` to `key`
zincrby key increment member
increment score of `member` of `key`
zrange key start stop
get `key`s members from `start` to `stop`
Sample CodeSample Code
from redis import Redis
redis = Redis()
while True:
print('input member:score> ', end='')
ipt = input()
if ipt == 'show': # command 'show'
ranking = redis.zrange('ranking', 0, 5, withscores=True)[::-1]
for i, m in enumerate(ranking):
values = {
'rank': i+1,
'member': m[0].decode(),
'point': m[1]
}
print('{rank}: {member} ({point}pt)'.format(**values))
continue
member, score = args.split(':')
redis.zadd('ranking', member, int(score))
print('good bye')
https://github.com/nasa9084/samples.git
try to use redistry to use redis
try redistry redis
http://try.redis.io/
official docker containerofficial docker container
$ docker run redis
in conclusionin conclusion
in-memory KVS
having persistency
very varied data structure
String, List, Set, Hash, SortedSet
you can try to use redis with `try redis`

More Related Content

PDF
JavaScript Code Formatting With Prettier by Christopher Chedeau
PDF
Edição de Texto Rico com React e Draft.js
PDF
DevTalks Cluj - Open-Source Technologies for Analyzing Text
PPTX
ORM in Go. Internals, tips & tricks
PDF
Практический опыт профайлинга и оптимизации производительности Ruby-приложений
PDF
Analytics with MongoDB Aggregation Framework and Hadoop Connector
PDF
quickguide-einnovator-9-redis
PDF
Redis basics
JavaScript Code Formatting With Prettier by Christopher Chedeau
Edição de Texto Rico com React e Draft.js
DevTalks Cluj - Open-Source Technologies for Analyzing Text
ORM in Go. Internals, tips & tricks
Практический опыт профайлинга и оптимизации производительности Ruby-приложений
Analytics with MongoDB Aggregation Framework and Hadoop Connector
quickguide-einnovator-9-redis
Redis basics

Similar to Webエンジニアのためのはじめてのredis (20)

PDF
Paris Redis Meetup Introduction
PDF
Redis - Usability and Use Cases
PDF
Redispresentation apac2012
PDF
Redis Workshop on Data Structures, Commands, Administration
PPTX
PPT
Introduction to redis
PPTX
Get more than a cache back! - ConFoo Montreal
PPT
PDF
Use Redis in Odd and Unusual Ways
PPT
Key Value Storage Systems ... and Beyond ... with Python
PDF
#SydPHP - The Magic of Redis
ODP
An Introduction to REDIS NoSQL database
PDF
Introduction to Redis
PDF
Introduction to Redis
PPTX
Introduction to Redis
PDF
An Introduction to Redis for .NET Developers.pdf
PDF
An Introduction to Redis for Developers.pdf
PPTX
REDIS327
PDF
Serializing Ruby Objects in Redis
PPTX
Redis database
Paris Redis Meetup Introduction
Redis - Usability and Use Cases
Redispresentation apac2012
Redis Workshop on Data Structures, Commands, Administration
Introduction to redis
Get more than a cache back! - ConFoo Montreal
Use Redis in Odd and Unusual Ways
Key Value Storage Systems ... and Beyond ... with Python
#SydPHP - The Magic of Redis
An Introduction to REDIS NoSQL database
Introduction to Redis
Introduction to Redis
Introduction to Redis
An Introduction to Redis for .NET Developers.pdf
An Introduction to Redis for Developers.pdf
REDIS327
Serializing Ruby Objects in Redis
Redis database
Ad

More from nasa9084 (14)

PDF
Webエンジニアのためのはじめてのredis.pdf
PDF
webエンジニアのためのはじめてのredis
PDF
Hubotをはじめる
PDF
Web Environments
PDF
Efsta student session
PDF
PDF
初めてのSQL
PDF
Shell入門
PDF
DIVE INTO /regexp?/
PDF
Flowchart w/program structure
PDF
HTTPのお話
PDF
エディタ戦争のお話
PDF
Linuxディストリビューションのお話
PDF
Introduction of Programming language
Webエンジニアのためのはじめてのredis.pdf
webエンジニアのためのはじめてのredis
Hubotをはじめる
Web Environments
Efsta student session
初めてのSQL
Shell入門
DIVE INTO /regexp?/
Flowchart w/program structure
HTTPのお話
エディタ戦争のお話
Linuxディストリビューションのお話
Introduction of Programming language
Ad

Recently uploaded (20)

PPT
Total quality management ppt for engineering students
PDF
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
PDF
737-MAX_SRG.pdf student reference guides
PPTX
communication and presentation skills 01
PDF
Level 2 – IBM Data and AI Fundamentals (1)_v1.1.PDF
PDF
A SYSTEMATIC REVIEW OF APPLICATIONS IN FRAUD DETECTION
PDF
Integrating Fractal Dimension and Time Series Analysis for Optimized Hyperspe...
PPT
A5_DistSysCh1.ppt_INTRODUCTION TO DISTRIBUTED SYSTEMS
PDF
Exploratory_Data_Analysis_Fundamentals.pdf
PDF
Soil Improvement Techniques Note - Rabbi
PDF
Visual Aids for Exploratory Data Analysis.pdf
PPTX
Nature of X-rays, X- Ray Equipment, Fluoroscopy
PDF
III.4.1.2_The_Space_Environment.p pdffdf
PDF
null (2) bgfbg bfgb bfgb fbfg bfbgf b.pdf
PPT
INTRODUCTION -Data Warehousing and Mining-M.Tech- VTU.ppt
PDF
UNIT no 1 INTRODUCTION TO DBMS NOTES.pdf
PDF
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
PDF
SMART SIGNAL TIMING FOR URBAN INTERSECTIONS USING REAL-TIME VEHICLE DETECTI...
PDF
Analyzing Impact of Pakistan Economic Corridor on Import and Export in Pakist...
PPTX
Safety Seminar civil to be ensured for safe working.
Total quality management ppt for engineering students
The CXO Playbook 2025 – Future-Ready Strategies for C-Suite Leaders Cerebrai...
737-MAX_SRG.pdf student reference guides
communication and presentation skills 01
Level 2 – IBM Data and AI Fundamentals (1)_v1.1.PDF
A SYSTEMATIC REVIEW OF APPLICATIONS IN FRAUD DETECTION
Integrating Fractal Dimension and Time Series Analysis for Optimized Hyperspe...
A5_DistSysCh1.ppt_INTRODUCTION TO DISTRIBUTED SYSTEMS
Exploratory_Data_Analysis_Fundamentals.pdf
Soil Improvement Techniques Note - Rabbi
Visual Aids for Exploratory Data Analysis.pdf
Nature of X-rays, X- Ray Equipment, Fluoroscopy
III.4.1.2_The_Space_Environment.p pdffdf
null (2) bgfbg bfgb bfgb fbfg bfbgf b.pdf
INTRODUCTION -Data Warehousing and Mining-M.Tech- VTU.ppt
UNIT no 1 INTRODUCTION TO DBMS NOTES.pdf
keyrequirementskkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
SMART SIGNAL TIMING FOR URBAN INTERSECTIONS USING REAL-TIME VEHICLE DETECTI...
Analyzing Impact of Pakistan Economic Corridor on Import and Export in Pakist...
Safety Seminar civil to be ensured for safe working.

Webエンジニアのためのはじめてのredis

  • 2. $ whoami$ whoami Masahiro Kitamura @nasa9084 VirtualTech Japan Inc. KEYWORDS: emacs python golang(new!) whiske?y
  • 4. What is "redis"?What is "redis"? remote dictionary server Key-Value Store (KVS) Varied Data Structure in-memory having persistence easy and fast compatible w/Python, Ruby, … →web engineers should learn redis!
  • 5. Key-value Store (KVS)Key-value Store (KVS) dict(Python) hash(Perl, Ruby) map(C++, Java, Go) namespaces
  • 6. Comparison with RDBMSsComparison with RDBMSs Function RDBMS Redis using simply △ ◎ high speed processing △ ◎ horizontal distribution × ◎ high availability △ ◎ persistency ◎ ○ complex query ◎ × transaction ◎ △ consistency ◎ △
  • 7. Comparison with memcachedComparison with memcached memcached redis good at Cache Cache data structure only string varied structure persistency × ○ Disk I/O NOT DO can be disable speed high high multi thread ○ × memory efficiency △ ○
  • 8. Redis Data StructureRedis Data Structure
  • 9. StringString String replace get length number INCR / DECR max: 512MB binary safe can insert pictures, etc
  • 10. StringString redis python > SET hoge fugafuga OK > GET hoge "fugafuga" > SET point 10 OK > GET point "10" > INCR point (integer) 11 > GET point "11" from redis import Redis redis = Redis() redis.set('hoge', 'fugafuga') print(redis.get('hoge')) #=> b'fugafuga' redis.set('point', 10) print(redis.get('point')) #=> b'10' redis.incr('point') print(redis.get('point')) #=> b'11'
  • 11. ListList List of Strings Implemented with Linked List insert or access to head or tail: access to mid: max size: 232-1 elements O(1) O(N)
  • 12. ListList redis python > LPUSH 1 2 3 (integer) 3 > LRANGE piyo 0 -1 "3" "2" "1" > LPOP piyo "3" > LRANGE piyo 0 -1 "2" "1" from redis import Redis redis = Redis() redis.lpush('piyo', 1, 2, 3) print(redis.lrange('piyo', 0, -1)) #=> [b'3', b'2', b'1'] print(redis.lpop('piyo')) #=> b'3' print(redis.lrange('piyo', 0, -1)) #=> [b'2', b'1']
  • 13. SetSet Set of Strings un-ordered no duplication add, delete, access avarage: max size: 232-1 elements O(1)
  • 14. SetSet redis python > SADD foo 1 3 5 (integer) 3 > SMEMBERS foo "1" "3" "5" > SADD foo 1 (integer) 0 > SMEMBERS foo "1" "3" "5" from redis import Redis redis = Redis() redis.sadd('foo', 1, 3, 5) print(redis.smembers('foo')) #=>{b'3', b'5', b'1'} redis.sadd('foo', 1) print(redis.smembers('foo')) #=>{b'3', b'5', b'1'}
  • 15. Sorted Set (ZSet)Sorted Set (ZSet) Set of Strings no duplication each members are ordered with its Score take Score: add: O(1) O(log N)
  • 16. Sorted Set (ZSet)Sorted Set (ZSet) redis python > ZADD bar 20 ham (integer) 1 > ZADD bar 10 egg (integer) 1 > ZADD bar 30 spam (integer) 1 > ZRANGE bar 0 -1 WITHSCORES 1) "egg" 2) "10" 3) "ham" 4) "20" 5) "spam" 6) "30" from redis import Redis redis = Redis() redis.zadd('bar', 'ham', 20) redis.zadd('bar', 'egg', 10) redis.zadd('bar', 'spam', 30) print( redis.zrange('bar', 0, -1, withscores=True) ) #=>[(b'egg', 10.0), (b'ham', 20.0), (b'spam', 30.0)]
  • 17. HashHash String to String map Java: HashMap<String, String> Go: ~map[string]string add, delete, access: max size: 232-1 pairs O(1)
  • 18. HashHash redis python > HSET bar 0:00 5 (integer) 1 > HGETALL bar 1) "0:00" 2) "5" > HMSET bar 1:00 5 2:00 6 (integer) 2 > HKEYS bar 1) "0:00" 2) "1:00" 3) "2:00" > HGET bar 0:00 "5" from redis import Redis redis = Redis() redis.hset('bar', '0:00', '5') print(redis.hgetall('bar')) #=>{b'0:00': b'5'} add_dict = { '1:00': '5', '2:00': '6' } redis.hmset('bar', add_dict) print(redis.hkeys('bar')) #=>[b'0:00', b'1:00', b'2:00] print(redis.hget('bar', '0:00')) #=>b'5'
  • 20. data having expirationdata having expiration can set expiration to key EXPIRE key seconds `key` is expired after `seconds` seconds EXPIREAT key timestamp `key` is expired on `timestamp`
  • 21. for example,for example, Session ID One Time Token
  • 22. Sample CodeSample Code from redis import Redis from uuid import uuid4 class User: def generate_apikey(self): redis = Redis(host='localhost', port=6389) if redis.exists(self.token): return self.token new_apikey = 'hbt-' + str(uuid4()) ttl = 10 * 60 * 60 # 10 minutes redis.setex(new_apikey, self.name, ttl) self.apikey = new_apikey return self.apikey https://github.com/web-apps-tech/hubotmaker.git https://hubot.web-apps.tech/
  • 23. Real Time RankingReal Time Ranking sorted set zadd key score member keyにscore点を持ったmemberを追加する add a `member` that has `score` to `key` zincrby key increment member increment score of `member` of `key` zrange key start stop get `key`s members from `start` to `stop`
  • 24. Sample CodeSample Code from redis import Redis redis = Redis() while True: print('input member:score> ', end='') ipt = input() if ipt == 'show': # command 'show' ranking = redis.zrange('ranking', 0, 5, withscores=True)[::-1] for i, m in enumerate(ranking): values = { 'rank': i+1, 'member': m[0].decode(), 'point': m[1] } print('{rank}: {member} ({point}pt)'.format(**values)) continue member, score = args.split(':') redis.zadd('ranking', member, int(score)) print('good bye') https://github.com/nasa9084/samples.git
  • 25. try to use redistry to use redis
  • 27. official docker containerofficial docker container $ docker run redis
  • 28. in conclusionin conclusion in-memory KVS having persistency very varied data structure String, List, Set, Hash, SortedSet you can try to use redis with `try redis`