Redis数据库入门教程

Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储系统,它可以用作数据库、缓存和消息中间件。本教程将带你从零开始全面学习Redis,涵盖基础概念、安装配置、数据结构、持久化机制以及与Python的交互等内容。

一、NoSQL与Redis简介

1.1 NoSQL概述

NoSQL(Not Only SQL)是一类非关系型数据库的总称,与传统的关系型数据库(如MySQL)相比,具有以下特点:

  • 数据结构灵活:不遵循固定的表结构,支持键值对、文档、列存储、图等多种数据模型

  • 高扩展性:通常设计为分布式架构,易于水平扩展

  • 高性能:针对特定场景优化,读写速度远超传统数据库

  • 高可用性:支持自动分区和复制

常见NoSQL数据库类型

  • 键值存储:Redis、Memcached

  • 文档数据库:MongoDB、CouchDB

  • 列存储数据库:HBase、Cassandra

  • 图数据库:Neo4j

1.2 Redis简介

Redis是一个开源的高性能键值数据库,由Salvatore Sanfilippo开发,具有以下特点:

  • 内存存储:数据主要存储在内存中,读写性能极高(读11万次/秒,写8.1万次/秒)

  • 持久化支持:可以将内存数据保存到磁盘,重启后重新加载

  • 丰富的数据类型:支持字符串、哈希、列表、集合、有序集合等

  • 原子操作:所有操作都是原子性的,支持事务

  • 发布订阅:支持消息的发布/订阅模式

  • 主从复制:支持数据的主从同步

Redis典型应用场景

  • 缓存系统(减轻数据库压力)

  • 计数器(如网站访问量)

  • 消息队列系统

  • 实时排行榜

  • 社交网络(如粉丝关系)

  • 会话缓存(替代Session存储)

二、Redis安装与配置

2.1 Linux系统安装Redis

方法一:使用包管理器安装(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install redis-server
方法二:源码编译安装
# 下载Redis源码
wget http://download.redis.io/releases/redis-6.2.4.tar.gz# 解压
tar -zxvf redis-6.2.4.tar.gz# 编译安装
cd redis-6.2.4
make
sudo make install

2.2 Redis基本配置

Redis的配置文件通常位于/etc/redis/redis.conf,主要配置项包括:

# 绑定IP地址(如需远程访问可注释掉或设为0.0.0.0)
bind 127.0.0.1# 监听端口
port 6379# 是否以守护进程运行
daemonize yes# 数据文件名称
dbfilename dump.rdb# 数据文件存储路径
dir /var/lib/redis# 日志文件路径
logfile /var/log/redis/redis-server.log# 数据库数量
databases 16# 设置密码
requirepass yourpassword

2.3 Redis服务管理

# 启动Redis服务
sudo service redis start# 停止Redis服务
sudo service redis stop# 重启Redis服务
sudo service redis restart# 查看Redis状态
sudo service redis status# 使用配置文件启动
redis-server /path/to/redis.conf

2.4 Redis客户端连接

# 连接本地Redis
redis-cli# 连接远程Redis(带密码)
redis-cli -h host -p port -a password# 测试连接
127.0.0.1:6379> ping
PONG# 切换数据库(0-15)
127.0.0.1:6379> select 1
OK

三、Redis数据结构与操作

Redis支持五种主要数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。

3.1 字符串(String)

字符串是Redis最基本的数据类型,可以存储文本、数字或二进制数据(最大512MB)。

常用命令

# 设置键值
SET key value# 获取键值
GET key# 设置键值及过期时间(秒)
SETEX key seconds value# 设置多个键值
MSET key1 value1 key2 value2# 获取多个键值
MGET key1 key2# 值追加
APPEND key value# 值递增
INCR key
INCRBY key increment# 值递减
DECR key
DECRBY key decrement# 获取字符串长度
STRLEN key

示例

127.0.0.1:6379> SET name "Redis"
OK
127.0.0.1:6379> GET name
"Redis"
127.0.0.1:6379> SETEX session_id 3600 "abc123"
OK
127.0.0.1:6379> MSET age 30 city "New York"
OK
127.0.0.1:6379> MGET name age city
1) "Redis"
2) "30"
3) "New York"
127.0.0.1:6379> INCR age
(integer) 31

3.2 哈希(Hash)

哈希适合存储对象,可以将多个字段-值对存储在一个键中。

常用命令

