Slide 1

Slide 1 text

Redis More than a KEY-VALUE STORAGE

Slide 2

Slide 2 text

About Me Name: Alexander Schranz Company: Sulu GmbH Technologies: Symfony (PHP), React (JS), Elasticsearch, Redis https:/ /twitter.com/alex_s_ https:/ /github.com/alexander-schranz/

Slide 3

Slide 3 text

Getting started with Redis MacOSX brew install redis redis-server Linux apt-get install redis-server redi-server Of course there is also a official redis:5.0 docker image.

Slide 4

Slide 4 text

Install Clients BASH apt-get install redis-cli PHP pecl install redis

Slide 5

Slide 5 text

Connect to Redis PHP $redis = new \Redis(); $redis->connect(‘127.0.0.1’, ‘6379’); BASH > redis-cli -h 127.0.0.1 -p 6379

Slide 6

Slide 6 text

Using Redis as Key / Value Storage PHP $redis->set(’KEY’, ‘VALUE’); $redis->get(’KEY’); // VALUE $redis->del(’KEY’); // 1/0 BASH > SET KEY VALUE > GET KEY # VALUE > DEL KEY # 1/0 APPEND,INCRBY,DECR BITCOUNT, BITFIELD, BITOP, BITPOS, DECRBY, GETBIT, GETRANGE, GETSET, INCR, INCRBYFLOAT, MGET, MSET, MSETNX, PSETEX, SET, SETBIT, SETEX, SETRANGE, STRLEN

Slide 7

Slide 7 text

Using Redis Sets PHP $redis->sadd(list, ‘VALUE’); $redis->smembers(list); // LIST OF VALUES $redis->spop(list); // 0/1 $redis->srem(list, ‘VALUE’); // 0/1 BASH > SADD LIST VALUE > SMEMBERS LIST # LIST OF VALUES > SPOP LIST # VALUE > SREM LIST # 0/1 SCARD, SMOVE, SRANDMEMBER,SDIFF SDIFF, SDIFFSTORE, SINTER, SINTERSTORE, SISMEMBER, SUNION, SUNIONSTORE, SSCAN

Slide 8

Slide 8 text

Using Redis Sorted Sets PHP $redis->zadd(list, 0, ‘VALUE’); $redis->zrange(list, 0, -1); // LIST OF VALUES $redis->zpopmax(list, 1); // VALUE $redis->zrem(list, ‘VALUE’); // 0/1 BASH > ZADD LIST 0 VALUE > ZRANGE LIST 0 -1 # LIST OF VALUES > ZPOPMAX LIST 1 # VALUE > ZREM LIST VALUE # 0/1 BZPOPMIN,ZINCRBY BZPOPMAX, ZCARD, ZCOUNT, ZINTERSTORE, ZLEXCOUNT, ZPOPMIN, ZRANGEBYLEX, ZREVRANGEBYLEX, ZRANGEBYSCORE, ZRANK, ZREMRANGEBYLEX, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZREVRANGE, ZREVRANGEBYSCORE, ZREVRANK, ZSCORE, ZUNIONSTORE, ZSCAN

Slide 9

Slide 9 text

Using Redis GEO PHP $redis->geoadd(‘list’, ‘20.3’, ’34.5’, ‘VALUE’); $redis->geopos(‘list’, ‘VALUE’); // POSITION $redis->geodist(‘list’, ‘VAL1’, ‘VAL2’, ’km’); $redis->georadius(‘list’, ‘20.3’, ’34.5’, ‘200km’); BASH > GEOADD list 20.3 34.5 VALUE > GETPOS list VALUE # POSITION > GEODIST list VAL1 VAL2 km # DISTANCE > GEORADIUS list 20.3 34.5 200 km # LIST GEOHASH, GEORADIUSBYMEMBER

Slide 10

Slide 10 text

The new stream feature Application Redis GROUP A Consumer 1 GROUP A Consumer 2 GROUP B Consumer 1

Slide 11

Slide 11 text

Add a message to a stream PHP $redis->xadd(‘mystream’, ‘*’, [‘KEY’ => ‘VALUE’]); // MESSAGE ID BASH > XADD mystream * KEY VALUE # MESSAGE ID

Slide 12

Slide 12 text

Read from a stream PHP $redis->xread([‘mystream’ => 0]); // MESSAGES // [ // ‘STREAMNAME’ => [ // ‘MESSAGEID’ => [ // ‘KEY’ => ‘VALUE’ // ] // ], // ] BASH > XREAD STREAMS mystream 0 # MESSAGES # STREAMNAME [ # MESSAGEID [ # KEY # ] # ]

Slide 13

Slide 13 text

Create a read group PHP $redis->xgroup(‘CREATE’, ‘mystream’, ’mygroup’); // 1/0 BASH > XGROUP CREATE mystream mygroup $ # 1/0

Slide 14

Slide 14 text

Read as a group from a stream PHP $redis->xreadgroup( ’mygroup’, ‘myconsumer’, [‘mystream’ => 0] ); // MESSAGES BASH > XREADGROUP GROUP mygroup mycomsumer STREAMS mystream 0 # MESSAGES

Slide 15

Slide 15 text

Ack a message as a group for a stream PHP $redis->xack(‘mystream’, ’mygroup’, [’message-id’]); // 1/0 BASH > XACK mystream mygroup message-id # 1/0

Slide 16

Slide 16 text

Other Types - Hashes - HDEL, HEXISTS, HGET, HGETALL, HINCRBY, HINCRBYFLOAT, HKEYS, HLEN, HMSET, HSET, HSETNX, HSTRLEN,HVALS, HSCAN - Lists - BLPOP, BRPOP, BRPOPLPUSH, LINDEX, LINSERT, LLEN, LPOP, LPOP, LPUSH, LPUSHX, LRANGE, LREM, LSET, LTRIM, RPOP, RPOPLPUSH, RPUSH, RPUSHX - Pub/Sub - PSUBSCRIBE, PSUB, PUBLISH, PUNSUBSCRIBE, SUBSCRIBE, UNSUBSCRIBE

Slide 17

Slide 17 text

Why Redis ● Simple Interface ● Easy to Install ● Easy to Configure ● Perfect storage for multi server setup

Slide 18

Slide 18 text

What about delayed messages? Combination of “Sorted Set” and “Streams” can be used to delay messages.

Slide 19

Slide 19 text

Usage in Symfony https://github.com/HandcraftedInTheAlps/RedisTransportBundle ⛰ Config: framework: messenger: transports: redis: ‘redis://localhost:6379/streamname/group/consumer’ routing: 'My\Message\SerializableMessage': redis PHP: $messageBus->dispatch(new My\Message\SerializableMessage());

Slide 20

Slide 20 text

How to use redis as session storage in PHP? session.save_handler = redis session.save_path = "tcp://127.0.01:6379" It just need to be configured in php.ini:

Slide 21

Slide 21 text

More information - https://redis.io/topics/streams-intro - https://brandur.org/redis-streams - https://hub.docker.com/_/redis - https://redis.io/commands#stream Thank you! https:/ /twitter.com/alex_s_ https:/ /github.com/alexander-schranz/