Redis入门:5大数据类型全解析

引言

在前面的文章中,我们系统学习了 MySQL 关系型数据库。然而,在高并发场景下,MySQL 的磁盘 I/O 往往会成为性能瓶颈。这时就需要引入一种基于内存 的数据库------Redis ,它可以将频繁访问的热点数据缓存到内存中,读写速度可达每秒10万次以上

Redis 常与 MySQL 配合使用,构成"MySQL 持久化存储 + Redis 缓存"的经典架构。本文将详细讲解 Redis 的安装、五种基本数据类型及其完整操作命令。

第一部分:Redis 基础

一、什么是 Redis

属性 说明
全称 REmote DIctionary Server
开发语言 C 语言
存储介质 内存(掉电丢失,需持久化)
默认端口 6379
架构模式 CS 架构(redis-server + redis-cli)
数据库类型 NoSQL(非关系型,键值对存储)

二、Redis vs MySQL

对比项 MySQL Redis
数据库类型 关系型(SQL) 非关系型(NoSQL)
存储介质 磁盘 内存
数据格式 表(行+列) 键值对 + 多种数据结构
读写速度 数千次/秒 10万+次/秒
持久化 天然持久化 需额外配置(RDB/AOF)
事务 ACID 严格 弱事务(无回滚)

三、安装 Redis

切换管理员权限

sudo su

安装 Redis(客户端自动安装)

apt install redis-server

查看服务状态

service redis status

查看端口监听

netstat -natp | grep 6379

连接客户端

redis-cli

测试连接

127.0.0.1:6379> ping

PONG

四、基本全局命令

切换数据库(默认 16 个,编号 0-15)

SELECT 0

查看当前数据库键数量

DBSIZE

查看所有键

KEYS *

判断键是否存在

EXISTS key

查看键的类型

TYPE key

删除键

DEL key

清空当前数据库

FLUSHDB

清空所有数据库

FLUSHALL

设置过期时间(秒)

EXPIRE key seconds

查看剩余时间(-1 永不过期,-2 已过期)

TTL key

第二部分:五种基本数据类型

一、字符串 String

String 是 Redis 最基础的类型,二进制安全 ,最大能存储 512MB。可以存文本、数字、甚至序列化后的对象。

1.1 基本读写

设置值

SET name "disen"

获取值

GET name

输出:"disen"

多个键值对批量设置

MSET key1 val1 key2 val2

多个键值对批量获取

MGET key1 key2

1.2 数值操作

虽然存储为字符串,但 Redis 能识别整数格式并进行原子运算:

自增 1

SET count 10

INCR count

GET count # 11

自减 1

DECR count # 10

指定步长增减

INCRBY count 5 # 15

DECRBY count 3 # 12

应用场景:文章浏览量统计、计数器、限流器。

1.3 字符串操作

追加字符串

SET s "hello"

APPEND s " world"

GET s # "hello world"

获取字符串长度

STRLEN s # 11

获取子串(索引从 0 开始,负值从末尾计)

GETRANGE s 0 4 # "hello"

GETRANGE s 6 -1 # "world"

替换子串

SETRANGE s 6 "Redis"

GET s # "hello Redis"

二、列表 List

List 是双向链表 ,支持两端操作,可以模拟栈和队列。单个列表最多存储 2³² - 1 个元素(约 40 亿)。

2.1 插入与弹出
bash 复制代码
# 从左侧插入
LPUSH mylist 1      # [1]
LPUSH mylist 2      # [2, 1]
LPUSH mylist 3      # [3, 2, 1]

# 从右侧插入
RPUSH mylist 4      # [3, 2, 1, 4]

# 从左侧弹出
LPOP mylist         # 返回 "3",列表变为 [2, 1, 4]

# 从右侧弹出
RPOP mylist         # 返回 "4",列表变为 [2, 1]
2.2 范围查询
bash 复制代码
# 查看所有元素
LRANGE mylist 0 -1  # 返回全部

# 查看前两个
LRANGE mylist 0 1

# 查看倒数两个
LRANGE mylist -2 -1
2.3 进阶操作
bash 复制代码
# 获取列表长度
LLEN mylist

# 根据索引获取元素
LINDEX mylist 0

# 根据索引设置元素值
LSET mylist 0 "newval"

# 删除指定数量的匹配元素(count>0从左,<0从右,=0删除全部)
LREM mylist 2 "val"  # 从左删除 2 个值为 "val" 的元素

# 元素转移:将 m1 的右侧元素弹出,插入到 m2 的左侧
RPOPLPUSH m1 m2

三、集合 Set

Set 是无序的、元素不重复的集合 。底层用哈希表实现,最多存储 2³² - 1 个元素

3.1 基本操作
bash 复制代码
# 添加元素(返回 1 表示新增,返回 0 表示重复)
SADD myset "xiaowang"
SADD myset "xiaoli" "xiaoming"  # 批量添加

# 查看所有元素
SMEMBERS myset

# 判断元素是否存在(1=存在,0=不存在)
SISMEMBER myset "xiaowang"

# 获取元素个数
SCARD myset

# 删除元素
SREM myset "xiaowang"

# 随机获取元素(不删除)
SRANDMEMBER myset 1
3.2 集合运算
bash 复制代码
SADD setA 1 2 3 4
SADD setB 3 4 5 6

# 交集
SINTER setA setB    # {3, 4}

# 并集
SUNION setA setB    # {1, 2, 3, 4, 5, 6}

# 差集
SDIFF setA setB     # {1, 2}

应用场景

  • 抽奖系统SRANDMEMBER 随机抽取中奖者

  • 共同关注:取两个用户的粉丝集合交集

  • 好友推荐:取差集,发现"你可能认识的人"

