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

Redis日常学习(一)

我的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.xdnf.cn/news/41653.html

相关文章:

  • 基于Django的AI客服租车分析系统
  • QT6 源(37):界面组件的总基类 QWidget 的源码阅读(下,c++ 代码部分)
  • TDengine 整体构架
  • AI Agent破局:智能化与生态系统标准化的颠覆性融合!
  • 分布自定义shell脚本(详写)附带全代码
  • BT1120 BT656驱动相关代码示例
  • DNS主从同步
  • FFUF指南
  • 高速系统设计简介
  • dac直通线还是aoc直通线? sfp使用
  • -SSRF 服务端请求Gopher 伪协议无回显利用黑白盒挖掘业务功能点
  • UE Datasmith资源导入导出
  • BT-Basic函数之首字母XY
  • 4. 话题通信 ---- 发布方和订阅方cpp文件编写
  • Java实现将MarkDown保留文档内容及格式输出到浏览器页面
  • 2.2/Q2,GBD数据库最新文章解读
  • 模拟算法(一)作业分析及答案
  • java lambda
  • C++入门七式——模板初阶
  • sed命令笔记250419
  • Nacos启动报错
  • BMS电池管理芯片BQ76920芯片手册详细解读
  • python基础知识点(2)
  • stack和queue
  • 借助LlamaIndex实现简单Agent
  • 多模态融合(十一): SwinFusion——武汉大学马佳义团队(二)
  • 英语四级翻译题练习文章示例
  • 生物化学笔记:医学免疫学原理23 免疫检查点分子与肿瘤免疫治疗(PD-1抑制剂黑色素瘤)
  • 最长子序列长度(LIS)--个数遍历的二分+贪心优化
  • 代码随想录背包问题完结