首页 > 数据库 >Redis 入门指南

Redis 入门指南

时间:2025-01-01 13:01:46浏览次数:8  
标签:指南 缓存 入门 redis Redis 场景 user key

简介

Redis 是一个开源的高性能内存键值存储系统,被广泛用于缓存、消息队列、实时分析等场景。想象它是一位高效的"数据管家",不仅可以快速存储和读取数据,还支持丰富的数据结构和多种高级功能。

使用场景实例

  • 缓存

    • 场景说明:通过将频繁访问的数据存储在 Redis 中,可以大幅提高读取速度。
    • 实例:一个电商网站可以将热门商品的详情缓存到 Redis 中,从而减少对数据库的压力。例如,当用户访问某件商品时,先从 Redis 中读取数据,如果不存在再查询数据库并写入缓存。
  • 消息队列

    • 场景说明:Redis 的发布/订阅功能适合构建轻量级的消息队列。
    • 实例:在订单处理系统中,当一个用户下单时,Redis 可以用作消息中介,发布"新订单"消息。订阅此消息的库存系统和物流系统会立即响应,分别更新库存和生成物流订单。

Redis vs 传统数据库

特性Redis传统数据库
数据存储方式基于内存存储,支持持久化基于磁盘存储
数据结构丰富(字符串、列表、集合、哈希等)通常为表格型结构
性能高性能,适合高并发场景性能较低,适合复杂查询场景
持久化支持可选配置,RDB 和 AOF 两种方式默认支持持久化
使用场景缓存、消息队列、实时数据处理事务管理、关系型数据查询

安装

安装前提

  • 操作系统:支持 Windows、macOS 或 Linux
  • 系统配置:推荐 64 位操作系统
  • 硬件要求:至少 2GB 内存

安装步骤

  1. 访问官方网站 Redis 官网
  2. 下载适合当前操作系统的版本
  3. 解压并编译源码
    tar xzf redis-<version>.tar.gz
    cd redis-<version>
    make
    
  4. 启动 Redis 服务
    src/redis-server
    
  5. 验证安装
    src/redis-cli ping
    # 输出:PONG
    

入门篇

基本概念

Redis 提供了多种数据结构和功能,支持多种灵活的应用场景。

关键特点

  • 支持多种数据结构:字符串、哈希、列表、集合、有序集合等
  • 高性能读写:每秒可处理数百万次操作
  • 数据持久化:支持 RDB 和 AOF 两种持久化方式
  • 发布/订阅功能:用于构建消息队列
  • 主从复制和高可用:支持集群和哨兵模式

核心命令

命令作用示例典型使用场景
SET key value设置键值SET name "Redis"缓存用户信息、配置参数、简单的计数器
GET key获取键值GET name读取缓存的用户信息、配置、计数器的当前值
DEL key删除键DEL name清除过期缓存、删除不再需要的临时数据
EXISTS key检查键是否存在EXISTS name在执行操作前验证数据是否存在,避免不必要的错误
EXPIRE key seconds设置键的过期时间EXPIRE name 60实现缓存自动过期、控制临时数据的生命周期
TTL key查看键的剩余生存时间TTL name监控缓存剩余时间,用于缓存管理和续期
KEYS pattern查找符合模式的所有键KEYS user:*批量查找和管理相关联的键,如查找某个用户的所有数据

数据结构

字符串(String)

操作命令示例典型使用场景
设置值SET key valueSET counter 100存储计数器、配置参数、简短的个人信息
获取值GET keyGET counter读取计数、配置、缓存的简单数据
自增INCR keyINCR counter网站访问量统计、用户积分系统、分布式ID生成
自减DECR keyDECR counter库存管理、信用额度控制
追加值APPEND key valueAPPEND counter "50"日志记录、字符串拼接、增量更新

哈希(Hash)

操作命令示例典型使用场景
设置字段HSET key field valueHSET user name "Alice"存储用户详细信息、产品属性、配置对象
获取字段HGET key fieldHGET user name快速获取对象的特定属性,如用户名、年龄
获取所有HGETALL keyHGETALL user获取完整的用户信息、产品详情
删除字段HDEL key fieldHDEL user age删除对象的特定属性,如更新用户信息

