Redis 基础配置与使用完全指南
Redis 基础配置与使用完全指南
Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。本指南将详细介绍 Redis 的配置、使用和最佳实践。
一、Redis 核心概念
Redis 提供了丰富的数据结构,包括字符串、哈希、列表、集合、有序集合等。
1. 字符串(String)
Redis 最基本的数据类型,最大可以存储 512MB。
2. 哈希(Hash)
适合存储对象,比如用户信息。
3. 列表(List)
简单的列表,支持两端 push/pop 操作。
4. 集合(Set)
字符串集合,不允许重复,支持交集、并集、差集操作。
5. 有序集合(Zset)
字符串集合,不允许重复,每个元素关联一个 score,用于排序。
6. 位图(Bitmap)
基于字符串的位操作,节省空间。
7. 超级基数(HyperLogLog)
基于概率的基数统计,空间占用固定。

二、Redis 安装配置
1. 安装 Redis
# Ubuntu/Debian
apt-get update
apt-get install redis-server
# CentOS/RHEL
yum install redis
# 编译安装
wget https://download.redis.io/redis-stable.tar.gz
tar -xzf redis-stable.tar.gz
cd redis-stable
make
make install
2. 配置 redis.conf
# 绑定地址
bind 127.0.0.1
# 端口
port 6379
# 保护模式
protected-mode yes
# 守护进程
daemonize yes
# PID 文件
pidfile /var/run/redis_6379.pid
# 日志级别
loglevel notice
# 日志文件
logfile /var/log/redis.log
# 数据库数量
databases 16
# RDB 持久化
save 900 1
save 300 10
save 60 10000
# AOF 持久化
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 最大内存
maxmemory 256mb
maxmemory-policy allkeys-lru
# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128
3. 启动 Redis
# 使用配置文件启动
redis-server /etc/redis/redis.conf
# 或使用命令行
redis-server --port 6379 --appendonly yes
三、Redis 命令行操作
1. 字符串操作
# 设置和获取
SET key value
GET key
# 批量操作
MSET key1 value1 key2 value2
MGET key1 key2
# 设置过期时间
SETEX key seconds value
PTEX key milliseconds value
# 递增递减
INCR key
DECR key
INCRBY key increment
DECRBY key decrement
# 获取和设置
GETSET key value
STRLEN key
2. 哈希操作
# 设置和获取
HSET key field value
HGET key field
# 批量操作
HMSET key field1 value1 field2 value2
HMGET key field1 field2
# 删除字段
HDEL key field1 field2
# 获取所有字段和值
HGETALL key
# 判断字段是否存在
HEXISTS key field
# 获取字段数量
HLEN key
# 迭代操作
HSCAN key cursor [MATCH pattern] [COUNT count]
3. 列表操作
# 两端操作
LPUSH key value [value ...]
RPUSH key value [value ...]
LPOP key
RPOP key
# 批量操作
LPUSHX key value
RPUSHX key value
# 获取元素
LINDEX key index
LLEN key
# 获取范围
LRANGE key start stop
# 删除和修改
LREM key count value
LSET key index value
LTRIM key start stop
# 阻塞式操作
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
4. 集合操作
# 添加和删除
SADD key member [member ...]
SREM key member [member ...]
# 获取集合
SMEMBERS key
SCARD key
# 判断成员
SISMEMBER key member
# 差集运算
SDIFF key [key ...]
SDIFFSTORE destination key [key ...]
# 交集运算
SINTER key [key ...]
SINTERSTORE destination key [key ...]
# 并集运算
SUNION key [key ...]
SUNIONSTORE destination key [key ...]
# 随机获取
SRANDMEMBER key [count]
# 移动成员到集合
SMOVE source destination member
# 弹出一个成员
SPOP key [count]
5. 有序集合操作
# 添加成员
ZADD key score member [score member ...]
# 获取排名
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
# 获取分数
ZSCORE key member
ZMSCORE key member [member ...]
# 删除成员
ZREM key member [member ...]
# 获取数量
ZCARD key
ZCOUNT key min max
# 排名
ZRANK key member
ZREVRANK key member
# 范围查询
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
# 交集和并集
ZUNIONSTORE destination numkeys key [key ...]
ZINTERSTORE destination numkeys key [key ...]
6. 键操作
# 删除键
DEL key [key ...]
# 检查是否存在
EXISTS key
# 设置过期时间
EXPIRE key seconds
PEXPIRE key milliseconds
EXPIREAT key timestamp
PEXPIREAT key timestamp
# 获取剩余时间
TTL key
PTTL key
# 移动数据库
MOVE key db
# 重命名
RENAME key newkey
RENAMENX key newkey
# 获取类型
TYPE key
# 克隆
DUP key
四、Redis 持久化
1. RDB 持久化
快照方式,定期将数据集写入磁盘。
# 配置示例
save 900 1 # 15 分钟至少 1 个 key 变化
save 300 10 # 5 分钟至少 10 个 key 变化
save 60 10000 # 1 分钟至少 10000 个 key 变化
# 触发手动保存
SAVE # 阻塞式
BGSAVE # 异步式
2. AOF 持久化
追加日志,记录每次写操作。
# 配置选项
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec # 每秒同步
appendfsync always # 每次写操作都同步
appendfsync no # 由操作系统决定
# 重写 AOF 文件
BGREWRITEAOF
3. 持久化对比
| 特性 | RDB | AOF |
|---|---|---|
| 完整性 | 可能丢失 | 更完整 |
| 速度 | 更快 | 较慢 |
| 文件大小 | 小 | 大 |
| 恢复速度 | 快 | 慢 |
五、Redis 内存管理
1. 内存配置
# 最大内存
maxmemory 256mb
# 内存策略
maxmemory-policy allkeys-lru
maxmemory-samples 5
2. 内存策略说明
| 策略 | 说明 |
|---|---|
| noeviction | 不淘汰,写入返回错误 |
| allkeys-lru | 淘汰最近最少使用的键 |
| volatile-lru | 淘汰设置了 TTL 的最近最少使用的键 |
| allkeys-random | 随机淘汰 |
| volatile-random | 随机淘汰设置 TTL 的键 |
| volatile-ttl | 淘汰即将过期的键 |
3. 监控内存
# 查看内存使用
INFO memory
# 查看大键
KEYS *
MEMORY USAGE key
六、Redis 高可用方案
1. 主从复制(Replication)
# 配置从节点
replicaof 127.0.0.1 6379
# 查看复制状态
INFO replication
2. Sentinel(哨兵)
Redis Sentinel 提供自动故障转移。
# sentinel.conf 配置
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
3. Cluster(集群)
# 启动集群
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
# 查看集群状态
CLUSTER INFO
CLUSTER NODES
七、Redis 客户端
1. Java 客户端
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.1</version>
</dependency>
2. Jedis 示例
// 连接池配置
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(100);
poolConfig.setMaxIdle(20);
poolConfig.setMaxWaitMillis(3000);
// 创建连接池
JedisPool pool = new JedisPool(poolConfig, "localhost", 6379);
// 使用
try (Jedis jedis = pool.getResource()) {
jedis.set("key", "value");
String value = jedis.get("key");
}
3. Spring Data Redis
@Configuration
@EnableRedisHttpSession
public class RedisConfig {
@Bean
public RedisConnectionFactory connectionFactory() {
LettuceConnectionFactory factory = new LettuceConnectionFactory();
factory.setHostName("localhost");
factory.setPort(6379);
return factory;
}
@Bean
public RedisTemplate redisTemplate() {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(connectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
八、Redis 缓存优化
1. 缓存策略
- Cache Aside – 应用同时管理数据库和缓存
- Read/Write Through – 缓存层负责数据持久化
- Write Behind – 异步写入数据库
2. 缓存穿透
查询不存在的数据。
解决方案:
1. 缓存空对象
2. 布隆过滤器拦截
3. 缓存雪崩
大量缓存同时过期。
解决方案:
1. 设置不同的过期时间
2. 使用互斥锁
4. 缓存预热
// 应用启动时预热缓存
@PostConstruct
public void warmupCache() {
List hotKeys = getHotKeys();
for (String key : hotKeys) {
cache.put(key, loadData(key));
}
}
5. 热点 Key
// 检测热点 key
SLOWLOG GET 10
MONITOR
九、Redis 安全配置
1. 密码认证
# redis.conf
requirepass your_strong_password
2. 限制绑定
bind 127.0.0.1 192.168.1.100
3. 禁用危险命令
# 重命名或删除危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG "bgconfig get maxmemory"
4. ACL 访问控制
# 创建用户
ACL SETUSER reader on ~cache:* +@read -@write
ACL SETUSER writer on ~cache:* +@read +@write
# 查看用户列表
ACL LIST
十、最佳实践
1. 命名规范
# 格式:模块:业务:资源
user:1001:info
order:1001:detail
cart:user123:items
2. 键值设计
- 避免过大的 key 或 value
- 合理设置过期时间
- 使用 Hash 存储对象
- 避免热 key 问题
3. 事务和 pipeline
// 使用 pipeline 批量操作
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pipeline.set("key:" + i, "value:" + i);
}
pipeline.sync();
4. 监控和告警
# 监控指标
MEMORY USED
KEYS EXPIRED
HITS MISS
REJECTED_CONNECTIONS
BLOCKED_KEYS
十一、总结
Redis 是一个高性能的键值数据库,适用于缓存、消息队列、计数器等多种场景。通过合理的配置和优化,可以充分发挥 Redis 的性能优势,构建高可用、高性能的应用系统。
掌握 Redis 的核心概念、配置方法和最佳实践,能够帮助开发者解决各种业务挑战,提升系统性能。
#Redis #数据库 #缓存 #NoSQL #编程教程



发表评论