当前位置: 首页 > 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共同成长的几天

相关文章:

  • 存储/服务器内存的基本概念简介
  • 系统思考与理性决策
  • 基于FPGA的四层电梯设计系统设计和实现
  • leetcode205.同构字符串
  • 【读书笔记·VLSI电路设计方法解密】问题63:为什么可测试性设计对产品的财务成功至关重要
  • 个人所得税
  • 缓存 --- Redis性能瓶颈和大Key问题
  • Python内存管理之隔代回收机制详解
  • windows docker desktop 无法访问容器端口映射
  • 线程安全总结
  • 关于编译树莓派内核系统的总结
  • 【MySQL】MySQL的基础语法及其语句的介绍
  • 【微知】服务器如何获取服务器的SN序列号信息?(dmidecode -t 1)
  • 游戏引擎学习第237天:使用 OpenGL 显示图像
  • IP数据报
  • GA 。。。
  • 在统信UOS上修改sudo权限以免输入密码
  • 【数据结构 · 初阶】- 带环链表
  • 蓝桥杯题目:卡牌
  • 无意间发现的宝藏项目:开源世界中的演示项目精选合集
  • 世界黄金协会:一季度全球黄金投资需求同比增170%
  • 中国强镇密码丨洪泽湖畔的蒋坝,如何打破古镇刻板印象
  • 十四届全国人大常委会举行第四十四次委员长会议
  • 融创服务全面退出彰泰服务集团:约8.26亿元出售广西彰泰融创智慧80%股权
  • 排除燃气爆炸、人为放火可能,辽宁辽阳火灾事故起火原因正在调查
  • 4月制造业PMI为49%,比上月下降1.5个百分点