【数据库】Redis详解:内存数据库与缓存之王

什么是Redis?

Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,具有极高的性能和丰富的功能。

核心特性

1. 内存存储

  • 数据主要存储在内存中,读写速度极快
  • 支持持久化到磁盘,保证数据安全
  • 支持数据过期自动删除

2. 丰富的数据结构

  • String:字符串
  • Hash:哈希表
  • List:列表
  • Set:集合
  • Sorted Set:有序集合
  • Bitmap:位图
  • HyperLogLog:基数统计
  • Stream:流数据

3. 高性能

  • 单线程模型,避免上下文切换
  • 基于内存操作,读写性能极高
  • 支持管道(pipeline)批量操作

4. 高可用

  • 主从复制
  • Redis Sentinel(哨兵)
  • Redis Cluster(集群)

数据结构与操作

1. 字符串(String)

# 设置值
SET key "value"# 获取值
GET key# 设置带过期时间
SETEX key 60 "value"# 数值操作
INCR counter
DECR counter
INCRBY counter 10

2. 哈希(Hash)

# 设置哈希字段
HSET user:1000 name "John"
HSET user:1000 email "john@example.com"
HMSET user:1000 name "John" email "john@example.com" age 30# 获取哈希字段
HGET user:1000 name
HGETALL user:1000
HMGET user:1000 name email# 哈希操作
HINCRBY user:1000 age 1
HLEN user:1000

3. 列表(List)

# 从左侧插入
LPUSH mylist "a"
LPUSH mylist "b"# 从右侧插入
RPUSH mylist "c"# 获取列表
LRANGE mylist 0 -1# 弹出元素
LPOP mylist
RPOP mylist# 列表长度
LLEN mylist

4. 集合(Set)

# 添加元素
SADD myset "a" "b" "c"# 获取所有元素
SMEMBERS myset# 检查元素是否存在
SISMEMBER myset "a"# 获取集合大小
SCARD myset# 随机弹出元素
SPOP myset

5. 有序集合(Sorted Set)

# 添加元素
ZADD leaderboard 100 "Alice" 200 "Bob" 150 "Charlie"# 获取排名
ZRANGE leaderboard 0 -1
ZREVRANGE leaderboard 0 -1# 获取分数
ZSCORE leaderboard "Alice"# 按分数范围获取
ZRANGEBYSCORE leaderboard 100 200# 获取排名
ZRANK leaderboard "Alice"

高级数据结构

1. 位图(Bitmap)

# 设置位
SETBIT mybitmap 0 1
SETBIT mybitmap 1 0# 获取位
GETBIT mybitmap 0# 统计位数
BITCOUNT mybitmap

2. HyperLogLog

# 添加元素
PFADD visitors "user1" "user2" "user3"# 获取基数
PFCOUNT visitors# 合并
PFMERGE all_visitors visitors1 visitors2

3. 地理空间(Geo)

# 添加地理位置
GEOADD locations 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"# 计算距离
GEODIST locations "Palermo" "Catania"# 获取位置
GEOPOS locations "Palermo"# 半径查询
GEORADIUS locations 15 37 100 km

事务

基本事务

# 开始事务
MULTI# 命令入队
SET key1 "value1"
SET key2 "value2"
INCR counter# 执行事务
EXEC# 取消事务
DISCARD

乐观锁(WATCH)

# 监视键
WATCH mykey# 检查并执行
MULTI
SET mykey "newvalue"
EXEC

发布订阅

发布者

# 发布消息
PUBLISH news "Hello subscribers!"

订阅者

# 订阅频道
SUBSCRIBE news# 订阅多个频道
SUBSCRIBE news sports# 模式订阅
PSUBSCRIBE news.*

持久化

1. RDB(快照)

# 配置文件
save 900 1      # 900秒内至少1个键被修改
save 300 10     # 300秒内至少10个键被修改
save 60 10000   # 60秒内至少10000个键被修改# 手动保存
SAVE      # 同步保存
BGSAVE    # 异步保存

2. AOF(追加文件)

