Redis

Hızlı veri işlemlerinin yapıldığı yerlerde kullanılan Redis nedir, kurulumu ve kullanımı içerisinde yer alan çeşitli komut örnekleri ile yer alıyor.

Redis nedir?

Redis veya Remote Dictionary Server, hızlı, açık kaynak kodlu, verileri anahtar değer(key-value) olarak in-memory veya bellekte saklayan bir veritabanıdır.

In-Memory nedir?

In-Memory veya bellek içi olarak adlandırılan klasik veritabanlarından farklı olarak tüm işlemlerin RAM bellekte yapıldığı bir veritabanı türüdür.

Neden In-Memory?

Redis ve In-Memory kavramlarını öğrenmenin yolu neden In-Memory çalışan bir veritabanına ihtiyaç duyulduğunu bilmekten geçiyor.

Bilgisayar üzerinde işlemler CPU veya işlemci olarak adlandırılan birim tarafından yapılır. İşlemlerin yapılması sırasında CPU, CPU belleğini kullanır. CPU belleği maliyetli ve sınırlı olduğundan dolayı RAM bellek kullanılır. CPU işlemleri RAM bellek üzerinde yaparak diske yazar. Disk hızları RAM bellek hızlarına göre yavaştır. Bu sorunu gidermek için HDD disklerde takas-tampon(swap) alan yöntemi kullanılır. Bundan dolayı HDD yerine SSD kullanıldığında aynı CPU daha iyi bir performans verir. Kullanılan disk(HDD-SSD vb.) ne olursa olsun yine RAM hızlarına yetişemez.

Veritabanları veri üzerinde işlem yaparken disk kullandığından dolayı yukarıda yer alan bilgisayar yapısından kaynaklı yavaşlığı yaşar. İşlemlerin daha hızlı yapıldığı RAM bellek üzerinde çalışan In-Memory veritabanları kullanılarak bu yavaşlık giderilmiş olur.

In-Memory veritabanlarının günümüzdeki artış nedenlerinden en önemlisi şüphesiz hızdır. Diğer artış nedeni ise CPU ve işletim sistemlerinin 64 bit mimarisini desteklemesidir. 32 bit mimari 232 RAM desteklerken 64 bit mimari 264 RAM destekler. Bellek sınırının kalkması, maliyetlerin azalması ve hız ihtiyacı ile birlikte In-Memory olarak çalışan veritabanlarının ortaya çıkmasına ve kullanımının artmasına neden olmuştur. Redis haricinde SAP Hana, Ignite, Memcached, Hazelcast gibi In-Memory veritabanları da mevcuttur.

Ayrıca bazı veritabanları kısmi olarak In-Memory kullanarak RAM belleğin sağlamış olduğu hızdan yararlanır.

Neden Redis?

Diğer In-Memory tabanlı veritabanlarından farklı olarak Redis, C programlama dili kullanarak yazılmıştır. İşlemciye yakın bir dil kullanıldığından dolayı diğer In-Memory tabanlı veritabanlarına göre daha hızlı olduğu söylenebilir. Ayrıca sağlamış olduğu Önbellekleme(Cache), Kuyruk(queue), Yayıncı-Abone yöntemi(Publish–subscribe, Pub/Sub) ve geniş programlama dili desteği sayesinde popüler hale gelmiştir.

Redis kurulumu

Kurulum MacOS ve Linux tabanlı işletim sistemlerinde aşağıdaki adreste yer alan adımlar takip edilerek yapılır.

https://redis.io/download

Aşağıdaki adımlarda indirilen Redis arşivi, çıkartılarak derlenir.

wget https://download.redis.io/releases/redis-6.2.4.tar.gz
tar xzf redis-6.2.4.tar.gz
cd redis-6.2.4
make

Kurulum sonrası Redis server çalıştırılır.

src/redis-server

Arka planda çalıştırmak için ampersand(&) işareti sonuna eklenebilir.

src/redis-server &

