Redis日常学习(一)

news2025/4/24 13:12:54

我的Redis学习笔记:从命令行到性能调优

Redis

Redis(Remote Dictionary Server)本质上是一个基于内存的键值存储系统.

安装配置Redis的过程非常简单:

# Ubuntu/Debian安装Redis
sudo apt-get update
sudo apt-get install redis-server

# 启动Redis服务
sudo systemctl start redis

# 检查Redis状态
redis-cli ping
# 输出应为: PONG

Redis的核心数据结构与命令

初学Redis最重要的是理解其核心数据结构。与其他数据库不同,Redis提供了多种数据类型,每种类型都有其特定用途和相应的命令集。

1. 字符串(Strings)

字符串是Redis最基本的数据类型,可以存储文本、序列化的对象或二进制数据。

# 设置键值对
SET user:1001 "{"name":"张三","email":"zhangsan@example.com"}"

# 获取值
GET user:1001

# 设置带过期时间的键值对(3600秒后过期)
SETEX session:token123 3600 "user_session_data"

# 原子递增操作
SET counter 0
INCR counter  # 返回1
INCRBY counter 10  # 返回11

2. 哈希表(Hashes)

哈希表适合存储对象,比字符串更节省内存,且允许单独操作对象的字段。

# 存储用户信息
HMSET user:1001 name "张三" email "zhangsan@example.com" age 28 active 1

# 获取特定字段
HGET user:1001 name  # 返回 "张三"

# 获取所有字段
HGETALL user:1001

# 增加数值字段的值
HINCRBY user:1001 age 1  # 年龄+1

3. 列表(Lists)

列表是简单的字符串链表,适合实现队列或栈结构。

# 左侧推入元素(栈)
LPUSH tasks "task1"
LPUSH tasks "task2"

# 右侧推入元素(队列)
RPUSH messages "message1" 
RPUSH messages "message2"

# 左侧弹出元素
LPOP tasks  # 返回 "task2"

# 获取列表范围元素
LRANGE messages 0 -1  # 获取所有元素

4. 集合(Sets)

集合是无序的字符串集合,支持复杂的集合操作。

# 添加集合成员
SADD tags:article:1 "redis" "database" "nosql"

# 获取所有成员
SMEMBERS tags:article:1

# 判断成员是否存在
SISMEMBER tags:article:1 "redis"  # 返回1表示存在

# 集合间操作
SADD user:1:follows 1001 1002 1003
SADD user:2:follows 1001 1003 1004
SINTER user:1:follows user:2:follows  # 交集,返回共同关注

5. 有序集合(Sorted Sets)

有序集合是集合的增强版,每个成员关联一个分数用于排序。

# 添加带分数的成员
ZADD leaderboard 100 "player1"
ZADD leaderboard 200 "player2"
ZADD leaderboard 150 "player3"

# 获取排名(从高到低)
ZREVRANGE leaderboard 0 2 WITHSCORES  # 前三名及分数

# 增加成员分数
ZINCRBY leaderboard 50 "player1"  # player1分数+50

# 获取成员排名
ZREVRANK leaderboard "player2"  # 返回player2的排名(从0开始)

高级特性实践

1. 事务操作

Redis的事务可以确保命令序列的原子性执行。

MULTI  # 开始事务
SET balance:user1 500
DECRBY balance:user1 200
INCRBY balance:user2 200
EXEC  # 执行事务

2. 键过期与淘汰策略

在内存有限的生产环境中,合理设置键过期时间和选择适当的内存淘汰策略至关重要。

# 设置过期时间
EXPIRE user:session:123 1800  # 30分钟过期

# 查看剩余过期时间
TTL user:session:123

# 修改Redis配置使用LRU淘汰策略
# 在redis.conf中设置
# maxmemory 2gb
# maxmemory-policy allkeys-lru

3. 发布/订阅模式

Redis的发布/订阅功能可用于构建简单的消息系统。

# 终端1:订阅频道
SUBSCRIBE notifications

# 终端2:发布消息
PUBLISH notifications "系统将于今晚10点进行维护"

Redis集群实践

当单个Redis实例无法满足需求时,我开始研究Redis集群方案。以下是我搭建主从复制和哨兵模式的简要步骤:

1. 主从复制(Master-Slave Replication)

# 在从节点配置(slave)
slaveof 192.168.1.10 6379

2. 哨兵模式(Sentinel)

创建sentinel.conf文件:

sentinel monitor mymaster 192.168.1.10 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

启动哨兵:

redis-sentinel sentinel.conf

3. Redis Cluster

Redis Cluster需要更复杂的配置,但提供了更好的水平扩展能力:

# 在每个节点的配置中添加
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

# 创建集群
redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1

踩坑记录

学习过程中难免会遇到一些问题,以下是我的一些踩坑经历:

  1. 内存碎片化问题:长时间运行后,Redis可能出现内存碎片。可以通过执行INFO memory命令查看碎片率,必要时执行MEMORY PURGE或重启实例。

  2. 大键问题:一次发现系统响应变慢,排查后发现是一个包含数百万元素的hash键造成的。解决方案是拆分大键并使用SCAN命令进行分批处理。

  3. 网络超时:在AWS上部署Redis时,经常遇到网络超时问题。增加tcp-keepalive参数和调整客户端超时设置后解决。


2025.4.20记录我与Redis共同成长的几天

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

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

相关文章

Pytorch图像数据转为Tensor张量

PyTorch的所有模型(nn.Module)都只接受Tensor格式的输入,所以我们在使用图像数据集时,必须将图像转换为Tensor格式。PyTorch提供了torchvision.transforms模块来处理图像数据集。torchvision.transforms模块提供了一些常用的图像预…

