欢迎光临
我们一直在努力

Redis核心基础与实战:数据类型、缓存策略与性能优化

Redis核心基础与实战:数据类型、缓存策略与性能优化

一、Redis简介

Redis(Remote Dictionary Server)是一款开源的、基于BSD协议的高性能键值对数据库。与传统数据库相比,Redis具有以下三大特点:

  • 数据持久化:可将内存中的数据保存到磁盘,重启后重新加载。
  • 丰富的数据结构:支持String、List、Hash、Set、Sorted Set等。
  • 主从备份:支持master-slave模式的数据备份。

1.1 Redis优势

特性说明
性能极高 10万~100万+ QPS,微秒级响应
数据类型丰富 二进制安全的字符串、列表、哈希、集合、有序集合
原子性 所有操作原子,支持事务
丰富特性 发布订阅、Key过期、Lua脚本、Pipeline等

1.2 哈希槽(Hash Slot)

Redis集群将键空间划分为16384个哈希槽(0~16383),通过公式 HASH_SLOT = CRC16(key) mod 16384 计算键所属槽位,实现数据分片和动态迁移。

1.3 常见应用场景

  • 热点数据缓存:电商、社交等高并发场景,采用Cache-Aside模式,设置合理TTL。
  • 分布式锁:利用SETNX + 过期时间 + Lua脚本解锁。
  • 计数器与限流:INCR原子递增,结合过期时间实现接口限流。
  • 排行榜系统:Sorted Set按分数实时排序。
  • 分布式会话:集中存储用户会话,支持水平扩展。
  • 消息队列:List实现简单队列,BRPOP阻塞获取。
  • 位图应用:签到、活跃用户统计。
  • 地理信息存储:GEO结构实现附近的人/店铺查询。

1.4 Redis单线程模型

Redis 6.0之前使用单线程处理请求,原因:

  • 操作基于内存,速度快;
  • 核心功能比数据库简单;
  • 避免线程竞争开销;
  • 使用epoll等IO多路复用技术,一个线程处理多个socket。

二、数据类型详解

Redis所有key都是字符串,value支持以下5种基本类型。

2.1 String(字符串)

  • 最大容量512MB,二进制安全。
  • 常用命令:
命令说明
SET key value [EX seconds] [NX|XX] 设置值
GET key 获取值
MSET key1 val1 [key2 val2 …] 批量设置
MGET key1 [key2 …] 批量获取
INCR key / INCRBY key increment 原子递增
APPEND key value 追加
STRLEN key 返回长度
EXPIRE key seconds 设置过期时间

2.2 List(列表)

  • 有序、可重复,左右均可操作。
  • 最多2^32-1个元素。
  • 常用命令:
命令说明
LPUSH key value [value…] 左边插入
RPUSH key value [value…] 右边插入
LPOP key / RPOP key 弹出元素
LRANGE key start stop 获取指定范围元素
LLEN key 获取长度
LINDEX key index 索引取值
LTRIM key start stop 修剪列表

2.3 Set(集合)

  • 无序、无重复,支持集合间操作。
  • 常用命令:
命令说明
SADD key member [member…] 添加成员
SMEMBERS key 获取所有成员
SISMEMBER key member 判断是否存在
SINTER key1 [key2…] 交集
SUNION key1 [key2…] 并集
SDIFF key1 [key2…] 差集

2.4 ZSet(有序集合)

  • 每个元素关联一个double类型分数(score),按分数排序,元素不可重复,分数可重复。
  • 常用命令:
命令说明
ZADD key score member [score member…] 添加
ZRANGE key start stop [WITHSCORES] 按分数升序返回
ZREVRANGE key start stop [WITHSCORES] 降序
ZRANK key member 获取排名(升序)
ZSCORE key member 获取分数
ZREM key member [member…] 删除

2.5 Hash(哈希)

  • 键值对集合,适合存储对象。
  • 常用命令:
命令说明
HSET key field value 设置字段
HGET key field 获取字段
HMSET key field1 value1 [field2 value2…] 批量设置
HGETALL key 获取所有字段和值
HDEL key field [field…] 删除字段
HKEYS key / HVALS key 获取所有字段或值

三、Redis缓存三大问题及解决方案

3.1 缓存穿透

定义:查询一个不存在的数据(缓存和数据库都没有),导致请求直接打到数据库。

解决方案:

  • 接口层校验(如ID<=0直接拦截)。
  • 缓存空结果(短TTL)。
  • 布隆过滤器:预先将所有可能存在的数据哈希到bitmap,请求前过滤。

3.2 缓存击穿

定义:某个热点Key恰好过期,大量并发请求同时打到数据库。

解决方案:

  • 加锁排队:查询数据库时加互斥锁,只允许一个线程重建缓存。
  • 设置永不过期:逻辑上设置永不过期,后台异步更新。

3.3 缓存雪崩

定义:大面积缓存同时过期或Redis宕机,大量请求涌入数据库。

解决方案:

  • 过期时间加随机值(如10分钟 + 1~5分钟随机)。
  • 搭建高可用集群(哨兵、Cluster)。
  • 服务限流熔断(Sentinel/Hystrix)。
  • 多级缓存(本地缓存 + Redis)。

四、Pipeline流水线

Redis是客户端-服务端模型,执行一条命令需要RTT(往返时间)。Pipeline将一组命令打包,一次RTT发送给Redis,并按顺序返回结果,大幅提升性能(尤其网络延迟较大时)。

对比示例:

网络环境非Pipeline使用Pipeline
本机 573ms 134ms
内网服务器 1610ms 240ms
异地机房 80000ms 1104ms

五、Redis安装与配置

5.1 源码安装(CentOS7)

yum install tcl gcc gcc-c++ -y
tar zxvf redis-6.2.14.tar.gz -C /usr/local/
cd /usr/local/redis-6.2.14/
make && make install
redis-server redis.conf &

5.2 常用配置项

配置项说明
bind 0.0.0.0 监听所有地址
port 6379 默认端口
daemonize yes 后台运行
requirepass foobared 设置密码
maxmemory <bytes> 最大内存
maxmemory-policy noeviction 淘汰策略

5.3 动态配置(CONFIG命令)

CONFIG SET requirepass 123456
CONFIG GET requirepass
CONFIG SET maxmemory 1G

六、Redis慢查询

Redis慢查询日志记录执行时间超过 slowlog-log-slower-than(微秒)的命令。

# 查看慢查询条数
SLOWLOG LEN
# 获取慢查询记录
SLOWLOG GET [n]
# 清空慢查询
SLOWLOG RESET

赞(0)
未经允许不得转载:171主机测评 » Redis核心基础与实战:数据类型、缓存策略与性能优化
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址