Redis içerisinde yer alan komut yorumlayıcısı kullanılarak Redis işlemleri yapılır.

src/redis-cli

Komut yorumlayıcısına aşağıdaki komut yazılarak test edilir.

ping

Windows tabanlı işletim sistemlerini tam olarak desteklememektedir. Çeşitli adreslerde yer alan dosyalar kullanarak Windows ortamında çalışması sağlanır. Ancak güncel sürüm desteğinin her zaman olmamasından dolayı tavsiye edilmez.

Windows tabanlı işletim sistemlerinde WSL veya Windows Subsystem for Linux olarak adlandırılan özellik kullanılarak yukarıdaki adımlar takip edilerek Redis çalıştırılabilir.

Redis kullanımı

Redis kullanımı sıradan komut yorumlayıcısı kullanımı gibidir. Komutlar arasındaki farklılık veri türlerine göre değiştiği için redis veri türlerini öğrenmek faydalı olacaktır.

Redis veri türleri

Redis temel olarak Strings(metin), Lists(liste), Sets(tekrarsız liste), Sorted sets(tekrarsız sıralı liste), Hashes(anahtar-değer dizisi) veri türlerine sahiptir.

Ayrıca bu veri türlerini kullanarak işlem yapan Bitmaps(bit), HyperLogLogs, Geospatial gibi yapılara da sahiptir.

Strings

Verilerin anahtar-değer olarak saklandığı veri türüdür.

Strings komutları aşağıdaki gibidir.

APPEND key value
DECR key
DECRBY key decrement
GET key
GETDEL key
GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]
GETRANGE key start end
GETSET key value
INCR key
INCRBY key increment
INCRBYFLOAT key increment
MGET key [key ...]
MSET key value [key value ...]
MSETNX key value [key value ...]
PSETEX key milliseconds value
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
SETEX key seconds value
SETNX key value
SETRANGE key offset value
STRALGO LCS algo-specific-argument [algo-specific-argument ...]
STRLEN key

Örnek kullanım aşağıdaki gibidir.

SET adim Yusuf
GET adim
STRLEN adim
APPEND adim " Sefa"
GETRANGE adim 0 5
GETSET adim "Yusuf SEZER"

Lists

Verilerin liste olarak saklandığı veri türüdür.

Lists komutları aşağıdaki gibidir.

BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
BRPOPLPUSH source destination timeout
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
LINDEX key index
LINSERT key BEFORE|AFTER pivot element
LLEN key
LPOP key [count]
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
LPUSH key element [element ...]
LPUSHX key element [element ...]
LRANGE key start stop
LREM key count element
LSET key index element
LTRIM key start stop
RPOP key [count]
RPOPLPUSH source destination
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
RPUSH key element [element ...]
RPUSHX key element [element ...]

Örnek kullanım aşağıdaki gibidir.

RPUSH kisiler Yusuf Ramazan Sinan Mehmet
LRANGE kisiler 0 -1
LPUSH kisiler Yusuf
RPOP kisiler
LPOP kisiler
LLEN kisiler
SORT kisiler BY ALPHA DESC

Sets

Verilerin tekrarsız biçimde liste olarak saklandığı veri türüdür.

SADD key member [member ...]
SCARD key
SDIFF key [key ...]
SDIFFSTORE destination key [key ...]
SINTER key [key ...]
SINTERSTORE destination key [key ...]
SISMEMBER key member
SMISMEMBER key member [member ...]
SMEMBERS key
SMOVE source destination member
SPOP key [count]
SRANDMEMBER key [count]
SREM key member [member ...]
SUNION key [key ...]
SUNIONSTORE destination key [key ...]
SSCAN key cursor [MATCH pattern] [COUNT count]

Örnek kullanım aşağıdaki gibidir.

SADD kisiler Yusuf Ramazan Sinan Mehmet
SMEMBERS kisiler 
SADD kisiler Yusuf
SPOP kisiler
SCARD kisiler
SADD kisiler Yusuf Ramazan Sinan Mehmet