# 设置单个字段
HSET key field value# 设置多个字段
HMSET key field1 value1 field2 value2# 获取单个字段值
HGET key field# 获取多个字段值
HMGET key field1 field2# 获取所有字段和值
HGETALL key# 获取所有字段名
HKEYS key# 获取所有字段值
HVALS key# 删除字段
HDEL key field1 field2# 判断字段是否存在
HEXISTS key field# 获取字段数量
HLEN key

示例

127.0.0.1:6379> HSET user:1000 name "John" age 30
(integer) 2
127.0.0.1:6379> HGET user:1000 name
"John"
127.0.0.1:6379> HGETALL user:1000
1) "name"
2) "John"
3) "age"
4) "30"
127.0.0.1:6379> HINCRBY user:1000 age 1
(integer) 31

3.3 列表(List)

列表是简单的字符串列表,按照插入顺序排序,可以在头部或尾部添加元素。

常用命令

# 从左侧插入元素
LPUSH key value1 value2# 从右侧插入元素
RPUSH key value1 value2# 从左侧弹出元素
LPOP key# 从右侧弹出元素
RPOP key# 获取列表片段
LRANGE key start stop# 获取列表长度
LLEN key# 根据索引获取元素
LINDEX key index# 在指定元素前后插入新元素
LINSERT key BEFORE|AFTER pivot value# 根据值移除元素
LREM key count value# 设置指定索引处的元素值
LSET key index value# 保留指定范围内的元素
LTRIM key start stop

示例

127.0.0.1:6379> LPUSH fruits "apple" "banana" "orange"
(integer) 3
127.0.0.1:6379> LRANGE fruits 0 -1
1) "orange"
2) "banana"
3) "apple"
127.0.0.1:6379> RPUSH fruits "pear"
(integer) 4
127.0.0.1:6379> LRANGE fruits 0 -1
1) "orange"
2) "banana"
3) "apple"
4) "pear"
127.0.0.1:6379> LPOP fruits
"orange"

3.4 集合(Set)

集合是无序的字符串集合,元素唯一不重复,支持交集、并集、差集等操作。

常用命令

# 添加元素
SADD key member1 member2# 获取所有元素
SMEMBERS key# 判断元素是否存在
SISMEMBER key member# 获取集合元素数量
SCARD key# 移除元素
SREM key member1 member2# 随机弹出元素
SPOP key [count]# 随机获取元素
SRANDMEMBER key [count]# 集合运算
SINTER key1 key2      # 交集
SUNION key1 key2      # 并集
SDIFF key1 key2       # 差集

示例

127.0.0.1:6379> SADD tags "redis" "database" "nosql"
(integer) 3
127.0.0.1:6379> SMEMBERS tags
1) "nosql"
2) "database"
3) "redis"
127.0.0.1:6379> SADD tags2 "redis" "programming"
(integer) 2
127.0.0.1:6379> SINTER tags tags2
1) "redis"

3.5 有序集合(Sorted Set)

有序集合类似于集合,但每个元素都关联一个分数(score),用于排序。

常用命令

# 添加元素
ZADD key score1 member1 score2 member2# 获取元素分数
ZSCORE key member# 获取元素排名(升序)
ZRANK key member# 获取元素排名(降序)
ZREVRANK key member# 获取指定范围的元素
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]# 获取分数范围内的元素
ZRANGEBYSCORE key min max [WITHSCORES]# 获取集合元素数量
ZCARD key# 获取分数范围内的元素数量
ZCOUNT key min max# 移除元素
ZREM key member1 member2# 增加元素分数
ZINCRBY key increment member

示例

127.0.0.1:6379> ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie"
(integer) 3
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) "Alice"
2) "100"
3) "Charlie"
4) "150"
5) "Bob"
6) "200"
127.0.0.1:6379> ZINCRBY leaderboard 50 "Alice"
"150"

四、Redis高级特性

4.1 键(Key)操作

# 查找键(支持通配符)
KEYS pattern# 判断键是否存在
EXISTS key# 查看键类型
TYPE key# 删除键
DEL key1 key2# 设置过期时间(秒)
EXPIRE key seconds# 设置过期时间(毫秒)
PEXPIRE key milliseconds# 设置过期时间(UNIX时间戳)
EXPIREAT key timestamp# 移除过期时间
PERSIST key# 查看剩余生存时间(秒)
TTL key# 查看剩余生存时间(毫秒)
PTTL key# 随机返回一个键
RANDOMKEY# 重命名键
RENAME key newkey# 仅当新键不存在时重命名
RENAMENX key newkey

示例

127.0.0.1:6379> SET test "value" EX 60
OK
127.0.0.1:6379> TTL test
(integer) 58
127.0.0.1:6379> KEYS t*
1) "test"
127.0.0.1:6379> DEL test
(integer) 1