列表(List)

操作命令示例典型使用场景
左侧插入LPUSH key valueLPUSH tasks "task1"消息队列、任务调度、最新消息列表
右侧插入RPUSH key valueRPUSH tasks "task2"日志记录、评论列表、先进先出队列
弹出左侧LPOP keyLPOP tasks处理任务队列、消息处理
获取范围LRANGE key start stopLRANGE tasks 0 -1显示最近的消息、任务列表、分页展示

集合(Set)

操作命令示例典型使用场景
添加元素SADD key valueSADD tags "python"标签系统、去重、关注列表
删除元素SREM key valueSREM tags "python"管理标签、移除关注
获取所有SMEMBERS keySMEMBERS tags查看所有标签、关注的内容
求交集SINTER key1 key2SINTER set1 set2共同好友、共同兴趣、推荐系统

有序集合(Sorted Set)

操作命令示例典型使用场景
添加元素ZADD key score valueZADD leaderboard 100 "Alice"排行榜、游戏积分、性能评级
获取范围ZRANGE key start stopZRANGE leaderboard 0 -1显示排名前列的用户、获取topN
删除元素ZREM key valueZREM leaderboard "Alice"移除排行榜中的特定用户

Redis 数据结构选择指南

数据结构优势劣势适用场景
字符串(String)简单直接
存储效率高
支持原子操作
可存储各种类型
不适合复杂数据结构
单个值大小有限制
缓存简单数据
计数器
存储配置信息
分布式锁
哈希(Hash)可存储对象
内存效率高
字段级操作
支持嵌套结构
不适合大量字段
复杂查询受限
用户信息存储
产品详情
配置对象
结构化数据
列表(List)有序
两端操作高效
支持阻塞操作
固定长度列表
随机访问效率低
大列表性能下降
消息队列
任务调度
日志记录
时间线
集合(Set)唯一性
快速去重
集合运算
随机获取
不保存顺序
大集合性能下降
标签系统
去重
共同好友
兴趣推荐
有序集合(Sorted Set)按分数排序
高效范围查询
支持复杂排序
元素唯一
内存消耗较高
维护成本高
排行榜
游戏积分
实时排名
评分系统

选择建议

  1. 简单存储:优先使用 String
  2. 复杂对象:使用 Hash
  3. 队列场景:选择 List
  4. 去重需求:使用 Set
  5. 需要排序:采用 Sorted Set

性能与内存建议

  • 尽量减少大数据结构
  • 合理设置过期时间
  • 根据具体业务选择最适合的数据结构
  • 考虑数据量和访问模式

进阶篇

事务(Transactions)

基本概念

Redis事务允许一次性执行多个命令,并且保证:

  • 命令按顺序执行
  • 不会被其他客户端命令打断
  • 要么全部执行,要么全部不执行

关键命令

命令作用示例典型使用场景
MULTI开启事务MULTI标记事务开始,准备执行一系列命令
EXEC执行事务EXEC提交并执行MULTI后的所有命令
DISCARD取消事务DISCARD放弃事务中的所有命令
WATCH key监控键WATCH balance乐观锁,检测键是否被修改

事务示例

MULTI
SET account:1 1000
SET account:2 500
EXEC

事务特点

  • 原子性:要么全部成功,要么全部失败
  • 串行化:事务期间其他客户端不能修改数据
  • 简单性:不支持回滚,出错则整个事务失败

分布式锁

实现原理

Redis实现分布式锁的关键在于:

  • 使用SETNX命令
  • 设置超时时间
  • 确保锁的安全释放

加锁与释放

操作命令示例说明
加锁SETNX key valueSETNX lock:order:1 1仅当键不存在时设置成功
设置过期时间EXPIRE key secondsEXPIRE lock:order:1 10防止死锁
释放锁DEL keyDEL lock:order:1释放资源

最佳实践

# 尝试获取锁
def acquire_lock(conn, lockname, acquire_timeout=10, lock_timeout=10):
    identifier = str(uuid.uuid4())
    end = time.time() + acquire_timeout
    while time.time() < end:
        if conn.setnx(lockname, identifier):
            conn.expire(lockname, lock_timeout)
            return identifier
        time.sleep(0.1)
    return False