四、哈希 Hash

Hash 可以理解为一个 Map<字段, 值> ,特别适合存储对象

4.1 基本操作
bash 复制代码
# 设置单个字段
HSET student:1 id 1001
HSET student:1 name "小白"
HSET student:1 age 23

# 获取单个字段
HGET student:1 name     # "小白"

# 批量设置多个字段
HMSET student:2 id 1002 name "小黑" age 24

# 批量获取多个字段
HMGET student:2 id name

# 获取所有字段和值
HGETALL student:1

# 获取所有字段名
HKEYS student:1

# 获取所有值
HVALS student:1

# 删除字段
HDEL student:1 age

Hash vs String 存储对象对比

方式 优点 缺点
String 存 JSON 简单 修改一个字段需要整体序列化
Hash 分字段 可单独读写字段 稍微复杂

五、有序集合 ZSet

ZSet 在 Set 的基础上为每个元素关联一个 score(分数) ,元素按 score 自动排序

5.1 基本操作
bash 复制代码
# 添加元素(score 在前,member 在后)
ZADD rank 98 "小王"
ZADD rank 95 "小李" 87 "小明" 72 "小红"  # 批量添加

# 查看元素(升序)
ZRANGE rank 0 -1            # 全部,按 score 升序
ZRANGE rank 0 -1 WITHSCORES # 带分数

# 查看元素(降序)
ZREVRANGE rank 0 -1 WITHSCORES

# 按 score 范围查询
ZRANGEBYSCORE rank 80 100

# 获取元素 score
ZSCORE rank "小王"

# 获取元素排名(升序,从 0 开始)
ZRANK rank "小王"

# 获取元素个数
ZCARD rank

# 删除元素
ZREM rank "小明"

应用场景

  • 排行榜:游戏积分榜、销量榜、热搜榜

  • 带权重的任务队列:优先级高的任务先执行

  • 延迟队列:score = 执行时间戳,按时间顺序执行


第三部分:地理信息 GEO

Redis 3.2+ 支持地理位置存储,底层使用 ZSet 实现

bash 复制代码
# 添加城市经纬度(经度,纬度,名称)
GEOADD china:city 116.40 39.90 beijing
GEOADD china:city 121.47 31.23 shanghai
GEOADD china:city 108.94 34.26 xian
GEOADD china:city 106.50 29.53 chongqing

# 获取城市经纬度
GEOPOS china:city xian

# 计算两城市直线距离(单位:km)
GEODIST china:city xian beijing km  # 约 910 km

# 查找指定城市周围 1000km 内的城市
GEORADIUSBYMEMBER china:city xian 1000 km

应用场景:网约车查找附近车辆、附近商家推荐、LBS 社交。


第四部分:Redis 进阶概念速览

一、持久化

方式 原理 优点 缺点
RDB 定期快照全量数据 恢复快,文件小 可能丢失最后一次快照后的数据
AOF 记录每条写操作日志 数据更安全 文件大,恢复慢

二、缓存三大问题

问题 现象 解决方案
缓存穿透 查询不存在的数据,请求穿透到 MySQL 布隆过滤器、空值缓存
缓存击穿 热点 key 过期,大量请求打到 MySQL 互斥锁、永不过期
缓存雪崩 大量 key 同时过期 过期时间加随机值、多级缓存

三、主从复制

第五部分:数据类型对比总结

类型 特点 适用场景
String 键值对,二进制安全 缓存对象、计数器、分布式锁
List 双向链表,有序可重复 消息队列、最新消息、栈
Set 无序、不重复、支持交并差 抽奖、共同关注、标签
Hash Map 结构,字段单独操作 对象存储、购物车
ZSet 有序 Set,按 score 排序 排行榜、优先级队列、延迟队列
GEO 地理位置,底层 ZSet 附近的人、网约车

总结

一、Redis 核心命令速查

类型
String SET DEL SET/APPEND GET
List LPUSH/RPUSH LPOP/RPOP/DEL LSET LRANGE
Set SADD SREM/DEL --- SMEMBERS
Hash HSET HDEL/DEL HSET HGET/HGETALL
ZSet ZADD ZREM/DEL ZADD(更新score) ZRANGE/ZSCORE
GEO GEOADD ZREM --- GEOPOS/GEODIST

二、Redis 与 MySQL 配合使用

三、一句话记忆

Redis 是基于内存的 NoSQL 数据库,默认端口 6379,支持 String、List、Set、Hash、ZSet 五种基本类型和 GEO 地理位置类型,常作为 MySQL 的缓存层使用,读写速度可达 10 万次/秒以上。

相关推荐
渣渣盟4 小时前
数据库设计范式详解(纯小白版)
数据库·oracle·软考·数据库工程师
夜雪闻竹5 小时前
Cursor 对话导入:解析 SQLite 里的宝藏
数据库·sqlite·ai编程
hhb_6186 小时前
PL/SQL核心技术难点梳理与实战应用案例解析
数据库·sql
m0_470857646 小时前
PHP怎么实现工厂模式_Factory模式编写指南【指南】
jvm·数据库·python
用户434309241697 小时前
Day29:图片上传 + 存数据库(Multer + MySQL)
数据库·后端
lolo大魔王7 小时前
MongoDB 索引机制详解:单字段索引、复合索引、唯一索引与性能优化
数据库·mongodb
newnazi7 小时前
RedHat10 安装MS SQL Server2025
linux·服务器·数据库
KaMeidebaby7 小时前
卡梅德生物技术快报|单 B 细胞抗体制备:流程优化、表达系统适配与性能数据
前端·数据库·其他·百度·新浪微博
2301_783848658 小时前
mysql数据库迁移到云平台流程_使用数据传输服务DTS工具
jvm·数据库·python