4.2 事务

Redis事务可以一次执行多个命令,具有以下特点:

  • 批量操作按顺序执行

  • 执行过程中不会被其他命令打断

  • 不具备原子性(部分失败不会回滚)

基本命令

# 开始事务
MULTI# 执行事务
EXEC# 取消事务
DISCARD# 监视键(乐观锁)
WATCH key# 取消所有键的监视
UNWATCH

示例

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET name "Alice"
QUEUED
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 31

4.3 发布订阅

Redis发布订阅(pub/sub)实现了消息系统,发送者(publisher)发送消息到频道(channel),订阅者(subscriber)接收消息。

基本命令

# 订阅一个或多个频道
SUBSCRIBE channel1 channel2# 取消订阅
UNSUBSCRIBE [channel1 channel2]# 发布消息到频道
PUBLISH channel message# 按模式订阅
PSUBSCRIBE pattern*# 取消模式订阅
PUNSUBSCRIBE [pattern*]

示例

# 终端1:订阅频道
127.0.0.1:6379> SUBSCRIBE news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1# 终端2:发布消息
127.0.0.1:6379> PUBLISH news "Hello Redis!"
(integer) 1# 终端1将收到:
1) "message"
2) "news"
3) "Hello Redis!"

4.4 数据持久化

Redis提供两种持久化方式:RDB和AOF。

RDB(Redis Database)
  • 定时生成内存快照

  • 性能高,文件紧凑

  • 可能丢失最后一次快照后的数据

配置

save 900 1       # 900秒内有1个更改则保存
save 300 10      # 300秒内有10个更改则保存
save 60 10000    # 60秒内有10000个更改则保存dbfilename dump.rdb
dir /var/lib/redis
AOF(Append Only File)
  • 记录所有写操作命令

  • 数据安全性更高

  • 文件体积较大

配置

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec  # 每秒同步
# appendfsync always  # 每次写操作同步
# appendfsync no      # 由操作系统决定同步时机

比较

特性RDBAOF
持久化方式定时快照记录写操作命令
数据安全可能丢失数据最多丢失1秒数据
恢复速度
文件体积
性能影响保存时影响性能持续写入影响较小

4.5 主从复制

Redis支持主从复制,主节点(master)负责写操作,从节点(slave)负责读操作。

配置主从复制

  1. 主节点配置

    bind 192.168.1.100
    port 6379

  2. 从节点配置

    bind 192.168.1.101
    port 6379
    slaveof 192.168.1.100 6379

验证主从状态

redis-cli info replication

输出示例

# 主节点
role:master
connected_slaves:1
slave0:ip=192.168.1.101,port=6379,state=online,offset=1099,lag=1# 从节点
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up

五、Redis与Python交互

5.1 安装Redis Python客户端

pip install redis

5.2 基本操作示例

import redis# 创建连接
r = redis.Redis(host='localhost', port=6379, db=0, password='yourpassword')# 字符串操作
r.set('name', 'Alice')
print(r.get('name'))  # 输出: b'Alice'# 哈希操作
r.hset('user:1000', 'name', 'Bob')
r.hset('user:1000', 'age', 25)
print(r.hgetall('user:1000'))  # 输出: {b'name': b'Bob', b'age': b'25'}# 列表操作
r.lpush('tasks', 'task1', 'task2')
print(r.lrange('tasks', 0, -1))  # 输出: [b'task2', b'task1']# 集合操作
r.sadd('tags', 'python', 'redis', 'database')
print(r.smembers('tags'))  # 输出: {b'python', b'redis', b'database'}# 有序集合操作
r.zadd('leaderboard', {'Alice': 100, 'Bob': 200, 'Charlie': 150})
print(r.zrange('leaderboard', 0, -1, withscores=True))  
# 输出: [(b'Alice', 100.0), (b'Charlie', 150.0), (b'Bob', 200.0)]

5.3 使用连接池

import redis# 创建连接池
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, password='yourpassword',max_connections=10
)# 从连接池获取连接
r = redis.Redis(connection_pool=pool)# 使用连接...
r.set('foo', 'bar')
print(r.get('foo'))

5.4 发布订阅示例

发布者

import redisr = redis.Redis()
r.publish('channel', 'Hello Redis!')

订阅者

import redisr = redis.Redis()
pubsub = r.pubsub()
pubsub.subscribe('channel')for message in pubsub.listen():if message['type'] == 'message':print(f"Received: {message['data']}")

六、Redis最佳实践

