# Redis and Caching ## Preparation - docker - WSL (if using windows) ## Overview Redis (Remote Dictionary Server) is an open source (BSD licensed), in-memory data structure store used as a database, cache, message broker, and streaming engine. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster. ## Install Redis ### Linux ```console curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list sudo apt-get update sudo apt-get install redis ``` ### MacOS ```console brew install redis ``` ### Docker ```console docker pull redis:alpine ``` ## Redis CLI ![](https://i.imgur.com/IxAIhME.png) ```console $ redis-cli redis 127.0.0.1:6379> ping PONG redis 127.0.0.1:6379> set mykey somevalue OK redis 127.0.0.1:6379> get mykey "somevalue" ``` ### Set Key ```console 127.0.0.1:6379> SET id 1234 OK ``` ### Get Key ```console 127.0.0.1:6379> GET id "1234" ``` ### List All Keys ```console 127.0.0.1:6379> KEYS * 1) "mykey" 2) "id" ``` ### Delete Key ```console 127.0.0.1:6379> DEL id (integer) 1 ``` ### Set Expiry Key ```console 127.0.0.1:6379> EXPIRE rahasia 15 OK ``` ### Check Key time left ```console 127.0.0.1:6379> TTL rahasia (integer) 5 127.0.0.1:6379> TTL rahasia (integer) -2 127.0.0.1:6379> GET rahasia (nil) ``` ## Redis GUI ### Install [https://github.com/ekvedaras/redis-gui/releases/tag/v2.2.0](https://github.com/ekvedaras/redis-gui/releases/tag/v2.2.0) ![](https://i.imgur.com/tedxHQN.png) ![](https://i.imgur.com/QemUpK9.png) ## Redis as Client Caching Client-side caching is a technique used to create high performance services. It exploits the memory available on application servers, servers that are usually distinct computers compared to the database nodes, to store some subset of the database information directly in the application side. Normally when data is required, the application servers ask the database about such information, like in the following diagram: ![](https://i.imgur.com/iEZH428.png) When client-side caching is used, the application will store the reply of popular queries directly inside the application memory, so that it can reuse such replies later, without contacting the database again: ![](https://i.imgur.com/rUAVW3P.png) Usually the two key advantages of client-side caching are: - Data is available with a very small latency. - The database system receives less queries, allowing it to serve the same dataset with a smaller number of nodes. ## What to cache Clients may want to run internal statistics about the number of times a given cached key was actually served in a request, to understand in the future what is good to cache. In general: - We don't want to cache many keys that change continuously. - We don't want to cache many keys that are requested very rarely. - We want to cache keys that are requested often and change at a reasonable rate. For an example of key not changing at a reasonable rate, think of a global counter that is continuously INCRemented. However simpler clients may just evict data using some random sampling just remembering the last time a given cached value was served, trying to evict keys that were not served recently. ## Lets Do it [https://github.com/sofianhw/php7-nginx-redis-mariadb](https://github.com/sofianhw/php7-nginx-redis-mariadb)