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 架构

二、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 #编程教程

标签

发表评论