# 配置AOF
appendonly yes
appendfsync everysec    # 每秒同步一次

主从复制

配置主服务器

# 主服务器配置
port 6379

配置从服务器

# 从服务器配置
port 6380
slaveof 127.0.0.1 6379

查看复制状态

# 在主服务器上
INFO replication# 在从服务器上
INFO replication

Redis Sentinel(哨兵)

配置哨兵

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

启动哨兵

redis-sentinel sentinel.conf

Redis Cluster(集群)

集群配置

# 创建集群
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

集群操作

# 查看集群信息
CLUSTER INFO# 查看节点信息
CLUSTER NODES# 添加节点
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

性能优化

1. 内存优化

# 设置最大内存
maxmemory 2gb# 内存淘汰策略
maxmemory-policy allkeys-lru

2. 连接优化

# 最大连接数
maxclients 10000# TCP backlog
tcp-backlog 511

3. 慢查询日志

# 启用慢查询
slowlog-log-slower-than 10000
slowlog-max-len 128

缓存应用

1. 缓存穿透

# 使用布隆过滤器
import redis
r = redis.Redis()def get_user(user_id):# 先检查布隆过滤器if not r.exists(f"user:{user_id}"):return None# 从缓存获取user = r.get(f"user:{user_id}")if user:return json.loads(user)# 从数据库获取user = db.get_user(user_id)if user:r.setex(f"user:{user_id}", 3600, json.dumps(user))else:# 缓存空值,防止穿透r.setex(f"user:{user_id}", 300, "null")return user

2. 缓存雪崩

# 随机过期时间
def set_cache(key, value, base_expire=3600):# 添加随机偏移,避免同时过期expire = base_expire + random.randint(-600, 600)r.setex(key, expire, value)

3. 缓存击穿

# 使用互斥锁
def get_hot_data(key):value = r.get(key)if value:return value# 获取锁lock_key = f"lock:{key}"if r.set(lock_key, 1, nx=True, ex=5):try:# 从数据库获取数据value = db.get_data(key)r.setex(key, 3600, value)return valuefinally:r.delete(lock_key)else:# 等待并重试time.sleep(0.1)return r.get(key)

与Python集成

使用redis-py

import redis
import json# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)# 字符串操作
r.set('name', 'Alice')
name = r.get('name')# 哈希操作
r.hset('user:1000', mapping={'name': 'John','email': 'john@example.com','age': 30
})
user = r.hgetall('user:1000')# 列表操作
r.lpush('tasks', 'task1', 'task2')
tasks = r.lrange('tasks', 0, -1)# 集合操作
r.sadd('tags', 'python', 'redis', 'database')
tags = r.smembers('tags')# 有序集合
r.zadd('scores', {'Alice': 100, 'Bob': 200})
top_scores = r.zrevrange('scores', 0, 10, withscores=True)

使用Redis作为缓存

import redis
from functools import wrapsr = redis.Redis()def cache_decorator(expire_time=3600):def decorator(func):@wraps(func)def wrapper(*args, **kwargs):cache_key = f"{func.__name__}:{str(args)}:{str(kwargs)}"cached = r.get(cache_key)if cached:return json.loads(cached)result = func(*args, **kwargs)r.setex(cache_key, expire_time, json.dumps(result))return resultreturn wrapperreturn decorator@cache_decorator(expire_time=1800)
def get_user_profile(user_id):# 模拟数据库查询return {"id": user_id, "name": "John", "email": "john@example.com"}

常见应用场景

1. 缓存系统

  • 页面缓存
  • 数据缓存
  • 会话缓存

2. 计数器

  • 网站访问量
  • 点赞数
  • 库存管理

3. 消息队列

  • 任务队列
  • 发布订阅
  • 实时消息

4. 排行榜

  • 游戏排行榜
  • 热门文章
  • 用户积分

5. 实时系统

  • 在线用户
  • 实时统计
  • 地理位置

监控与管理

1. 查看统计信息

# 查看服务器信息
INFO server# 查看内存使用
INFO memory# 查看客户端连接
INFO clients# 查看统计信息
INFO stats