6.1 性能优化

  1. 合理使用数据结构:根据场景选择最合适的数据结构

  2. 批量操作:使用MSET、HMGET等批量命令减少网络开销

  3. 管道(Pipeline):将多个命令一次性发送

    pipe = r.pipeline()
    pipe.set('foo', 'bar')
    pipe.get('foo')
    result = pipe.execute()

  4. 避免大键:单个键值不宜过大(建议小于1MB)

  5. 设置合理过期时间:避免内存无限增长

6.2 安全配置

  1. 设置密码requirepass yourpassword

  2. 禁用危险命令

    rename-command FLUSHALL ""
    rename-command CONFIG ""

  3. 绑定IP:仅允许可信IP访问

  4. 使用非默认端口:避免使用6379默认端口

  5. 限制内存maxmemory 2gb + maxmemory-policy allkeys-lru

6.3 监控与维护

  1. 监控命令

    redis-cli info         # 查看服务器信息
    redis-cli info memory  # 查看内存使用情况
    redis-cli info stats   # 查看统计信息

  2. 备份策略

    • 定期备份RDB文件

    • 考虑AOF与RDB结合使用

  3. 内存优化

    • 使用OBJECT ENCODING key查看编码方式

    • 对小整数使用共享对象

    • 对短字符串使用embstr编码

七、Redis常见问题解答

7.1 Redis为什么这么快?

  1. 内存存储:数据主要存储在内存中

  2. 单线程模型:避免多线程上下文切换和竞争条件

  3. IO多路复用:使用epoll/kqueue等高效IO模型

  4. 高效数据结构:专门设计的数据结构和编码方式

7.2 Redis适合哪些场景?

  • 缓存系统

  • 会话存储

  • 排行榜/计数器

  • 消息队列

  • 实时系统

  • 社交网络关系

7.3 Redis不适合哪些场景?

  • 数据量超过内存大小

  • 需要复杂SQL查询

  • 需要完整ACID事务

  • 需要持久化存储大数据集

7.4 如何选择Redis持久化方式?

  • RDB:适合备份、灾难恢复、快速重启

  • AOF:适合数据安全性要求高的场景

  • RDB+AOF:生产环境推荐组合

八、学习资源推荐

  1. 官方文档:Docs

  2. Redis中文网:http://www.redis.cn/

  3. 《Redis设计与实现》:深入理解Redis内部机制

  4. 《Redis实战》:实用案例和最佳实践

  5. Redis University:免费在线课程

通过本教程,你应该对Redis有了全面的了解。Redis功能强大但学习曲线平缓,建议结合实际项目多加练习,逐步掌握其高级特性和优化技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92664.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业仪表识别(一)环境安装

仪表识别环境安装 1.cuda cuda 11.8 intall(cuda11.8、cuda12.6按照需求安装) ref: https://developer.nvidia.com/cuda-11-8-0-download-archive?target_osLinux&target_archx86_64&DistributionUbuntu&target_vers…

闲庭信步使用图像验证平台加速FPGA的开发:第三十四课——车牌识别的FPGA实现(6)叠加车牌识别的信息

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程…

Windows上用于跨平台开发的环境工具

1. MSYS2(Minimal SYStem 2) 一款模拟Unix环境的软件,可以执行unix命令。通过pacman管理工具,类似Ubuntu上apt-get,RedHat中的yum。 MSYS2最大好处就是能够在Windows上轻松编译一些由Unix环境工具链开发的工程&#…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-15,(知识点:DC-DC电源,BUCK电路,铁损,铜损)

目录 1、题目 2、解答 选项 A 选项 B 选项 C 选项 D 3、相关知识点 一、纹波 二、感量(电感量L) 三、开关频率f 四、铁损 五、铜损 题目汇总版: 【硬件-笔试面试题】硬件/电子工程师,笔试面试题汇总版,持…

Ethereum: 从 1e+21 到千枚以太币:解密 Geth 控制台的余额查询

大家好今天,我们来聊一个新手在接触以太坊节点时经常会遇到的场景。想象一下,我们成功运行了一个私有以太坊节点,并尝试查询一个账户的余额,然后我们看到了这样一个返回结果:1e21。 这是什么意思?是出错了&…

2025最新软件测试面试八股文(含答案+文档)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、什么是POM,为什么要使用它?POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是&#xff…

表格数据处理-TabNet模型使用说明(模型构建+SHAP)

一、模型介绍 论文为《TabNet: Attentive Interpretable Tabular Learning》发表于2021年,属于Google Cloud AI。该研究针对表格数据提出了一种新的深度神经网络(DNN)架构TabNet,旨在解决传统深度学习在表格数据上表现不如决策树模…