# 释放锁
def release_lock(conn, lockname, identifier):
    pipe = conn.pipeline(True)
    try:
        pipe.watch(lockname)
        if pipe.get(lockname) == identifier:
            pipe.multi()
            pipe.delete(lockname)
            pipe.execute()
            return True
    except redis.exceptions.WatchError:
        pass
    return False

注意事项

  • 避免长时间持有锁
  • 使用lua脚本保证原子性
  • 考虑锁的粒度和超时时间

发布/订阅(Pub/Sub)

工作模式

  • 发布者:向特定频道发送消息
  • 订阅者:监听并接收消息
  • 解耦:发布者和订阅者互不感知

核心命令

命令作用示例说明
SUBSCRIBE订阅频道SUBSCRIBE chat监听单个频道
PUBLISH发布消息PUBLISH chat "Hello"向频道发送消息
PSUBSCRIBE模式订阅PSUBSCRIBE chat:*订阅匹配模式的频道

典型场景

  • 实时聊天系统
  • 日志收集
  • 消息通知
  • 分布式事件通知

代码示例

# 订阅者
def message_listener():
    r = redis.Redis()
    p = r.pubsub()
    p.subscribe('notifications')
    
    for message in p.listen():
        if message['type'] == 'message':
            print(f"收到消息:{message['data']}")

# 发布者
def send_notification(message):
    r = redis.Redis()
    r.publish('notifications', message)

持久化(Persistence)

RDB模式

特点
  • 定期快照
  • 恢复速度快
  • 数据丢失风险较高
配置参数
# redis.conf
save 900 1      # 900秒内至少1个key变化
save 300 10     # 300秒内至少10个key变化
save 60 10000   # 60秒内至少10000个key变化

AOF模式

特点
  • 实时日志记录
  • 数据丢失风险低
  • 文件较大,恢复较慢
配置参数
# redis.conf
appendonly yes
appendfsync everysec  # 每秒同步一次

混合持久化

  • 结合RDB和AOF优点
  • 减少重写时间
  • 提高数据安全性

性能优化建议

  1. 选择合适的持久化策略
  2. 合理配置快照和日志
  3. 定期备份
  4. 监控内存使用
  5. 使用pipeline批量操作
  6. 避免使用高复杂度命令

高级篇

缓存问题与解决方案

缓存穿透(Cache Penetration)

问题描述
  • 大量请求查询不存在的Key
  • 每次请求都穿透缓存,直接访问数据库
  • 可能导致数据库负载过高,甚至宕机
解决方案
  1. 布隆过滤器

    • 快速判断数据是否存在
    • 极低的误判率
    • 内存占用小
    from pybloom_live import BloomFilter
    
    # 创建布隆过滤器
    bloom = BloomFilter(capacity=100000, error_rate=0.1)
    
    # 添加数据
    bloom.add("user:1000")
    
    # 检查数据是否存在
    print("user:1000" in bloom)  # True
    print("user:9999" in bloom)  # False
    
  2. 空值缓存

    • 对不存在的Key缓存null值
    • 设置较短的过期时间
    def get_user(user_id):
    	# 先检查缓存
    	user = redis.get(f"user:{user_id}")
    
    	if user is None:
    		# 查询数据库
    		user = db.query_user(user_id)
    
    		if user:
    			# 缓存用户数据
    			redis.setex(f"user:{user_id}", 300, user)
    		else:
    			# 缓存空值,过期时间短
    			redis.setex(f"user:{user_id}", 60, "null")
    
    	return user if user != "null" else None
    

缓存雪崩(Cache Breakdown)

问题描述
  • 大量缓存同时失效
  • 瞬时大量请求直接访问数据库
  • 可能导致系统压力剧增