Sorted Sets

Verilerin sıralı ve tekrarsız biçimde liste olarak saklandığı veri türüdür.

BZPOPMIN key [key ...] timeout
BZPOPMAX key [key ...] timeout
ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
ZCARD key
ZCOUNT key min max
ZDIFF numkeys key [key ...] [WITHSCORES]
ZDIFFSTORE destination numkeys key [key ...]
ZINCRBY key increment member
ZINTER numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZLEXCOUNT key min max
ZPOPMAX key [count]
ZPOPMIN key [count]
ZRANDMEMBER key [count [WITHSCORES]]
ZRANGESTORE dst src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count]
ZRANGE key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
ZRANGEBYLEX key min max [LIMIT offset count]
ZREVRANGEBYLEX key max min [LIMIT offset count]
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZRANK key member
ZREM key member [member ...]
ZREMRANGEBYLEX key min max
ZREMRANGEBYRANK key start stop
ZREMRANGEBYSCORE key min max
ZREVRANGE key start stop [WITHSCORES]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
ZREVRANK key member
ZSCORE key member
ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
ZMSCORE key member [member ...]
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZSCAN key cursor [MATCH pattern] [COUNT count]

Örnek kullanım aşağıdaki gibidir.

ZADD kisiler 1 Yusuf 2 Ramazan 3 Sinan 4 Mehmet
ZRANGE kisiler 0 -1 WITHSCORES
ZADD kisiler 5 Yusuf
ZPOPMAX kisiler
ZPOPMIN kisiler
ZCARD kisiler
ZADD kisiler 55 Yusuf 99 Ramazan 33 Sinan 55 Mehmet
ZRANGE kisiler 0 -1 WITHSCORES

Hashes

Verilerin bir bir veri altında anahtar-değeer olarak saklandığı veri türüdür.

HDEL key field [field ...]
HEXISTS key field
HGET key field
HGETALL key
HINCRBY key field increment
HINCRBYFLOAT key field increment
HKEYS key
HLEN key
HMGET key field [field ...]
HMSET key field value [field value ...]
HSET key field value [field value ...]
HSETNX key field value
HRANDFIELD key [count [WITHVALUES]]
HSTRLEN key field
HVALS key
HSCAN key cursor [MATCH pattern] [COUNT count]

Örnek kullanım aşağıdaki gibidir.

HSET yusuf adi Yusuf
HSET yusuf soyadi SEZER
HKEYS yusuf
HVALS yusuf
HGETALL yusuf
HLEN yusuf
HSTRLEN yusuf adi
HRANDFIELD yusuf

Bitmaps

Bitsel işlemleri strings veri türünü kullanarak yapan yapıdır.

BITCOUNT key [start end]
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
BITOP operation destkey key [key ...]
BITPOS key bit [start [end]]
GETBIT key offset
SETBIT key offset value

Örnek kullanım aşağıdaki gibidir.

SETBIT veri 7 1
GETBIT veri 7
GET veri

Geospatial

Coğrafi/harita işlemleri sorted sets veri türünü kullanarak yapan yapıdır.

GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
GEOHASH key member [member ...]
GEOPOS key member [member ...]
GEODIST key member1 member2 [m|km|ft|mi]
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]
GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]
GEOSEARCHSTORE destination source [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC|DESC] [COUNT count [ANY]] [STOREDIST]

Örnek kullanım aşağıdaki gibidir.

GEOADD harita 28.978359 41.008240 Istanbul
GEOADD harita 29.932949 40.762402 Kocaeli
GEOPOS harita Istanbul
ZRANGE harita 0 -1 WITHSCORES
GEODIST maps Istanbul Kocaeli

Diğer komutlar

Veri türleri hakkında bilgi almak, ayar yapmak gibi çeşitli işlemler için kullanılan çeşitli yardımcı komutlar yer almaktadır.

