Redis 是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。本文将介绍 Redis 的核心概念和常用命令。
安装与启动
macOS 安装
1 2 3 4 5 6 7 8
| brew install redis
brew services start redis
redis-server
|
Linux 安装
1 2 3 4 5 6 7 8 9 10
| sudo apt update sudo apt install redis-server
sudo yum install redis
sudo systemctl start redis sudo systemctl enable redis
|
连接 Redis
1 2 3 4 5
| redis-cli
redis-cli -h 192.168.1.100 -p 6379 -a password
|
数据类型
Redis 支持多种数据类型,每种类型都有其特定的使用场景。
1. String(字符串)
最基本的数据类型,可以存储字符串、整数或浮点数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| SET name "Redis"
GET name
SET session "abc123" EX 10
SETEX token 3600 "mytoken"
SETNX lock "1"
MSET key1 "value1" key2 "value2" key3 "value3"
MGET key1 key2 key3
SET counter 100 INCR counter
INCRBY counter 10
DECR counter
APPEND name " Database" GET name
STRLEN name
|
2. Hash(哈希)
适合存储对象,类似于字典或 Map。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| HSET user:1001 name "张三" HSET user:1001 age 25 HSET user:1001 email "zhangsan@example.com"
HMSET user:1002 name "李四" age 30 city "北京"
HGET user:1001 name
HMGET user:1001 name age email
HGETALL user:1001
HKEYS user:1001
HVALS user:1001
HEXISTS user:1001 name
HDEL user:1001 email
HINCRBY user:1001 age 1
HLEN user:1001
|
3. List(列表)
有序的字符串列表,支持从两端插入和弹出元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| LPUSH tasks "任务1" "任务2" "任务3"
RPUSH tasks "任务4"
LRANGE tasks 0 -1
LLEN tasks
LPOP tasks
RPOP tasks
BLPOP tasks 5
LINDEX tasks 0
LSET tasks 0 "更新的任务"
LINSERT tasks BEFORE "任务1" "新任务"
LTRIM tasks 0 2
|
4. Set(集合)
无序的字符串集合,元素唯一。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| SADD fruits "apple" "banana" "orange"
SMEMBERS fruits
SISMEMBER fruits "apple"
SCARD fruits
SREM fruits "banana"
SRANDMEMBER fruits
SPOP fruits
SADD set1 "a" "b" "c" SADD set2 "b" "c" "d"
SINTER set1 set2
SUNION set1 set2
SDIFF set1 set2
SINTERSTORE result set1 set2
|
5. Sorted Set(有序集合)
带分数的有序集合,元素按分数排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| ZADD leaderboard 100 "player1" ZADD leaderboard 85 "player2" ZADD leaderboard 120 "player3" ZADD leaderboard 95 "player4"
ZADD leaderboard 88 "player5" 110 "player6"
ZRANK leaderboard "player3"
ZREVRANK leaderboard "player3"
ZSCORE leaderboard "player1"
ZRANGEBYSCORE leaderboard 90 110
ZREVRANGE leaderboard 0 2 WITHSCORES
ZINCRBY leaderboard 10 "player2"
ZCARD leaderboard
ZCOUNT leaderboard 90 110
ZREM leaderboard "player5"
ZREMRANGEBYRANK leaderboard 0 1
|
键操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| KEYS *
KEYS user:* KEYS *name*
EXISTS name
DEL name
DEL key1 key2 key3
EXPIRE session 3600
PEXPIRE session 3600000
EXPIREAT key 1735689600
TTL session
PTTL session
PERSIST session
RENAME oldkey newkey
RENAMENX oldkey newkey
TYPE name
SCAN 0 MATCH user:* COUNT 100
|
事务
Redis 事务可以一次执行多个命令,保证原子性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| MULTI
SET account:A 1000 SET account:B 500 DECRBY account:A 100 INCRBY account:B 100
EXEC
DISCARD
WATCH account:A MULTI DECRBY account:A 100 EXEC
|
发布订阅
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| SUBSCRIBE news sports
PUBLISH news "Breaking news!"
PSUBSCRIBE news:*
PUBLISH news:tech "Tech news update"
UNSUBSCRIBE news PUNSUBSCRIBE news:*
|
持久化
RDB 快照
1 2 3 4 5 6
| SAVE BGSAVE
LASTSAVE
|
AOF 日志
配置文件 redis.conf 中的相关设置:
1 2 3 4 5 6 7 8
| # RDB 配置 save 900 1 # 900秒内有1次修改则保存 save 300 10 # 300秒内有10次修改则保存 save 60 10000 # 60秒内有10000次修改则保存
# AOF 配置 appendonly yes appendfsync everysec # 每秒同步一次
|
常用管理命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| INFO INFO memory INFO replication
CLIENT LIST
CLIENT KILL ip:port
SLOWLOG GET 10
FLUSHDB
FLUSHALL
DBSIZE
SELECT 1
CONFIG GET maxmemory CONFIG GET *
CONFIG SET maxmemory 2gb
MEMORY USAGE key MEMORY STATS
|
性能优化建议
1. 键命名规范
1 2 3 4
| user:1001:profile order:2024:12:10:001 cache:article:12345
|
2. 管道(Pipeline)
使用管道可以减少网络往返次数,提高性能:
1 2 3 4 5 6 7
| cat commands.txt | redis-cli --pipe
|
3. 内存优化
1 2 3 4 5 6 7 8
| MEMORY USAGE user:1001
redis-cli --bigkeys
redis-cli --memkeys
|
常见使用场景
缓存
1 2 3 4 5
| SET cache:user:1001 '{"name":"张三","age":25}' EX 3600
GET cache:user:1001
|
分布式锁
1 2 3 4 5
| SET lock:order:1001 "uuid-xxx" NX EX 30
EVAL "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 lock:order:1001 "uuid-xxx"
|
限流
1 2 3 4 5 6 7 8 9
|
MULTI INCR ratelimit:user:1001 EXPIRE ratelimit:user:1001 60 EXEC
GET ratelimit:user:1001
|
排行榜
1 2 3 4 5 6 7 8
| ZINCRBY leaderboard 10 "user:1001"
ZREVRANGE leaderboard 0 9 WITHSCORES
ZREVRANK leaderboard "user:1001"
|
总结
Redis 是一个功能强大且灵活的内存数据库,通过合理选择数据结构和使用正确的命令,可以高效地解决各种业务场景的问题。建议在实际使用中:
- 根据业务场景选择合适的数据类型
- 合理设置键的过期时间
- 注意内存使用,避免大键
- 生产环境使用 SCAN 代替 KEYS
- 合理配置持久化策略
更多详细信息请参考 Redis 官方文档。