数据集成难在哪?制造企业该怎么做?

目录 一、为什么你的数据集成总失败? 1.数据没有统一标准 2.数据 “断点多”,打通成本高 3.数据 “用不起来”,价值难落地 二、数据集成的正确做法是什么? 第一步:明确 “集成为了谁”— 用业务目标倒推数据需求…

Datawhale AI数据分析 作业2

学生考试表现影响因素数据集第一步:数据概览与清洗Prompt 1:加载StudentPerformanceFactors.csv文件,并显示前5行数据以及各列的数据类型和非空值数量,检查是否存在缺失值。处理缺失值是数据预处理的重要一步。对于您提到的缺失值&#xff1a…

Flowable 与 Spring Boot 深度集成:从环境搭建到平台构建

在前三篇文章中,我们依次认识了 Flowable 的基础概念、用 Modeler 设计流程,以及通过 API 控制流程运行。但在实际项目中,我们更需要将 Flowable 与 Spring Boot 深度融合,构建完整的工作流平台。本文将从环境配置、设计器集成、权…

Jenkins最新版本的安装以及集成Allure生成测试报告

目录 Jenkins的安装 将上面的目录添加到系统环境变量中 为Jenkins配置密码 创建一个用户,用于登录jenkins 为Jenkins安装Allure插件 几个大坑 使用jenkins集成python测试项目 Jenkins的安装 Jenkins官方网址 Jenkins 点击download 点击 past Release选择你想要下载…

Vue3 面试题及详细答案120道 (1-15 )

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

基于 GitLab 实践敏捷开发

在软件开发中,**基于 GitLab 实践敏捷开发**,并建立一套**规范的日常管理流程**,不仅可以提升团队协作效率,还能确保平台持续向好迭代、性能稳步提升。以下是一个完整的实践方案,适用于中小型团队或中大型项目&#xf…

黑马点评使用Apifox导入接口测试合集(持续更新、详细图解)

目录 一、前言 二、更新店铺 三、添加秒杀券 四、秒杀下单和秒杀下单user2 一、前言 本博客将持续更新记录黑马点评所有接口测试的导入(学到哪更新到哪),以此博客为完整导入接口测试的合集。第一次在黑马点评项目使用Apifox进行接口测试直接先看我前面的博客&a…

MYOJ_10583:CSP初赛题单7:计算机常识综合练习

更多初赛题单请参见题目整理CSP初赛题目整理题单,谢谢。 注:阅读此题单时建议先看1~5,再试着自己做。 题目描述 1. [J-2010-6][S-2010-6]提出“存储程序”的计算机工作原理的是( )。 A. 克劳德香农 B. 戈登摩尔 C.…

代码随想录day22回溯算法1

文章目录77. 组合216.组合总和III17. 电话号码的字母组合77. 组合 题目链接 文章讲解 class Solution { public:vector<vector<int>> res; // 存储所有的组合vector<int> path; // 当前正在构建的组合// 回溯算法void solve(int n, int k, int st…

【Android】Popup menu:弹出式菜单

Popup menu&#xff1a;弹出式菜单 PopupMenu&#xff0c;弹出菜单&#xff0c;一个模态形式展示的弹出风格的菜单&#xff0c;绑在在某个View上&#xff0c;一般出现在被绑定的View的下方&#xff08;如果下方有空间&#xff09;。 注意&#xff1a;弹出菜单是在API 11和更高版…

20250724-day21

Main Memory Database System&#xff08;MMDB&#xff09;&#xff1a;基于内存的数据库系统 File Database&#xff08;FDB&#xff09;&#xff1a;基于文件的数据库 Netware Database&#xff08;NDB&#xff09;&#xff1a;基于网络的数据库 daemon&#xff1a;守护进程 …

API是什么,如何保障API安全?

API&#xff08;应用程序编程接口&#xff09;是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;是不同软件系统之间通信的“桥梁”。它定义了应用程序如何请求服务、交换数据或调用功能&#xff0c;无需了解底层实现细节。例如&#xff0c;当…

深度分析Java多线程机制

Java 多线程是掌握高性能、高响应性应用程序开发的关键&#xff0c;它涉及到语言特性、JVM 实现、操作系统交互以及并发编程的核心概念。 核心目标&#xff1a; 充分利用现代多核 CPU 的计算能力&#xff0c;提高程序吞吐量&#xff08;单位时间内处理的任务量&#xff09;和响…