Transactions

Komutları tek bir işlem gibi yapmak için kullanılan komutlardır.

DISCARD
EXEC
MULTI
UNWATCH
WATCH key [key ...]

Örnek kullanım aşağıdaki gibidir.

MULTI
SET adim Yusuf
GET admi
SET soyadim SEZER
EXEC

Keys

Veri ile ilgili bilgilerin alındığı komutlar yer alır.

COPY source destination [DB destination-db] [REPLACE]
DEL key [key ...]
DUMP key
EXISTS key [key ...]
EXPIRE key seconds
EXPIREAT key timestamp
EXPIRETIME key
KEYS pattern
MIGRATE host port key|\"\" destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]]
MOVE key db
OBJECT subcommand [arguments [arguments ...]]
PERSIST key
PEXPIRE key milliseconds
PEXPIREAT key milliseconds-timestamp
PEXPIRETIME key
PTTL key
RANDOMKEY
RENAME key newkey
RENAMENX key newkey
RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
TOUCH key [key ...]
TTL key
TYPE key
UNLINK key [key ...]
WAIT numreplicas timeout
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

Sıklıkla kullanılan komutlar aşağıdaki gibidir.

KEYS *
TYPE adim
TTL adim

Connection

Redis sunucu, istemci bağlantı bilgisi ve bağlantı işlemlerinin yapıldığı komutlar yer alır.

AUTH [username] password
CLIENT CACHING YES|NO
CLIENT ID
CLIENT INFO
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [USER username] [ADDR ip:port] [LADDR ip:port] [SKIPME yes/no]
CLIENT LIST [TYPE normal|master|replica|pubsub] [ID client-id [client-id ...]]
CLIENT GETNAME
CLIENT GETREDIR
CLIENT UNPAUSE
CLIENT PAUSE timeout [WRITE|ALL]
CLIENT REPLY ON|OFF|SKIP
CLIENT SETNAME connection-name
CLIENT TRACKING ON|OFF [REDIRECT client-id] [PREFIX prefix [PREFIX prefix ...]] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]
CLIENT TRACKINGINFO
CLIENT UNBLOCK client-id [TIMEOUT|ERROR]
ECHO message
HELLO [protover [AUTH username password] [SETNAME clientname]]
PING [message]
QUIT
RESET
SELECT index

Sıklıkla kullanılan komutlar aşağıdaki gibidir.

PING
AUTH passwd
QUIT

Pub/Sub

Redis pub/sub veya yayıncı ve abone mimarisini çeşitli komutlar ile destekler.

PSUBSCRIBE pattern [pattern ...]
PUBSUB subcommand [argument [argument ...]]
PUBLISH channel message
PUNSUBSCRIBE [pattern [pattern ...]]
SUBSCRIBE channel [channel ...]
UNSUBSCRIBE [channel [channel ...]]

Redis istemcisi(redis-cli) ile abone olunur.

SUBSCRIBE yusufsezer

Abonelik sonrası istemci belirtilen kanaldan gelen mesajları bekleyecektir.

Aşağıdaki komut başka bir redis istemcisi ile çalıştırıldığında kanala abone olanlara mesaj iletilecektir.

PUBLISH yusufsezer merhaba

Redis sağlamış olduğu hız ve özellik sayesinde sürekli olarak streams gibi özelliklerin eklendiği ve eklenmeye devam ettiği bir yapıdadır.

Komutlarla ilgili bilgi almak için HELP komutu veya resmi web sayfasını takip etmek faydalı olacaktır.

HELP
HELP SADD
HELP @string

Redis sağlamış olduğu ve sürekli olarak güncellenen özelliklerin yanında birden fazla sunucunun aynı anda çalışmasını sağlayan cluster yapısına sahiptir.

Bu sayede birden fazla sunucunun yoğun isteklere yanıt vermesi sağlanır.

Hayırlı ve sağlıklı günler dilerim.


Bunlara'da bakmalısın!