2. 慢查询分析

# 查看慢查询
SLOWLOG GET 10# 清空慢查询日志
SLOWLOG RESET

3. 内存分析

# 查看内存使用
MEMORY USAGE key# 查看键的编码
OBJECT ENCODING key

优缺点分析

优点

  • 极高的性能
  • 丰富的数据结构
  • 支持持久化
  • 高可用性
  • 易于扩展

缺点

  • 内存消耗大
  • 单线程模型
  • 不支持复杂查询
  • 数据一致性较弱

学习资源推荐

  • 官方文档:https://redis.io/documentation
  • 在线教程:Redis Tutorial
  • 书籍:《Redis设计与实现》、《Redis实战》
  • 实践项目:缓存系统、实时排行榜、消息队列

总结

Redis作为内存数据库的王者,凭借其极高的性能和丰富的数据结构,在现代应用架构中扮演着重要角色。无论是作为缓存、消息队列还是实时数据处理系统,Redis都能提供出色的性能表现。对于需要高性能、低延迟的应用场景,Redis是不可或缺的技术选择。

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

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

相关文章

【iOS】 单例模式

1. 认识单例模式首先让我们先看下关于单例模式的定义(来自于《设计模式》(Addison-Wesley,1994))一个类有且仅有一个实例,并且自行实例化向整个系统提供。如果说每一个人都是一个类,那么从他出生开始,他就是生活中的唯…

多目标轮廓匹配

前面我们使用模板匹配,得到的结果都是一个图,那么如果我们图片中有许多我们的目标,那么该如何找出来呢?如上我们图片中有许多箭头和我们的模板一致,只不过方向不对,那么该如何匹配呢?图片和模板…

【C++】简单介绍lambda表达式

各位大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽 文章目录一、 什么是lambda表达式二、 表达式语法三、lambd…

磁共振成像原理(理论)4:自由进动和弛豫 (Free Precession and Relaxation)

当磁化自旋系统被射频脉冲扰动而偏离其热平衡态后,一旦移除外部激励并给予足够时间,系统将根据热力学定律返回平衡态。这一过程包含三个特征现象: (a) 自由进动——宏观磁化矢量 (M⃗\vec{M}M) 绕( B0⃗\vec {B_0}B0​​ )场的进动&#xff1…

ubuntu 20.04 安装spark

安装openjdk21 下载 wget https://download.java.net/openjdk/jdk21/ri/openjdk-2135_linux-x64_bin.tar.gz解压 tar -xvf openjdk-2135_linux-x64_bin.tar.gzsudo mv jdk-21/ /opt/jdk-21/设置环境变量 echo export JAVA_HOME/opt/jdk-21 | sudo tee /etc/profile.d/java2…

第三方区块链应用测评:【多签钱包合约安全评估_阈值签名机制与私钥存储安全性测试】

阈值签名机制安全测试密码学审计 采用门限签名方案(TSS)的多签钱包需验证其阈值BLS签名或ECDSA签名算法的正确性。测试重点包括:分布式密钥生成(DKG)过程的保密性(无密钥信息泄露)、签名碎片验证…

大模型处理长文档的挑战和解决方案?

当前,AI 应用正处于极速发展阶段,大语言模型(LLM)与检索增强生成(RAG)系统已成为构建智能问答、知识管理等高阶 AI 应用的核心引擎,被广泛应用于金融分析、学术研究、企业合规等多个领域。然而&…

JavaWeb--day1--HTMLCSS

(以下内容全部来自上述课程及课件) web开发介绍 1. 什么是web? Web:全球广域网,也称为万维网,能够通过浏览器访问的网站。 2. Web网站的工作流程 3. Web标准 Web标准也称为网页标准,由一系列的标准组成&#xf…

OpenEuler安装gitlab,部署gitlab-runner

