NoSQL之Redis配置与优化

一、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        # 渐进式遍历
相关推荐
indexsunny3 小时前
互联网大厂Java面试实战:基于微服务与云原生的电商场景问答解析
java·数据库·spring boot·docker·微服务·云原生·kubernetes
m0_678485453 小时前
如何在保留功能逻辑的前提下隐藏网页菜单项(CSS 隐藏技巧).txt
jvm·数据库·python
Wyz201210243 小时前
Python 字典高效合并:自定义处理重复键的完整指南
jvm·数据库·python
2401_897190553 小时前
如何在保留功能逻辑的前提下隐藏网页菜单项(CSS 隐藏
jvm·数据库·python
倔强的石头1063 小时前
NFS网络文件系统下企业级数据库安装排障实战:环境变量失效与权限问题的深度解析
网络·数据库
2501_914245933 小时前
如何在phpMyAdmin中查询加密数据_AES_DECRYPT函数的实时解密展示
jvm·数据库·python
21439653 小时前
如何防止SQL注入利用存储过程_确保存储过程不拼字符串
jvm·数据库·python
2301_764150563 小时前
如何统计表单中已填写的特定类名输入框数量
jvm·数据库·python
2401_897190553 小时前
宝塔面板SSH提示连接被拒绝_检查服务器端口开关
jvm·数据库·python