Java 加密与解密:从算法到应用的全面解析

Java 加密与解密:从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代,数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段,被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文,使得…

Java基础系列-HashMap源码解析2-AVL树

文章目录 AVL树左旋右旋左旋右旋的4种情况LL 型RR 型LR 型RL 型 实际插入时怎么判断是那种类型?插入时注意事项删除节点 AVL树 为避免BST树退化成链表的极端情况, AVL 树应运而生。 平衡因子取值(-1,0,1)…

MySQL的日志--Redo Log【学习笔记】

MySQL的日志--Redo Log 知识来源: 《MySQL是怎样运行的》--- 小孩子4919 MySQL的事务四大特性之一就是持久性(Durability)。但是底层是如何实现的呢?这就需要我们的Redo Log(重做日志)闪亮登场了。它记录着…

【AI应用】免费代码仓构建定制版本的ComfyUI应用镜像

免费代码仓构建定制版本的ComfyUI应用镜像 1 创建代码仓1.1 注册登陆1.2 创建代码仓1.5 安装中文语言包1.4 拉取ComfyUI官方代码2 配置参数和预装插件2.1 保留插件和模型的版本控制2.2 克隆插件到代码仓2.2.1 下载插件2.2.2 把插件设置本仓库的子模块管理3 定制Docker镜像3.1 创…

​​Agentic AI——当AI学会主动思考与决策,世界将如何被重塑?

一、引言:2025,Agentic AI的元年 “如果ChatGPT是AI的‘聊天时代’,那么2025年将开启AI的‘行动时代’。”——Global X Insights[1] 随着Agentic AI(自主决策型人工智能)的崛起,AI系统正从被动应答的“工具…

Ollama API 应用指南

1. 基础信息 默认地址: http://localhost:11434/api数据格式: application/json支持方法: POST(主要)、GET(部分接口) 2. 模型管理 API (1) 列出本地模型 端点: GET /api/tags功能: 获取已下载的模型列表。示例:curl http://lo…

PNG透明免抠设计素材大全26000+

在当今的数字设计领域,寻找高质量且易于使用的素材是每个设计师的日常需求。今天,我们将为大家介绍一个超全面的PNG透明免抠设计素材大全,涵盖多种风格、主题和应用场景,无论是平面设计、网页设计还是多媒体制作,都能轻…

4.多表查询

SQL 多表查询:数据整合与分析的强大工具 文章目录 SQL 多表查询:数据整合与分析的强大工具一、 多表查询概述1.1 为什么需要多表查询1.2 多表查询的基本原理 二、 多表查询关系2.1 一对一关系(One-to-One)示例: 2.2 一…

美团2024年春招第一场笔试 C++

目录 1&#xff0c;小美的平衡矩阵 2&#xff0c;小美的数组询问 3&#xff0c;小美的MT 4&#xff0c;小美的朋友关系 1&#xff0c;小美的平衡矩阵 【题目描述】 给定一个n*n的矩阵&#xff0c;该矩阵只包含数字0和1。对于 每个i(1<i<n)&#xff0c;求在该矩阵中&am…

XHTMLConverter把docx转换html报java.lang.NullPointerException异常

一.报错 1.报错信息 org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerExceptionat org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConve…

OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…

COdeTop-206-反转链表

题目 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 …

线段树讲解(小进阶)

目录 前言 一、线段树知识回顾 线段树区间加减 区间修改维护&#xff1a; 区间修改的操作&#xff1a; 区间修改update&#xff1a; 线段树的区间查询 区间查询&#xff1a; 区间查询的操作&#xff1a; 递归查询过程&#xff1a; 区间查询query&#xff1a; 代码&…

openharmony5.0.0中C++公共基础类测试-线程相关(一)

C公共基础类测试及源码剖析 延续传统&#xff0c;show me the code&#xff0c;除了给出应用示例还重点分析了下openharmony中的实现。 简介 openharmony中提供了C公共基础类库&#xff0c;为标准系统提供了一些常用的C开发工具类&#xff0c;本文分析其实现&#xff0c;并给…

TDengine 数据订阅设计

简介 数据订阅作为 TDengine 的一个核心功能&#xff0c;为用户提供了灵活获取所需数据的能力。通过深入了解其内部原理&#xff0c;用户可以更加有效地利用这一功能&#xff0c;满足各种实时数据处理和监控需求。 基本概念 主题 与 Kafka 一样&#xff0c;使用 TDengine 数…

URP-UGUI交互功能实现

一、非代码层面实现交互&#xff08;SetActive&#xff09; Button &#xff1a;在OnClick&#xff08;&#xff09;中添加SetActive方法&#xff08;但是此时只首次有效&#xff09; Toggle &#xff1a;在OnClick&#xff08;&#xff09;中添加动态的SetActive方法 &#…

UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025

UniGoal的提出了一个通用的零样本目标导航框架&#xff0c;能够统一处理多种类型的导航任务 &#xff08;如对象类别导航、实例图像目标导航和文本目标导航&#xff09;&#xff0c;而无需针对特定任务进行训练或微调。 它的特点是 图匹配与多阶段探索策略&#xff01;&#x…

通过Quartus II实现Nios II编程

目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器&#xff0c;专门设计用于在FPGA上运行。作为软核处理器&#xff0c;Nios II可以通…

Linux/AndroidOS中进程间的通信线程间的同步 - IPC方式简介

前言 从来没有总结过Linux/Android系统中进程间的通信方式和线程间的同步方式&#xff0c;这个专栏就系统总结讨论一下。首先从标题可知&#xff0c;讨论问题的主体是进程和线程、通信和同步&#xff1b;在这里默认你理解进程和线程的区别。通信和同步有什么概念上的区别&…