一、Redis概述
1.1 什么是NoSQL
NoSQL(Not Only SQL)是指非关系型数据库,与传统的关系型数据库不同,NoSQL数据库不使用表格结构存储数据,而是采用键值对、文档、列族、图等多种数据模型。
1.2 什么是Redis
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对存储系统,常用作数据库、缓存和消息中间件。它支持多种数据结构,读写速度极快(可达10万+ QPS)。
1.3 Redis与其他NoSQL对比
| 特性 | Redis | Memcached | MongoDB |
|---|---|---|---|
| 数据结构 | 丰富(5种+) | 简单(字符串) | 文档型 |
| 数据持久化 | 支持 | 不支持 | 支持 |
| 数据容量 | 受内存限制 | 受内存限制 | 磁盘+内存 |
| 主从复制 | 支持 | 不支持 | 支持 |
| 事务支持 | 部分支持 | 不支持 | 支持 |
| 查询能力 | 按Key查询 | 按Key查询 | 丰富查询 |
1.4 Redis应用场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 缓存 | 减轻数据库压力 | 用户会话、页面缓存 |
| 计数器 | 原子操作 | 点赞数、访问量 |
| 排行榜 | 有序集合 | 积分排行、热搜榜 |
| 分布式锁 | 互斥访问 | 秒杀、防止重复提交 |
| 消息队列 | 发布订阅 | 异步任务通知 |
| 社交关系 | 集合运算 | 共同好友、关注关系 |
二、Redis安装
2.1 系统要求
bash
# 推荐配置
CPU: 2核以上
内存: 4GB以上(建议为数据量的2-3倍)
磁盘: SSD(用于持久化)
系统: Linux(生产环境)
2.2 源码编译安装
bash
# 1. 安装依赖
yum install -y gcc make wget
# 2. 下载Redis源码
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4
# 3. 编译安装
make -j$(nproc)
make install PREFIX=/usr/local/redis
# 4. 创建配置和数据目录
mkdir -p /etc/redis /var/lib/redis /var/log/redis
# 5. 复制配置文件
cp redis.conf /etc/redis/6379.conf
# 6. 创建Redis用户
useradd -r -s /sbin/nologin redis
chown -R redis:redis /var/lib/redis /var/log/redis
2.3 包管理器安装
bash
# Ubuntu/Debian
apt-get update
apt-get install -y redis-server
# CentOS/RHEL
yum install -y epel-release
yum install -y redis
# 验证安装
redis-server -v
redis-cli -v
2.4 启动与停止
bash
# 启动
systemctl start redis
systemctl enable redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
ps aux | grep redis
# 查看端口
netstat -tlnp | grep 6379
三、Redis核心配置
3.1 配置文件位置
bash
# Ubuntu/Debian
/etc/redis/redis.conf
# CentOS/RHEL
/etc/redis.conf
# 源码安装
/usr/local/redis/etc/redis.conf
3.2 基础配置
ini
# redis.conf 核心配置
# 1. 网络配置
bind 127.0.0.1 # 监听地址(生产环境建议内网IP)
port 6379 # 监听端口
protected-mode yes # 保护模式
tcp-backlog 511 # TCP连接队列长度
timeout 0 # 客户端空闲超时(0=不超时)
tcp-keepalive 300 # TCP保活间隔
# 2. 通用配置
daemonize yes # 后台运行
pidfile /var/run/redis_6379.pid
loglevel notice # 日志级别(debug/verbose/notice/warning)
logfile /var/log/redis/redis.log
databases 16 # 数据库数量(0-15)
# 3. 内存管理
maxmemory 2gb # 最大内存限制
maxmemory-policy allkeys-lru # 内存淘汰策略
# 4. 持久化配置
save 900 1 # 900秒内至少1个key变化则保存
save 300 10 # 300秒内至少10个key变化则保存
save 60 10000 # 60秒内至少10000个key变化则保存
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
# 5. 主从复制配置
replicaof <masterip> <masterport>
masterauth <master-password>
replica-read-only yes
replica-serve-stale-data yes
# 6. 安全配置
requirepass your_password # 设置密码
rename-command FLUSHALL "" # 禁用危险命令
rename-command FLUSHDB ""
# 7. 慢查询日志
slowlog-log-slower-than 10000 # 慢查询阈值(微秒)
slowlog-max-len 128 # 慢查询日志长度
# 8. 客户端配置
maxclients 10000 # 最大客户端连接数
3.3 内存淘汰策略
| 策略 | 说明 | 适用场景 |
|---|---|---|
| noeviction | 不淘汰,内存满时报错 | 不允许丢失数据的场景 |
| allkeys-lru | 从所有key中淘汰最近最少使用 | 通用缓存场景(推荐) |
| volatile-lru | 从设置了过期时间的key中淘汰LRU | 混合使用场景 |
| allkeys-random | 随机淘汰 | 数据访问均匀分布 |
| volatile-random | 从过期key中随机淘汰 | 需要控制过期时间 |
| volatile-ttl | 淘汰即将过期的key | 优先淘汰过期数据 |
四、Redis常用命令
4.1 基础命令
bash
# 连接Redis
redis-cli -h 127.0.0.1 -p 6379 -a password
# 密码认证(连接后)
AUTH password
# 查看服务器信息
INFO
INFO server
INFO memory
INFO stats
# 选择数据库
SELECT 0
# 查看当前数据库key数量
DBSIZE
# 查看所有key(生产慎用)
KEYS *
SCAN 0
# 删除key
DEL key1 key2
# 检查key是否存在
EXISTS key
# 设置过期时间(秒)
EXPIRE key 60
# 查看剩余生存时间
TTL key
# 清空当前数据库
FLUSHDB
# 清空所有数据库
FLUSHALL
# 退出
QUIT
4.2 通用Key操作
bash
# 查询所有key
redis-cli KEYS "user:*"
# 批量删除
redis-cli KEYS "cache:*" | xargs redis-cli DEL
# 查看key类型
TYPE mykey
# 重命名key
RENAME oldkey newkey
RENAMENX oldkey newkey # 仅当新key不存在时
# 序列化key
DUMP mykey
# 反序列化
RESTORE mykey 0 "\x00\x03abc"
# 随机返回一个key
RANDOMKEY
五、Redis数据类型
5.1 字符串(String)
bash
# 设置值
SET key "value"
SETNX key "value" # 仅当key不存在时
SETEX key 60 "value" # 设置值并指定过期时间
MSET key1 "v1" key2 "v2" # 批量设置
# 获取值
GET key
MGET key1 key2 # 批量获取
GETSET key "new" # 获取旧值并设置新值
# 数值操作
INCR counter # 自增1
INCRBY counter 10 # 增加指定值
DECR counter # 自减1
DECRBY counter 5 # 减少指定值
INCRBYFLOAT price 1.5 # 浮点数增加
# 字符串操作
APPEND key "suffix" # 追加内容
STRLEN key # 获取长度
GETRANGE key 0 5 # 获取子串
SETRANGE key 5 "abc" # 覆盖子串
# 位操作
SETBIT key 10 1 # 设置位
GETBIT key 10 # 获取位
BITCOUNT key # 统计1的个数
5.2 哈希(Hash)
bash
# 设置字段
HSET user:1001 name "张三"
HSET user:1001 age 25 city "北京"
HMSET user:1002 name "李四" age 30 # 批量设置
# 获取字段
HGET user:1001 name
HMGET user:1001 name age
HGETALL user:1001 # 获取所有字段和值
HKEYS user:1001 # 获取所有字段名
HVALS user:1001 # 获取所有字段值
# 数值操作
HINCRBY user:1001 age 1
HINCRBYFLOAT user:1001 score 0.5
# 其他操作
HEXISTS user:1001 name # 检查字段是否存在
HDEL user:1001 city # 删除字段
HLEN user:1001 # 获取字段数量
HSCAN user:1001 0 # 渐进式遍历