Redis Cheatsheet
Key Concepts
- a in-memory key-value store, store and retrieve using a unique key
- can be used as a database, cache, and/or messsage broker
- supports numbers, strings, hashes, lists, sets, sorted sets
WHy do we need it?
- It's an in-memory key-value data store, so it's very fast for read and write. Suitable for caching, session management, pub/sub applications, and leaderboards
Differs between traditional database?
- in memory and key-value store (NoSQL)
What is Redis Hashes?
why is it so fast?
- Redis keeps everything in RAM
How does it manage data?
- data expirations (set expiration times for keys)
- data partitioning (divide large datasets into smaller, more manageable chunks)
- offloading to persistent storage (store less frequently accessed data on disk, snapshots or log files)
- clustering (distribute across multiple redis instances)
what happens if data in memory grows beyond the configured memory limit?
-
data eviction
- volatile-lru: evicts the LRU key from among the keys with an expiration set
- allkeys-lru: evicts the LRU key from all keys
- volatile-ttl: evicts the key with the nearest expiration time
- allkeys-random: evicts a random key from all keys
- volatile-random: evicts a random key from among the keys with an expiration set
- noeviction: error when memory limit is reached
- Disk Persistence
- RDB (Redis Database Backup): snapshot-based persistence method. configure to take period snapshots and save them to disk in binary format
- AOF (append-only file): this log is written to disk, allow redis to replay the log
- can be configured to save after every command, every second, or at specific times
- No Persistence
- RDB and AOF can be configure to work together
In case of hardware failure or server restarts, what happens?
- Redis can load data back into memory from disk (from most recent snapshots or append-only-files)
# List all keys
> keys *
# set a key-value
> set sName "333"
> lpush sList "item1" "item2" "item3"
# get a value
> get sName
# delete a key
> del sName
List
- lpush: push left
- rpush: push right
- llen: get length
- lrange: retreive a range from list
- lpop: pop left
- rpop: pop right
127.0.0.1:6379> rpush list1 item1 item2 item3 item4
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "item1"
2) "item2"
3) "item3"
4) "item4"
127.0.0.1:6379> lpush list1 item0
(integer) 5
127.0.0.1:6379> rpush list1 item5
(integer) 6
127.0.0.1:6379> lrange list1 0 -1
1) "item0"
2) "item1"
3) "item2"
4) "item3"
5) "item4"
6) "item5"
127.0.0.1:6379> lpop list1
"item0"
127.0.0.1:6379> rpop list1
"item5"
127.0.0.1:6379> lrange list1 0 -1
1) "item1"
2) "item2"
3) "item3"
4) "item4"
Set
- sadd: add element
- srem: remove an element
- sismember: exists?
- smembers: get all elements
127.0.0.1:6379> sadd set1 item1 item2 item3
(integer) 3
127.0.0.1:6379> smembers set1
1) "item1"
2) "item2"
3) "item3"
127.0.0.1:6379> sismember set1 item1
(integer) 1
127.0.0.1:6379> sismember set1 item0
(integer) 0
SortedSets
sets with scored elements, scores are used to determine order
zadd: add element at target index
- adding an element at existing index overwrites
- adding an existing element to a different index is not allowed
- adding an element to a far end index with empty values in between will move the element front to append to end
zrange: get ranged elements
zrem: remove an element
use cases: Leaderboards, Time-Based Events, priority queues, geolocation, real-time analytics
127.0.0.1:6379> zadd set2 3.3 item1 3.2 item2 9 item3
(integer) 3
127.0.0.1:6379> zrange set2 0 -1
1) "item2"
2) "item1"
3) "item3"
127.0.0.1:6379> zrange set2 0 -1 withscores
1) "item2"
2) "3.2"
3) "item1"
4) "3.3"
5) "item3"
6) "9"
127.0.0.1:6379> zadd set2 3.3 item5
(integer) 1
127.0.0.1:6379> zrange set2 0 -1 withscores
1) "item2"
2) "3.2"
3) "item1"
4) "3.3"
5) "item5"
6) "3.3"
7) "item3"
8) "9"
# adding items with the same socre, items ares store lexicographcally
127.0.0.1:6379> zadd set2 3.3 item0
(integer) 1
127.0.0.1:6379> zrange set2 0 -1 withscores
1) "item2"
2) "3.2"
3) "item0"
4) "3.3"
5) "item1"
6) "3.3"
7) "item5"
8) "3.3"
9) "item3"
10) "9"
# change score of an item
127.0.0.1:6379> zadd set2 3.9 item5
(integer) 0
127.0.0.1:6379> zrange set2 0 -1 withscores
1) "item2"
2) "3.2"
3) "item0"
4) "3.3"
5) "item1"
6) "3.3"
7) "item5"
8) "3.9"
9) "item3"
10) "9"
# remove an element from zSet
127.0.0.1:6379> zrem set2 item5
(integer) 1
127.0.0.1:6379> zrange set2 0 -1 withscores
1) "item2"
2) "3.2"
3) "item0"
4) "3.3"
5) "item1"
6) "3.3"
7) "item3"
8) "9"