解决方案
  1. 随机过期时间

    • 在基础过期时间上增加随机数
    • 避免同时大量缓存失效
    import random
    
    def set_cache_with_random_expire(key, value, base_expire):
    	random_expire = base_expire + random.randint(0, 300)
    	redis.setex(key, random_expire, value)
    
  2. 缓存预热

    • 启动时提前加载热点数据
    • 定期刷新缓存
    def cache_warm_up():
    	hot_keys = [
    		"top:products",
    		"hot:users",
    		"system:config"
    	]
    
    	for key in hot_keys:
    		data = db.query_data(key)
    		redis.setex(key, 3600, data)
    

缓存击穿(Cache Hot Spot Invalid)

问题描述
  • 高并发访问某个热点Key
  • 缓存过期瞬间
  • 大量请求穿透到数据库
解决方案
  1. 分布式锁

    • 控制并发访问
    • 只允许一个请求重建缓存
    def get_with_mutex(key):
    	# 尝试获取缓存
    	value = redis.get(key)
    	if value:
    		return value
    
    	# 使用分布式锁
    	lock_key = f"lock:{key}"
    	if redis.setnx(lock_key, 1):
    		redis.expire(lock_key, 10)
    
    		try:
    			# 重建缓存
    			value = db.query(key)
    			redis.setex(key, 3600, value)
    		finally:
    			redis.delete(lock_key)
    	else:
    		# 其他线程等待
    		time.sleep(0.1)
    		return get_with_mutex(key)
    
  2. 逻辑过期

    • 在Value中维护逻辑过期时间
    • 异步更新缓存

高可用架构设计

架构演进路径

  1. 单机模式:基础入门阶段
  2. 主从复制:提升读性能和可靠性
  3. 哨兵模式:实现自动故障转移
  4. 集群模式:水平扩展与高可用

架构选型决策矩阵

架构模式优势适用场景复杂度
主从复制读性能提升
数据备份
故障恢复
读多写少
中小规模应用
哨兵模式自动故障切换
高可用
无需更改代码
稳定性要求高
中型系统
Cluster集群海量数据存储
水平扩展
高并发
大规模分布式
互联网应用

主从复制详解

复制原理

  1. 全量同步:主节点生成RDB快照
  2. 增量同步:复制偏移量和复制积压缓冲区
  3. 心跳检测:维护主从连接状态

配置实践

# 从节点配置
slaveof 192.168.1.100 6379
masterauth your_password

读写分离架构

实现策略

  1. 代理模式

    • 使用中间件(Twemproxy、Codis)
    • 透明路由请求
  2. 客户端分流

    • 根据读写比例动态路由
    • 业务层实现逻辑

代码示例

class RedisRouter:
    def __init__(self, master, slaves):
        self.master = master
        self.slaves = slaves
    
    def get_connection(self, is_write=False):
        if is_write:
            return self.master
        return random.choice(self.slaves)

分片技术

分片算法

  1. 哈希分片

    • 计算Key的CRC32哈希值
    • 映射到不同实例
    • 均匀分布数据
  2. 范围分片

    • 按Key的范围划分
    • 适合有序数据

分片实现

def get_shard(key, shard_count):
    # 简单哈希分片算法
    return hash(key) % shard_count

高可用方案

故障切换机制

  1. 主动探测

    • 定期心跳检测
    • 评估节点状态
  2. 选主算法

    • 基于节点优先级
    • 数据完整性
    • 网络延迟

哨兵配置

# sentinel.conf
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

性能优化

优化清单

  1. 内存管理

    • 设置最大内存
    • 配置淘汰策略
  2. 网络优化

    • TCP参数调优
    • 连接池管理
  3. 持久化调优

    • 合理配置RDB/AOF
    • 控制执行频率

性能监控指标

  • 命中率
  • 响应时间
  • 网络吞吐量
  • CPU/内存占用

实践建议

  1. 循序渐进:从简单架构开始
  2. 充分测试:模拟各种故障场景
  3. 持续学习:关注最新技术
  4. 实践出真知:动手搭建实验环境

企业实战场景

典型应用

  1. 电商秒杀系统
  2. 社交网络缓存
  3. 实时消息推送
  4. 分布式会话管理

未来展望

  • 云原生架构
  • 多模态存储
  • 智能缓存
  • 可观测性平台

结语

Redis不仅仅是一个缓存工具,更是构建高性能分布式系统的利器。通过不断学习和实践,你将逐步掌握其中的架构精髓!

