Redis基础教程
Redis简介
什么是Redis
Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。
Redis的特点
- 高性能:基于内存存储,读写速度极快
- 数据结构丰富:支持多种数据类型
- 持久化:支持RDB和AOF两种持久化方式
- 高可用:支持主从复制、哨兵模式、集群模式
- 原子性操作:所有操作都是原子性的
- 发布订阅:支持消息发布订阅模式
Redis应用场景
- 缓存:提高数据访问速度
- 会话存储:存储用户会话信息
- 计数器:网站访问量、点赞数等
- 排行榜:游戏排行、热门文章等
- 消息队列:异步处理任务
- 实时系统:在线用户列表、聊天室等
Redis配置
基本配置文件
# /etc/redis/redis.conf # 绑定地址
bind 127.0.0.1 # 端口
port 6379 # 后台运行
daemonize yes # 进程ID文件
pidfile /var/run/redis_6379.pid # 日志级别
loglevel notice # 日志文件
logfile /var/log/redis_6379.log # 数据库数量
databases 16 # 密码设置
requirepass your_password # 最大内存
maxmemory 2gb # 内存淘汰策略
maxmemory-policy allkeys-lru
启动Redis服务
# 启动Redis服务器
redis-server /etc/redis/redis.conf # 使用systemctl(如果配置了服务)
sudo systemctl start redis
sudo systemctl enable redis
sudo systemctl status redis # 连接Redis客户端
redis-cli
redis-cli -h 127.0.0.1 -p 6379 -a your_password
Redis数据类型
字符串(String)
# 设置和获取
SET name "Redis教程"
GET name # 设置过期时间
SETEX session:user1 3600 "用户数据" # 仅在键不存在时设置
SETNX lock:resource1 1 # 数值操作
SET counter 0
INCR counter # 递增1
INCRBY counter 5 # 递增5
DECR counter # 递减1
DECRBY counter 3 # 递减3 # 字符串操作
SET message "Hello"
APPEND message " World" # 追加字符串
STRLEN message # 获取长度
GETRANGE message 0 4 # 获取子字符串
哈希(Hash)
# 设置和获取哈希字段
HSET user:1001 name "张三"
HGET user:1001 name
HGETALL user:1001 # 批量操作
HMSET user:1002 name "李四" age 30 city "北京"
HMGET user:1002 name age city # 判断字段是否存在
HEXISTS user:1001 name # 删除字段
HDEL user:1001 email # 获取所有字段名或值
HKEYS user:1001
HVALS user:1001 # 数值操作
HINCRBY user:1001 age 1
列表(List)
# 左右插入
LPUSH tasks "任务1""任务2"
RPUSH tasks "任务3""任务4" # 左右弹出
LPOP tasks
RPOP tasks # 获取列表内容
LRANGE tasks 0 -1 # 获取所有元素
LRANGE tasks 0 2 # 获取前3个元素 # 获取列表长度
LLEN tasks # 根据索引获取元素
LINDEX tasks 0 # 修改指定索引的元素
LSET tasks 0 "新任务" # 删除元素
LREM tasks 1 "任务1"# 删除1个"任务1" # 阻塞弹出(常用于消息队列)
BLPOP tasks 10 # 阻塞10秒等待元素
集合(Set)
# 添加成员
SADD fruits "苹果" "香蕉" "橙子"
SADD colors "红色" "绿色" "蓝色" # 获取所有成员
SMEMBERS fruits # 判断成员是否存在
SISMEMBER fruits "苹果" # 删除成员
SREM fruits "橙子" # 随机获取成员
SRANDMEMBER fruits 2 # 弹出成员
SPOP fruits # 集合运算
SADD set1 1 2 3 4
SADD set2 3 4 5 6 SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集 # 将运算结果存储到新集合
SINTERSTORE result set1 set2
有序集合(Sorted Set)
# 添加成员(带分数)
ZADD scores 85 "张三" 92 "李四" 78 "王五" # 根据排名获取成员
ZRANGE scores 0 -1 # 按分数升序
ZRANGE scores 0 -1 WITHSCORES
ZREVRANGE scores 0 -1 # 按分数降序 # 根据分数范围获取成员
ZRANGEBYSCORE scores 80 90
ZRANGEBYSCORE scores (80 90 # 不包含80 # 获取成员分数
ZSCORE scores "张三" # 获取成员排名
ZRANK scores "张三" # 升序排名
ZREVRANK scores "张三" # 降序排名 # 增加成员分数
ZINCRBY scores 5 "王五" # 删除成员
ZREM scores "李四" # 统计分数范围内的成员数量
ZCOUNT scores 80 90 # 获取集合大小
ZCARD scores
Redis基本命令
键操作命令
# 查看所有键
KEYS *
KEYS user:* # 模式匹配 # 检查键是否存在
EXISTS mykey # 删除键
DEL mykey
DEL key1 key2 key3 # 设置过期时间
EXPIRE mykey 3600 # 3600秒后过期
EXPIREAT mykey 1609459200 # 指定时间戳过期
TTL mykey # 查看剩余生存时间
PERSIST mykey # 移除过期时间 # 重命名键
RENAME oldkey newkey
RENAMENX oldkey newkey # 仅在新键不存在时重命名 # 获取键的类型
TYPE mykey # 随机获取一个键
RANDOMKEY # 扫描键(推荐用于生产环境)
SCAN 0 MATCH user:* COUNT 10
数据库操作
# 选择数据库(默认16个数据库,编号0-15)
SELECT 0
SELECT 1 # 清空当前数据库
FLUSHDB # 清空所有数据库
FLUSHALL # 移动键到其他数据库
MOVE mykey 1 # 获取数据库大小
DBSIZE # 获取最后保存时间
LASTSAVE
事务命令
# 开启事务
MULTI # 添加命令到事务队列
SET key1 value1
SET key2 value2
INCR counter # 执行事务
EXEC # 取消事务
DISCARD # 监视键(乐观锁)
WATCH mykey
MULTI
SET mykey newvalue
EXEC
脚本命令
# 执行Lua脚本
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 mykey myvalue # 加载脚本并返回SHA1值
SCRIPT LOAD "return redis.call('GET', KEYS[1])" # 通过SHA1执行脚本
EVALSHA sha1_hash 1 mykey # 清除脚本缓存
SCRIPT FLUSH # 检查脚本是否存在
SCRIPT EXISTS sha1_hash
Redis高级功能
发布订阅模式
# 订阅频道
SUBSCRIBE news sports # 订阅模式
PSUBSCRIBE news:* # 发布消息
PUBLISH news "今日新闻内容"
PUBLISH sports "体育赛事报道" # 查看订阅信息
PUBSUB CHANNELS # 查看所有频道
PUBSUB NUMSUB news # 查看频道订阅数
PUBSUB NUMPAT # 查看模式订阅数 # 退订
UNSUBSCRIBE news
PUNSUBSCRIBE news:*
Redis Streams(Redis 5.0+)
# 添加消息到流
XADD mystream * name "张三" age 25
XADD mystream * name "李四" age 30 # 读取流消息
XREAD COUNT 2 STREAMS mystream 0 # 创建消费者组
XGROUP CREATE mystream mygroup 0 # 消费者读取消息
XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream > # 确认消息处理
XACK mystream mygroup message_id # 查看流信息
XINFO STREAM mystream
XLEN mystream # 流长度
HyperLogLog(基数统计)
# 添加元素
PFADD unique_visitors user1 user2 user3 # 获取基数估算值
PFCOUNT unique_visitors # 合并多个HyperLogLog
PFMERGE merged_visitors visitors1 visitors2
地理位置(Geo)
# 添加地理位置
GEOADD cities 116.28 39.55 beijing 121.29 31.14 shanghai # 获取位置坐标
GEOPOS cities beijing # 计算距离
GEODIST cities beijing shanghai km # 根据坐标查找附近位置
GEORADIUS cities 116 39 100 km WITHDIST WITHCOORD # 根据成员查找附近位置
GEORADIUSBYMEMBER cities beijing 500 km
位图(Bitmap)
# 设置位
SETBIT user_online 1001 1 # 用户1001在线
SETBIT user_online 1002 0 # 用户1002离线 # 获取位
GETBIT user_online 1001 # 统计设置为1的位数
BITCOUNT user_online # 查找第一个设置为1或0的位
BITPOS user_online 1
BITPOS user_online 0 # 位运算
BITOP AND result key1 key2 # 与运算
BITOP OR result key1 key2 # 或运算
BITOP XOR result key1 key2 # 异或运算
BITOP NOT result key1 # 非运算
Redis持久化
RDB持久化
RDB是Redis的默认持久化方式,通过创建数据快照来保存数据。
RDB配置
# redis.conf配置
save 900 1 # 900秒内至少1个键改变时保存
save 300 10 # 300秒内至少10个键改变时保存
save 60 10000 # 60秒内至少10000个键改变时保存 # RDB文件名和路径
dbfilename dump.rdb
dir /var/lib/redis/ # 压缩RDB文件
rdbcompression yes # RDB文件校验
rdbchecksum yes
RDB命令
# 手动创建快照
SAVE # 同步保存(阻塞)
BGSAVE # 异步保存(后台进行) # 获取最后保存时间
LASTSAVE # 检查后台保存是否在进行
INFO persistence
AOF持久化
AOF通过记录每个写操作来保存数据,提供更好的数据安全性。
AOF配置
# 启用AOF
appendonly yes # AOF文件名
appendfilename "appendonly.aof" # 同步策略
appendfsync everysec # 每秒同步一次(推荐)
# appendfsync always # 每次写操作都同步
# appendfsync no # 由操作系统决定 # AOF重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb # AOF重写时是否继续同步
no-appendfsync-on-rewrite no
AOF命令
# 手动重写AOF文件
BGREWRITEAOF # 查看AOF状态
INFO persistence
混合持久化(Redis 4.0+)
# 启用混合持久化
aof-use-rdb-preamble yes
持久化策略选择
只使用RDB的场景
- 数据可以容忍一定程度的丢失
- 需要定期备份
- 对性能要求较高
只使用AOF的场景
- 数据安全性要求很高
- 可以容忍较大的文件大小
- 需要详细的操作记录
同时使用RDB和AOF
- 需要最高的数据安全性
- 可以容忍额外的存储和性能开销
Redis集群与高可用
主从复制
配置主从复制
# 从服务器配置(redis.conf)
replicaof 192.168.1.100 6379 # 主服务器IP和端口
masterauth password # 主服务器密码 # 或者通过命令设置
REPLICAOF 192.168.1.100 6379
主从复制监控
# 查看复制信息
INFO replication # 在主服务器查看从服务器状态
INFO replication # 从服务器查看同步状态
INFO replication
Redis Sentinel(哨兵模式)
Sentinel配置
# sentinel.conf
port 26379
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster password
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
启动Sentinel
# 启动Sentinel
redis-sentinel /path/to/sentinel.conf # 或者
redis-server /path/to/sentinel.conf --sentinel
Sentinel命令
# 连接Sentinel
redis-cli -p 26379 # 查看监控的主服务器
SENTINEL masters # 查看从服务器
SENTINEL slaves mymaster # 查看其他Sentinel
SENTINEL sentinels mymaster # 手动故障转移
SENTINEL failover mymaster
Redis Cluster(集群模式)
集群配置
# redis.conf(每个节点)
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage no
创建集群
# 启动多个Redis实例(至少6个,3主3从)
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf # 创建集群
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
集群管理命令
# 连接集群
redis-cli -c -p 7000 # 查看集群信息
CLUSTER INFO
CLUSTER NODES # 添加节点
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 # 删除节点
redis-cli --cluster del-node 127.0.0.1:7000 node_id # 重新分配槽位
redis-cli --cluster reshard 127.0.0.1:7000 # 检查集群状态
redis-cli --cluster check 127.0.0.1:7000
Redis性能优化
内存优化
内存使用分析
# 查看内存使用情况
INFO memory # 查看键的内存使用
MEMORY USAGE keyname # 分析内存使用模式
redis-cli --bigkeys
redis-cli --memkeys
内存优化配置
# 最大内存限制
maxmemory 2gb # 内存淘汰策略
maxmemory-policy allkeys-lru # 可选的淘汰策略:
# noeviction:不淘汰,内存满时返回错误
# allkeys-lru:在所有键中使用LRU淘汰
# volatile-lru:在设置了过期时间的键中使用LRU淘汰
# allkeys-random:随机淘汰所有键
# volatile-random:随机淘汰设置了过期时间的键
# volatile-ttl:淘汰即将过期的键 # 内存采样精度
maxmemory-samples 5
网络优化
# TCP keepalive
tcp-keepalive 300 # 客户端连接超时
timeout 0 # 客户端输出缓冲区限制
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60 # 最大客户端连接数
maxclients 10000
性能监控
# 实时监控命令
MONITOR # 查看慢查询日志
SLOWLOG GET 10
SLOWLOG LEN
SLOWLOG RESET # 慢查询配置
slowlog-log-slower-than 10000 # 微秒
slowlog-max-len 128 # 查看连接的客户端
CLIENT LIST
CLIENT KILL ip:port # 延迟监控
redis-cli --latency
redis-cli --latency-history
redis-cli --latency-dist
数据结构优化
字符串优化
# 使用整数而不是字符串(如果可能)
SET counter 123 # 而不是 SET counter "123" # 压缩长字符串
# 在应用层使用压缩算法
哈希优化
# 哈希表配置
hash-max-ziplist-entries 512
hash-max-ziplist-value 64 # 小哈希表会使用压缩列表存储
列表优化
# 列表配置
list-max-ziplist-size -2 # 每个节点最大8KB
list-compress-depth 0 # 压缩深度
集合优化
# 集合配置
set-max-intset-entries 512 # 小整数集合会使用整数集合存储
有序集合优化
# 有序集合配置
zset-max-ziplist-entries 128
zset-max-ziplist-value 64