目录 一、安装gitlab 二、安装部署docker设置源 三、下载部署runner ​编辑 四、构建CI/CD 一、安装gitlab 1.查看OpenEuler版本 [rootlocalhost ~]# cat /etc/os-release NAME"openEuler" VERSION"24.03 (LTS-SP1)" ID"openEuler" VERSI…

实战项目-----在图片 hua.png 中,用红色画出花的外部轮廓,用绿色画出其简化轮廓(ε=周长×0.005),并在同一窗口显示

实战项目实现以下功能:对图片 hua.png 进行轮廓提取,并在同一窗口中完成以下两个绘制操作:用红色画出花的外部轮廓(即最外层轮廓)用绿色画出该轮廓的近似多边形,其中近似精度参数 ε 设置为轮廓周长的 0.00…

开源鸿蒙北向框架开发:系统服务理论详解

系统服务的启动 基本可以认为:OpenHarmony 的系统服务进程都是“由 init 直接或间接拉起”的。 直接方式: init 按 /system/etc/init/.cfg 启动可执行(如 /system/bin/sa_main、/system/bin/samgr 等),这些进程的 PPid…

龙虎榜——20250909

上证指数今天缩量收阴线,跌破10日均线,目前日线总体处于高位宽幅震荡中,小级别暂未明确方向,指数面临方向选择,需要注意高位股的风险。 深证指数今天缩量收阴线,跌破5日均线,接下来几天方向的选…

基于dijkstra算法的WSN网络MAC协议matlab仿真,分析网络延迟与网络开销

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.完整程序 1.程序功能描述 无线传感器网络(WSN, Wireless Sensor Network)是由大量低成本、低功耗的传感器节点组成,通过无线通信实现数据采集、传输与…

ES数据库启动时可以设置1G一下内存吗

可以,但强烈不建议在生产环境中这样做。ES 7.0 版本确实可以设置小于 1GB 的堆内存,但这会带来严重的性能问题和稳定性风险。 快速回答 # 最小化配置示例 - 仅用于测试或开发环境 export ES_JAVA_OPTS"-Xms512m -Xmx512m" ./bin/elasticsearch…

TI-92 Plus计算器:单位换算功能介绍

1 TI-92 Plus计算器:单位换算功能介绍 TI-92 Plus 内置了全面的单位换算功能,支持长度、质量、时间、温度、面积、体积、速度等数十种物理量的单位转换,操作直观,无需手动输入换算系数。以下是具体使用方法、示例及功能特点&#…

雪球科技Java开发工程师笔试题

单选 1.下列哪些语句关于内存回收的说明是正确的?( C ) A.内存回收程序允许程序员直接释放内存 B.程序员必须创建一个线程来释放内存 C.内存回收程序负责释放无用内存 D.内存回收程序可以在指定的时间释放内存对象 2.以下哪项不是Java基础类型(A) A.String B.int C.b…

NV3041A-01芯片屏幕

1. 核心概览这是一款集成了电源管理、显示内存(RAM)、时序控制等多种功能的单片显示驱动芯片(通常称为Driver IC)。它采用COG(Chip-On-Glass) 工艺,直接将芯片绑定在玻璃基板上,使得…

aiagent知识点

一、MCP (Model Context Protocol) 1. 核心概念是什么:MCP是一个开放协议,用于在应用(如IDE、Agent) 和工具/数据源(如服务器、数据库) 之间建立标准化的通信。目标:解决AI工具生态的碎片化问题…

第2节-过滤表中的行-WHERE

摘要:在本教程中,您将学习如何使用 PostgreSQL 的 WHERE 子句来筛选表中的行。 PostgreSQL WHERE 子句 SELECT FROM 语句从表中所有行的一个或多个列中查询数据。实际上,你经常需要选择满足某个条件的行。 要根据条件从表中筛选行&#xf…

IACheck赋能AI环评报告审核,推动环保设备制造行业发展

在“双碳目标”和绿色制造的背景下,环保设备制造行业正在迎来快速发展。然而,环评报告作为项目合规的“通行证”,却一直是企业最头疼的环节之一:编写复杂、审核周期长、错误率高。传统的审核模式不仅耗时耗力,还容易出…