标签:指南,缓存,入门,redis,Redis,场景,user,key
From: https://blog.csdn.net/Luckone999/article/details/144865895

相关文章

  • FreeRTOS从入门到精通 第五章(中断管理)
    参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili一、中断的回顾与深入1、概述(1)让CPU打断正常运行的程序,转而去处理紧急的事件(程序),这个过程就叫中断,受理的事件称为中断服务程序。(2)中断执行机制,可简单概括为三步:①外设产生中断请求(GPIO外部中断、定时......
  • Java Agent(二)、Javassist入门
    目录1、前言2、什么是Javassist?2.1、Javassist的特点2.2、应用场景3、快速开始3.1、maven依赖3.2、生成一个class文件3.2.1、具体代码3.2.2、执行结果3.3、修改已有类的方法3.3.1、具体代码3.3.2、执行结果3.3.3、问题踩坑3.4、修改属性值3.4.1、具体代码3......
  • 《100天学习Python:从入门到精通》——第4天:Python变量的定义及使用
    大家好啊,今天我就来和大家分享一下关于变量的定义及使用吧。1.Python变量的定义及初始化Python变量名要求:1.变量名只能由字母、下划线、数字组成,不能是别的符号。2.变量名开头只能是字母和下划线,不能是数字。3.尽量不要与Python标准库里的函数或第三方模块中的函数重名。......
  • Spring Boot 使用 Redis 实现布隆过滤器,精准过滤 “无效” 请求
    SpringBoot使用Redis实现布隆过滤器,精准过滤“无效”请求在当今高并发的互联网应用场景下,如何高效地对海量数据进行过滤,避免无效请求对系统资源造成浪费,是每一个开发者都需要面对的问题。布隆过滤器(BloomFilter)作为一种空间效率极高的概率型数据结构,为我们提供了出......
  • 记 Redisson 报错 attempt to unlock lock, not locked by current thread
    原文:记一次Redisson线上问题→你怎么能释放别人的锁错误信息:attempttounlocklock,notlockedbycurrentthreadbynodeid:b9df1975-5595-42eb-beae-bdc5d67bce49thread-id:52查看日志,找到对应的堆栈信息:Exceptioninthread"thread0"java.lang.IllegalMoni......
  • 【优选算法 & 分治】深入理解分治算法:分治算法入门小专题详解
             快速排序算法   (1)快速排序法       (2) 快排前后指针     (3)快排挖坑法   颜色分类  题目解析    算法原理   算法原理和移动零非常相似  简述移动零的算法原理   ......
  • spring cloud-nacos注册中心入门指南
    注册中心为什么引入注册中心?引入注册中心的主要原因是为了解决微服务架构中服务发现和动态管理的问题。在微服务架构中,服务提供者和消费者之间需要进行远程调用。由于微服务数量众多且动态变化,手动维护服务地址列表不仅效率低下,而且容易出错。注册中心的引入解决了这些问......
  • 分布式事务-Seata入门指南
    Seata入门指南为什么要使用分布式事务问题点-当账户余额0时,还是可以下单成功,而且扣减库存新的需求-下单逻辑需要保证数据一致性,当帐户余额不够时,库存回滚,下单失败解决方案采用spring事务能解决问题上面的问题嘛,是不能使用分布式事务解决方案Seata(官方推荐)Seata是......
  • 01NLP开始入门
    WEB项目看来是完不成了,先把论文做了吧,我干嘛选NLP。。。一、经典的NLP和现在的NLP经典的NLP经典的NLP需要学习词袋模型,TFIDF,wordtovector,LSTM,LDA,很多都是传统算法和传统模型。这些东西完全不用学习了,完全用不上。现在的NLP是一个纯的Transformer的模型拼的是预选模......
  • Linux入门基础(Centos7)
    Linux入门基础Linux内核Linux的目录结构Linux的层级关系表示Linux命令基础格式ls命令cd命令pwd命令相对路径和绝对路径特殊路径符mkdir命令touch命令cat命令more命令cp命令mv命令rm命令which命令find命令grep命令wc命令管道符echo命令反引号重定向符tail命令vim编辑器命......