29
Fabrizio Farinacci

Redis - Usability and Use Cases

Embed Size (px)

Citation preview

Page 1: Redis - Usability and Use Cases

Fabrizio Farinacci

Page 2: Redis - Usability and Use Cases

!!!!i!

i iiiiii i iii iii

i i i i sssss

1

Page 3: Redis - Usability and Use Cases

1. What is Redis?REmote DIctionary Server

2

Page 4: Redis - Usability and Use Cases

“ is an in-memory data structure store, that can be served as a database, cache or message broker (Pub/Sub).

3

Page 5: Redis - Usability and Use Cases

?!?i?eii!i?!i?ei!

4

Page 6: Redis - Usability and Use Cases

… a ‘‘data structure server’’?

Redis is essentially a key-value database… but it’s NOT a plain key-value database: it’s not limited to string values, but can also hold complex data structures.

5

Page 7: Redis - Usability and Use Cases

2. Supported Data Types

6

Page 8: Redis - Usability and Use Cases

Strings

Command line:> set mystr fooOK> set myint 1OK> get mystr"foo"> append mystr foo(integer) 6> incr myint(integer) 2> mget mystr myint1) "foofoo"2) "2"

Are key-value pairs, to store strings or integers, with:□Common operations on strings (APPEND, STRLEN, exc.);□Atomic increment/decrement (INCR/DECR) on integers; □Get multiple values at once (MGET).

Python:>>> import redis>>> r = redis.StrictRedis(

host='localhost',port=6379, db=0

)>>> r.set('mystr', 'foo')True>>> r.set('myint', 1)True>>> r.get('mystr')'foo'>>> r.append('mystr', 'foo')6L>>> r.incr('myint')2>>> r.mget('mystr', 'myint')['foofoo', '2']

7

Page 9: Redis - Usability and Use Cases

ListsAre linked-lists of strings: □Index-based access to the entries;□Insertion and deletion at head/tail,in constant-time (push/pop);□Trim/Range operations available.

8

Page 10: Redis - Usability and Use Cases

Interactingwith Lists

Command line:> rpush mylist A(integer) 1> rpush mylist B(integer) 2> lpush mylist first(integer) 3> lrange mylist 0 ‐11) "first"2) "A"3) "B"> lrange mylist 1 31) "A"2) "B"

Python:>>> import redis>>> r = redis.StrictRedis(

host='localhost',port=6379, db=0

)>>> r.rpush('mylist', 'A')1L>>> r.rpush('mylist', 'B')2L>>> r.lpush('mylist', 'first')3L>>> r.lrange('mylist', 0, ‐1)['first', 'A', 'B']>>> r.lrange('mylist', 1, 3)['A', 'B']

9

Page 11: Redis - Usability and Use Cases

SetsAre sets of strings:□Unordered collection of non-repeating elements;□Intersection/Union/Differencebetween multiple sets;□Membership test available.

10

Page 12: Redis - Usability and Use Cases

Interactingwith Sets

Command line:> sadd myset A(integer) 1> sadd myset B(integer) 1> sadd myset2 C(integer) 1> sismember myset C(integer) 0> smembers myset1) "A"2) "B"> sunion myset myset21) "A"2) "B"3) "C"

Python:>>> import redis>>> r = redis.StrictRedis(

host='localhost',port=6379, db=0

)>>> r.sadd('myset', 'A')1>>> r.sadd('myset', 'B')1>>> r.sadd('myset2', 'C')1>>> r.sismember('myset', 'C')False>>> r.smembers('myset')set(['A', 'B']) >>> r.sunion('myset', 'myset2')set(['A', 'C', 'B'])

11

Page 13: Redis - Usability and Use Cases

Sorted Set (ZSET)12

Are sorted sets of strings:□Collection of non-repeating elementssorted by floating-point numbers(the score) and lexicographically;□Range operations on score/lexicon;□Intersection/Union between sets.

Page 14: Redis - Usability and Use Cases

Interacting with ZSETs

Command line:> zadd myzset 2 C(integer) 1> zadd myzset 3 D(integer) 1> zadd myzset 1 A(integer) 1> zadd myzset 2 B(integer) 1> zrange myzset 0 ‐11) "A" 2) "B" 3) "C" 4) "D"> zrangebyscore myzset 1 21) "A" 2) "B" 3) "C"> zrangebylex myzset (A [D 1) "B" 2) "C" 3) "D"

Python:>>> import redis>>> r = redis.StrictRedis(

host='localhost',port=6379, db=0

)>>> r.zadd('myzset', 2, 'C')1>>> r.zadd('myzset', 3, 'D') 1>>> r.zadd('myzset', A=1) 1>>> r.zadd('myzset', B=2) 1>>> r.zrange('myzset', 0, ‐1) ['A', 'B', 'C', 'D']>>> r.zrangebyscore('myzset', 1, 2) ['A', 'B', 'C'] >>> r.zrangebylex('myzset', '(A', '[D') ['B', 'C', 'D']

13

Page 15: Redis - Usability and Use Cases

HashA map of field-value pairs:□Key-based access, specifyingselected field or fields;□To implement objects, specifyingthe name of the field and its value.

14

Page 16: Redis - Usability and Use Cases

Interactingwith Hashes

Command line:> hset myhash key1 A(integer) 1> hmset myhash key2 B key3 COK> hget myhash key2"B"> hmget myhash key1 key31) "A"2) "C"> hgetall myhash1) "key1"2) "A"3) "key2"4) "B"5) "key3"6) "C"

