当前位置: 首页 > news >正文

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

对比项MySQLRedis
数据库类型关系型(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 插入与弹出
# 从左侧插入 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 范围查询
# 查看所有元素 LRANGE mylist 0 -1 # 返回全部 # 查看前两个 LRANGE mylist 0 1 # 查看倒数两个 LRANGE mylist -2 -1
2.3 进阶操作
# 获取列表长度 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 基本操作
# 添加元素(返回 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 集合运算
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 基本操作
# 设置单个字段 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 基本操作
# 添加元素(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 实现

# 添加城市经纬度(经度,纬度,名称) 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无序、不重复、支持交并差抽奖、共同关注、标签
HashMap 结构,字段单独操作对象存储、购物车
ZSet有序 Set,按 score 排序排行榜、优先级队列、延迟队列
GEO地理位置,底层 ZSet附近的人、网约车

总结

一、Redis 核心命令速查

类型
StringSETDELSET/APPENDGET
ListLPUSH/RPUSHLPOP/RPOP/DELLSETLRANGE
SetSADDSREM/DELSMEMBERS
HashHSETHDEL/DELHSETHGET/HGETALL
ZSetZADDZREM/DELZADD(更新score)ZRANGE/ZSCORE
GEOGEOADDZREMGEOPOS/GEODIST

二、Redis 与 MySQL 配合使用

三、一句话记忆

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

http://www.jsqmd.com/news/838709/

相关文章:

  • Obsidian Jupyter插件终极指南:在笔记中直接运行Python代码的完整教程
  • 猫抓cat-catch浏览器扩展全攻略:三步掌握网页资源高效捕获技术
  • 【NotebookLM提示工程实战指南】:20年AI工程师亲授5大高转化提示模板与避坑清单
  • 基于Llama.cpp的本地AI智能体框架:从工具调用到多轮对话实践
  • 为什么APK安装器改变了Windows用户使用安卓应用的方式?
  • Gemini-Skill开源项目解析:轻量级AI技能包的设计与工程实践
  • 音频实战:边播边缓存、预加载与断点续播完整实现
  • 终极指南:FanControl风扇控制软件如何一键解决你的PC散热烦恼?
  • 京东自动化抢购工具:3步实现茅台等高热度商品秒杀
  • KANBoost:基于Kolmogorov-Arnold网络的内存预取优化技术
  • 2026年5月新版国内热式气体质量流量计生产厂家十大品牌 - 流量计品牌
  • 基于Node.js+Vue+SQLite的轻量级库存管理系统设计与实现
  • 杰发科技AC7840——CAN通信波形深度解析(7)_从隐性显性到帧结构
  • 用STM32F103驱动0.96寸OLED屏幕(SSD1306):从硬件接线到显示第一行‘Hello World‘的完整流程
  • 2026年西南奶油板市场大揭秘:哪家厂家成热门之选? - 博客万
  • Synology Photos人脸识别补丁:3步解锁x86设备AI照片管理能力
  • 从零开始掌握无人机仿真:XTDrone完整实战指南
  • HiveWE:魔兽争霸III地图编辑器的终极现代化解决方案
  • 如何在浏览器中快速解锁加密音乐文件:完整指南
  • 基于Helm Chart在K8s生产环境部署Dify.AI的完整指南
  • 厂房环保工程承包怎么选?合规资质、一体化施工是关键 - 品牌2025
  • 2026-05-18:统计凯撒加密对数目。用go语言,给定一个长度都为 m、只含小写字母的字符串数组 words(共 n 个)。如果可以通过对两个字符串 s、t 反复执行同一种“整体循环右移字母”的操
  • LightDB 数值格式化深度解析:从数据库内核到DBeaver显示的完整链路
  • Adobe-GenP完整指南:5步轻松激活Adobe全系列软件
  • 3步掌握BilibiliDown:跨平台B站视频下载神器轻松收藏你喜欢的视频
  • 厂房管道安装难题频发?专业承包与设计施工一体化方案这样选 - 品牌2025
  • 初创公司如何利用Taotoken以可控成本试用多模型
  • Python锚点链接解析利器pyanchor:高效处理HTML/Markdown文档内部链接
  • Qt 项目实战:SARibbon库的工程化集成与界面重构
  • 提升开发效率:基于Vim哲学的光标导航优化方案