Master Redis: Installation, Commands, and Persistence Explained
An in‑depth guide covering Redis fundamentals, installation steps, daemon configuration, password setup, core commands for strings, lists, hashes, sets and sorted sets, internal encodings, and both RDB and AOF persistence mechanisms, complete with practical code examples and configuration snippets.
Redis Overview
Redis is an open‑source, ANSI‑C written, BSD‑licensed, network‑enabled, in‑memory (with optional persistence) key‑value database that supports strings, hashes, lists, sets and sorted sets.
Installing Redis
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ makeRunning Redis as a Daemon
Modify redis.conf
Change daemonize no to daemonize yes.
Start Redis
src/redis-server redis.confEnable Autostart
Run the installation script with default options.
./utils/install_server.shmv /etc/init.d/redis_6379 /etc/init.d/redisSet Redis Password
vim /etc/redis/6379.conf
requirepass redispass
service redis restartAfter reconnecting, a password is required.
Redis Commands
Global Commands
Get Keys
keys patternThe keys command supports wildcards but may affect performance on large datasets.
127.0.0.1:6379> set we "hello"
OK
127.0.0.1:6379> keys *
1) "we"
127.0.0.1:6379> set name wanger
OK
127.0.0.1:6379> keys name
1) "name"
127.0.0.1:6379> keys *
1) "name"
2) "we"Delete Keys
del key1 key2 ..Example:
127.0.0.1:6379> keys *
1) "qwe"
2) "asd"
3) "we"
127.0.0.1:6379> del asd qwe
(integer) 2
127.0.0.1:6379> keys *
1) "we"Check Key Existence
exists key1 key2Example:
127.0.0.1:6379> exists we
(integer) 1
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> set qwe 2
OK
127.0.0.1:6379> exists we qwe
(integer) 2
127.0.0.1:6379> exists we name
(integer) 1Get Total Number of Keys
dbsizeExample:
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> keys *
1) "qwe"
2) "we"Get Key Type
type keyExample:
127.0.0.1:6379> type we
string
127.0.0.1:6379> lpush list1 1 2 3
(integer) 3
127.0.0.1:6379> type list1
listSort Elements
sort key [BY pattern] [LIMIT offset count] [GET pattern ...] [ASC|DESC] [ALPHA] [STORE destination]Example:
127.0.0.1:6379> lrange list 0 -1
1) "5"
2) "7"
3) "2"
4) "4"
5) "3"
6) "1"
sort list desc limit 0 5
1) "7"
2) "5"
3) "4"
4) "4"
5) "3"
127.0.0.1:6379> lpush list2 asd qwe zxc
(integer) 3
sort list2 desc limit 0 5 alpha
1) "zxc"
2) "qwe"
3) "asd"Flush Database
flushdb // clear current DB
flushall // clear all DBsExample:
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> get a
"1"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> get a
(nil)Move Key to Another DB
move key dbExample:
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> move a 2
(integer) 1
127.0.0.1:6379> select 2
OK
127.0.0.1:6379> get a
"1"String Operations
Set and Get
set key value [EX seconds] [PX milliseconds] [NX|XX]
get keyNX : set only if key does not exist. XX : set only if key exists.
Example:
127.0.0.1:6379> set name wanger
OK
127.0.0.1:6379> get name
"wanger"
127.0.0.1:6379> setnx name wanger
(integer) 0
127.0.0.1:6379> set name wang xx
OKBatch Set/Get
mset key1 value1 key2 value2 ..
mget key1 key2Example:
127.0.0.1:6379> mset key1 1 key2 2
OK
127.0.0.1:6379> mget key1 key2
1) "1"
2) "2"Increment / Decrement
incr key
decr keyExample:
127.0.0.1:6379> incr key1
(integer) 2
127.0.0.1:6379> incr key2
(integer) 3
127.0.0.1:6379> get key1
"2"
127.0.0.1:6379> get key2
"3"
127.0.0.1:6379> incr we
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decr key1
(integer) 1
127.0.0.1:6379> decr key2
(integer) 2Append
append key valueExample:
127.0.0.1:6379> append key hello
(integer) 5
127.0.0.1:6379> append key world
(integer) 10
127.0.0.1:6379> get key
"helloworld"String Length
strlen keyExample:
127.0.0.1:6379> get key
"helloworld"
127.0.0.1:6379> strlen key
(integer) 10
127.0.0.1:6379> set name "王二"
OK
127.0.0.1:6379> strlen name
(integer) 6Set/Get Sub‑range
setrange key offset value
getrange key start endExample:
127.0.0.1:6379> SET key1 "Hello World"
OK
127.0.0.1:6379> setrange key1 6 "Redis"
(integer) 11
127.0.0.1:6379> get key1
"Hello Redis"
127.0.0.1:6379> getrange key1 6 12
"Redis"String Object Encoding
Redis stores strings using three internal encodings:
int : 8‑byte integer.
embstr : strings up to 39 bytes.
raw : strings longer than 39 bytes.
Example:
127.0.0.1:6379> set num 123456
OK
127.0.0.1:6379> object encoding num
"int"
127.0.0.1:6379> set short qweasd
OK
127.0.0.1:6379> object encoding short
"embstr"
127.0.0.1:6379> set raw "when you love me I have lost of plot wow wow"
OK
127.0.0.1:6379> object encoding raw
"raw"List Operations
Push / Insert
lpush key value1 value2 ...
rpush key value1 value2 ...
linsert key BEFORE|AFTER pivot valueExample:
127.0.0.1:6379> lpush names 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange names 0 4
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> rpush nums 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange nums 0 4
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> linsert nums BEFORE 2 5
(integer) 5
127.0.0.1:6379> lrange nums 0 5
1) "1"
2) "5"
3) "2"
4) "3"
5) "4"Pop Elements
lpop key
rpop keyExample:
127.0.0.1:6379> lrange nums 0 5
1) "1"
2) "5"
3) "2"
4) "3"
5) "4"
127.0.0.1:6379> lpop nums
"1"
127.0.0.1:6379> rpop nums
"4"
127.0.0.1:6379> lrange nums 0 5
1) "5"
2) "2"
3) "3"Index Access
lindex key indexExample:
127.0.0.1:6379> lrange nums 0 5
1) "5"
2) "2"
3) "3"
127.0.0.1:6379> lindex nums 2
"3"
127.0.0.1:6379> lindex nums -1
"3"Range Query
lrange key start stopExample:
127.0.0.1:6379> lrange nums 0 1
1) "5"
2) "2"
127.0.0.1:6379> lrange nums 0 2
1) "5"
2) "2"
3) "3"List Length
llen keyExample:
127.0.0.1:6379> lrange nums 0 3
1) "5"
2) "2"
3) "3"
127.0.0.1:6379> llen nums
(integer) 3Remove Elements
lrem key count valuecount > 0: remove from head; count < 0: remove from tail; count = 0: remove all.
Example:
127.0.0.1:6379> lrange mylist 0 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "2"
7) "3"
8) "4"
9) "5"
10) "5"
127.0.0.1:6379> lrem mylist 1 5
(integer) 1
127.0.0.1:6379> lrange mylist 0 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "2"
6) "3"
7) "4"
8) "5"
9) "5"
127.0.0.1:6379> lrem mylist -2 5
(integer) 2
127.0.0.1:6379> lrange mylist 0 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "2"
6) "3"
7) "4"
127.0.0.1:6379> lrem mylist 0 2
(integer) 2
127.0.0.1:6379> lrange mylist 0 11
1) "1"
2) "3"
3) "4"
4) "3"
5) "4"Set Element by Index
lset key index valueExample:
127.0.0.1:6379> lrange mylist 0 6
1) "1"
2) "3"
3) "4"
4) "3"
5) "4"
127.0.0.1:6379> lset mylist 1 5
OK
127.0.0.1:6379> lrange mylist 0 6
1) "1"
2) "5"
3) "4"
4) "3"
5) "4"Blocking Pop
blpop key1 key2 timeout
brpop key1 key2 timeoutExample:
127.0.0.1:6379> blpop list1 list2 0
1) "list1"
2) "8"
127.0.0.1:6379> brpop list1 list2 0
1) "list1"
2) "7"
127.0.0.1:6379> brpop list1 list2 0
1) "list2"
2) "2"
... (continues until another client pushes data)List Internal Encoding
ziplist : used when all elements are < 64 bytes and the list has < 512 items.
linkedlist : fallback when ziplist conditions are not met.
quicklist : a linked list of ziplist nodes, the default implementation in modern Redis.
Reference: 张铁蕾 http://zhangtielei.com/posts/blog-redis-quicklist.html
Hash Operations
Set / Get Field
hset key field value
hget key fieldExample:
127.0.0.1:6379> hset ha name wanger
(integer) 1
127.0.0.1:6379> hget ha name
"wanger"Batch Set / Get
hmset key field1 value1 field2 value2 ...
hmget key field1 field2 ...Example:
127.0.0.1:6379> hmset he name wanger sex nan
OK
127.0.0.1:6379> hmget he name sex
1) "wanger"
2) "nan"Delete Field
hdel key field1 field2 ...Example:
127.0.0.1:6379> hdel he name
(integer) 1
127.0.0.1:6379> hget he name
(nil)Field Count
hlen keyExample:
127.0.0.1:6379> hmset he name wanger sex nan age 18
OK
127.0.0.1:6379> hlen he
(integer) 3Get All Fields and Values
hgetall keyExample:
127.0.0.1:6379> hgetall he
1) "sex"
2) "nan"
3) "name"
4) "wanger"
5) "age"
6) "18"Get All Field Names
hkeys keyExample:
127.0.0.1:6379> hkeys he
1) "sex"
2) "name"
3) "age"Field Existence
hexists key fieldExample:
127.0.0.1:6379> hexists he name
(integer) 1
127.0.0.1:6379> hexists he sex
(integer) 1Increment Field
hincrby key field incrementExample:
127.0.0.1:6379> hincrby asd asdf 2
(integer) 3
127.0.0.1:6379> hget asd asdf
"3"
127.0.0.1:6379> hincrby asd asdf 2
(integer) 5
127.0.0.1:6379> hget asd asdf
"5"Get All Values
hvals keyExample:
127.0.0.1:6379> hvals he
1) "nan"
2) "wanger"
3) "18"Hash Internal Encoding
ziplist : used when the hash has fewer than 512 entries and each value is under 64 bytes.
hashtable : used otherwise, offering O(1) access.
Set Operations
Add Members
sadd key member1 member2 ...Example:
127.0.0.1:6379> sadd set s1 s2
(integer) 0Get All Members
smembers keyExample:
127.0.0.1:6379> smembers set
1) "s2"
2) "s1"
3) "s3"Remove Members
srem key member1 member2 ...Example:
127.0.0.1:6379> srem set s2
(integer) 1
127.0.0.1:6379> smembers set
1) "s1"
2) "s3"Cardinality
scard keyExample:
127.0.0.1:6379> scard set
(integer) 2Random Member(s)
srandmember key [count]Example:
127.0.0.1:6379> srandmember set 1
1) "s1"Membership Test
sismember key memberExample:
127.0.0.1:6379> sismember set s2
(integer) 0
127.0.0.1:6379> sismember set s3
(integer) 1Pop Members
spop key [count]Example:
127.0.0.1:6379> spop set
"s4"
127.0.0.1:6379> spop set 3
1) "s5"
2) "s1"
3) "s3"Set Union / Intersection / Difference
sunion key1 key2
sinter key1 key2
sdiff key1 key2Examples:
127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sinter set1 set2
1) "2"
2) "3"
127.0.0.1:6379> sdiff set1 set2
1) "1"
127.0.0.1:6379> sdiff set2 set1
1) "4"
2) "5"Set Internal Encoding
intset : used when all members are integers and the set has fewer than 512 entries.
hashtable : fallback for larger or non‑integer sets.
Sorted Set Operations
Add Members
zadd key [NX|XX] [CH] [INCR] score1 member1 score2 member2 ...Example:
127.0.0.1:6379> zadd score xx 80 wanger 80 huazai 95 dongdong +inf a
(integer) 0
127.0.0.1:6379> zrange score 0 -1
1) "huazai"
2) "wanger"
3) "dongdong"
4) "a"Get Score
zscore key memberExample:
127.0.0.1:6379> zscore score dongdong
"95"Rank / Reverse Rank
zrank key member // ascending rank starting at 0
zrevrank key member // descending rankExample:
127.0.0.1:6379> zrank score huazai
(integer) 2
127.0.0.1:6379> zrevrank score huazai
(integer) 1Cardinality
zcard keyExample:
127.0.0.1:6379> zcard score
(integer) 4Remove Members
zrem key member1 member2 ...Example:
127.0.0.1:6379> zrem score dongdong
(integer) 1
127.0.0.1:6379> zrange score 0 -1
1) "wanger"
2) "huazai"
3) "a"Increment Score
zincrby key increment memberExample:
127.0.0.1:6379> zincrby score 5 wanger
"95"Range by Score
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]Example:
127.0.0.1:6379> zrangebyscore score 80 90 WITHSCORES
1) "dongdong"
2) "85"
3) "wanger"
4) "90"Count by Score
zcount key min maxExample:
127.0.0.1:6379> zcount score 85 95
(integer) 3Remove by Score Range
zremrangebyscore key min maxExample:
127.0.0.1:6379> zremrangebyscore score 85 90
(integer) 2Sorted‑Set Intersection
zinterstore destination numkeys key1 key2 [WEIGHTS w1 w2] [AGGREGATE sum|min|max]Example:
127.0.0.1:6379> zadd user 10 wanger 20 huazai 30 dongdong
(integer) 3
127.0.0.1:6379> zadd user1 15 wanger 35 huazai
(integer) 2
127.0.0.1:6379> zinterstore userset 2 user user1
(integer) 2
127.0.0.1:6379> zrange userset 0 -1 WITHSCORES
1) "wanger"
2) "25"
3) "huazai"
4) "55"Sorted‑Set Union
zunionstore destination numkeys key1 key2 [WEIGHTS w1 w2] [AGGREGATE sum|min|max]Example:
127.0.0.1:6379> zunionstore user3set 2 user user1 WEIGHTS 1 0.5 AGGREGATE MAX
(integer) 3
127.0.0.1:6379> zrange user3set 0 -1 WITHSCORES
1) "wanger"
2) "10"
3) "huazai"
4) "20"
5) "dongdong"
6) "30"Sorted‑Set Internal Encoding
ziplist : used when the set has fewer than 128 elements and each element is under 64 bytes.
skiplist : used otherwise, providing O(log N) range queries.
Redis Persistence
RDB (Snapshotting)
RDB creates a point‑in‑time snapshot of the dataset and writes it to a binary file. The snapshot can be loaded on restart for fast recovery and is suitable for backups.
RDB Process
Redis forks a child process.
The child writes the dataset to a temporary RDB file.
When finished, the temporary file replaces the old RDB file.
Automatic Trigger
Configured in redis.conf (e.g., save 900 1, save 300 10, save 60 10000).
Additional options:
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis/6379Manual Trigger
Use SAVE (blocks the server) or BGSAVE (forks a child and continues serving clients).
AOF (Append‑Only File)
AOF logs every write operation using the Redis protocol. On restart, the log is replayed to rebuild the dataset. A background rewrite compresses the log when it grows large.
AOF Write Strategies
appendfsync always: sync on every write (slow, no data loss). appendfsync everysec: sync every second (default, may lose up to 1 s). appendfsync no: let the OS handle syncing (fast, riskier).
AOF Rewrite
When the AOF becomes large, Redis forks a child that rewrites the log by reading the in‑memory dataset and emitting the minimal set of commands. New writes are buffered and appended to the old AOF; after the rewrite finishes, the temporary file replaces the old AOF.
AOF Configuration
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-rewrite-incremental-fsync yes
aof-use-rdb-preamble yesWhen both RDB and AOF files exist, AOF takes precedence for recovery.
Reference: Zhang Tielei – https://zhangtielei.com/posts/blog-redis-quicklist.html
Feel free to discuss and share insights.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Ops Development Stories
Maintained by a like‑minded team, covering both operations and development. Topics span Linux ops, DevOps toolchain, Kubernetes containerization, monitoring, log collection, network security, and Python or Go development. Team members: Qiao Ke, wanger, Dong Ge, Su Xin, Hua Zai, Zheng Ge, Teacher Xia.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