Python:>>> import redis>>> r = redis.StrictRedis(

host='localhost',port=6379, db=0

)>>> r.hset('myhash', 'key1', 'A') 1L>>> r.hmset('myhash',

{'key2':'B', 'key3':'C'} ) True>>> r.hget('myhash', 'key2')'B'>>> r.hmget('myhash', 'key1', 'key3')  ['A', 'C']>>> r.hgetall('myhash'){'key3': 'C', 'key2': 'B', 'key1': 'A'}

15

Page 17: Redis - Usability and Use Cases

AdditionalData Structures

Bitmap: A set of bit-oriented operations (e.g. GETBIT/SETBIT) to manipulate string values as blobs of size up to 512 MB.

HyperLogLog: A probabilistic data structure structure to estimate size of sets (i.e. counting unique elements) efficiently and in constant-space.

Geo: Geospatial items, stored as geospatial indexes (in sorted indexes). Support for distance based operations (eg. GEODIST) and radius queries(GEORADIUS). Available only in the BETA testing version (3.2.0).

16

Page 18: Redis - Usability and Use Cases

3. Personal Project

17

Page 19: Redis - Usability and Use Cases

RedisPub/Sub18

To implement the Publish/Subscribe paradigm:□Published messages (PUBLISH) are categorizedinto channels and pushed to all the subscribers(SUBSCRIBE).□Publisher and subscriber are completelydecoupled: advantages are high scalability anddynamic network features.

Page 20: Redis - Usability and Use Cases

Place your screenshot here

□ Redis Pub/Sub channels are exploited as thematic channels(EG. Sport, Tv Shows, exc.).□ Users subscribe to the channels they’re interested in.□ Once the web-chat session is started the user can:■ Receive messages published on the channels of interest;■ Publish messages onto selected channels.

Redis SubsChat: A multi-thematic web-chat

19

Page 21: Redis - Usability and Use Cases

How it hasbeen done?

import redis# At the beginning, to setup the Redis interface object r = redis.StrictRedis(host='localhost', port=6379, db=0) ...# When start is pressed, the session startsdef on_start():

pubsub = r.pubsub() # Disable Widgets and manage subscriptions...ui.checkBox.setEnabled(False)if ui.checkBox.isChecked(): # Setup the the handler for the subscriber tasks

pubsub.subscribe(**{str(ui.checkBox.text()): mess_handler}) ... # This is done for all the checklists...# Run the receiver tasks into a parallel thread ... thread = pubsub.run_in_thread(sleep_time=0.001)

...

20

Page 22: Redis - Usability and Use Cases

How it hasbeen done? (2)

...# Handler that pushes the received message onto the web‐chat def mess_handler(message):QtCore.QMetaObject.invokeMethod(ui.textEdit, "append",QtCore.Q_ARG(str, str(message['data'])+'\n')) ... # To send a message when send is presseddef on_send(): 

# Get the info about the message from the UI msg = str(ui.textEdit_2.toPlainText()) if len(msg) > 0:

usrname = str(ui.lineEdit.text())if len(usrname) == 0:

usrname = '<Anonymous>' channel = str(ui.comboBox.currentText())ui.textEdit_2.clear() message = ‘%s [%s]: %s' % (usrname, channel, msg) # Publish the message onto the specified channel r.publish(channel, message)

...

21

Page 23: Redis - Usability and Use Cases

How it hasbeen done? (3)

...def on_stop(): 

# Re‐enable the disabled widgets...ui.checkBox_2.setEnabled(True)... # This is done for all the checklists ...pubsub.close() 

... if __name__ == "__main__": 

# To setup the UI and make the application runimport sysapp = QtGui.QApplication(sys.argv)  MainWindow = QtGui.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow)  MainWindow.show() sys.exit(app.exec_())

22

Page 24: Redis - Usability and Use Cases

Live Demo

Let’s see how it works!!

23

Page 25: Redis - Usability and Use Cases

4. Use casesWhen should we use it?

24

Page 26: Redis - Usability and Use Cases

Performances and usability

Redis is an in-memory database, persistent on disk.

PROs:□Faster reads and writes: allhappens in memory. Atransaction is consideredcommitted without the need ofwriting on the disk.□Simple complex datastructure manipulation: allis in memory; lower complexity.□Efficient persistencymanagement: snapshotting orjournal mode.

CONs:□Suitable for small datasets,of size up to memory capacity.□Not suitable for applicationwhere durability is a crucialaspect.

25

Page 27: Redis - Usability and Use Cases

When itshould be used? We Should use it if:

□Small datasets thatfits in memory: veryhigh performance,similar to a cache.□Assumptions ondata structures andqueries: to takeadvantage of thesupported data types.□Realize a cachelayer: for example, tospeedup a conventionalRDBMS.

We Shouldn’t use it if:□Frequent schemachanges: a traditionalkey-value approach, withthe schema managed bythe application, would bepreferred.□Prototyping: don’twant to waste loads oftime in the design of thedatabase and have theapplication soon ready.□Durability criticalapplications: like seatbooking mechanism.

26

Page 28: Redis - Usability and Use Cases

Who’s usingRedis?

And many others!

27

Page 29: Redis - Usability and Use Cases

thanks!Any questions?

You can find me at:https://it.linkedin.com/in/fabrizio-farinacci-496679116

https://github.com/FabFari/redis-subschat

?

28