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

Redis进阶教程

Redis进阶教程

目录

  1. Redis内存管理
    1. 内存分配
    2. 内存回收策略
  2. Redis集群
    1. 集群架构
    2. 数据分片
    3. 故障检测与恢复
  3. Redis持久化策略
    1. RDB与AOF对比
    2. 混合持久化
  4. Redis事务
    1. 事务的基本概念
    2. 乐观锁机制
  5. Redis脚本
    1. Lua脚本简介
    2. 常用Lua脚本示例
  6. Redis安全配置
    1. 身份认证
    2. 防火墙设置
    3. 客户端安全
  7. Redis性能优化
    1. 优化命令使用
    2. 内存优化
  8. 总结

1. Redis内存管理

1.1 内存分配

Redis的内存管理非常重要,因为它是一个内存数据库。Redis主要通过以下几种方式进行内存分配:

  • jemalloc:这是Redis默认的内存分配器,具有高效的内存分配和释放性能。
  • tcmalloc:Google开发的高效内存分配器,适用于高并发场景。
  • libc malloc:标准C库的内存分配器,适用于一般场景。

可以通过编辑redis.conf文件指定使用的内存分配器,例如:

malloc-lib /usr/lib/libjemalloc.so.1

1.2 内存回收策略

Redis支持多种内存回收策略,主要包括:

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:在键空间中,移除最近最少使用的键。
  • volatile-lru:在设置了过期时间的键空间中,移除最近最少使用的键。
  • allkeys-random:在键空间中,随机移除某个键。
  • volatile-random:在设置了过期时间的键空间中,随机移除某个键。
  • volatile-ttl:在设置了过期时间的键空间中,移除即将过期的键。

可以在redis.conf中设置内存回收策略,例如:

maxmemory-policy allkeys-lru

2. Redis集群

2.1 集群架构

Redis集群通过分片机制将数据分布在多个节点上,提供高可用性和可扩展性。集群由多个主节点和从节点组成,每个主节点负责管理一个或多个数据分片。

2.2 数据分片

Redis集群使用哈希槽(hash slot)进行数据分片,共有16384个哈希槽,每个键通过CRC16算法计算得到哈希值,然后对16384取模,决定存储在哪个槽中。

2.3 故障检测与恢复

Redis集群通过Gossip协议进行故障检测与恢复。当主节点出现故障时,集群会自动将对应的从节点提升为主节点,继续提供服务。

3. Redis持久化策略

3.1 RDB与AOF对比

  • RDB(Redis Database File):通过快照将数据定期保存到磁盘,优点是性能高、恢复速度快,但数据可能会丢失一段时间。
  • AOF(Append Only File):通过记录每个写操作的日志,保证数据不丢失,但文件体积大、恢复速度慢。

3.2 混合持久化

Redis 4.0引入了混合持久化方式,将RDB和AOF结合起来,既保证数据完整性,又提高了恢复速度。可以在redis.conf中配置:

aof-use-rdb-preamble yes

4. Redis事务

4.1 事务的基本概念

Redis事务通过MULTIEXECDISCARDWATCH命令实现,支持一次执行多个命令,但不支持回滚。

4.2 乐观锁机制

通过WATCH命令监控一个或多个键,如果在事务执行前这些键被其他客户端修改,事务将被取消。示例如下:

WATCH key1 key2
MULTI
SET key1 value1
SET key2 value2
EXEC

5. Redis脚本

5.1 Lua脚本简介

Redis支持使用Lua脚本执行原子操作,避免多条命令执行过程中的数据竞争。通过EVAL命令执行Lua脚本。

5.2 常用Lua脚本示例

以下是一个简单的Lua脚本示例,原子性地递增一个键的值:

local current = redis.call('GET', KEYS[1])
if current thenredis.call('SET', KEYS[1], current + 1)
elseredis.call('SET', KEYS[1], 1)
end
return current

通过以下命令执行该脚本:

EVAL "local current = redis.call('GET', KEYS[1]); if current then redis.call('SET', KEYS[1], current + 1); else redis.call('SET', KEYS[1], 1); end; return current" 1 key

6. Redis安全配置

6.1 身份认证

通过在redis.conf中设置密码,增强Redis的安全性:

requirepass yourpassword

客户端连接时需要提供密码:

redis-cli -a yourpassword

6.2 防火墙设置

通过设置防火墙规则,限制对Redis服务器的访问。例如,使用ufw允许特定IP访问Redis:

sudo ufw allow from <your_ip> to any port 6379

6.3 客户端安全

确保客户端连接到Redis服务器时使用安全的网络环境,并定期更新客户端库,避免潜在的安全漏洞。

7. Redis性能优化

7.1 优化命令使用

  • 避免使用阻塞命令:例如BLPOPBRPOP等阻塞命令会影响Redis的性能。
  • 批量操作:尽量使用MGETMSET等批量操作代替多次单条操作,减少网络往返次数。
  • 合理使用管道(pipeline):通过pipeline技术可以将多条命令一次性发送给Redis服务器,减少网络延迟。

7.2 内存优化

  • 使用更紧凑的数据结构:如ziplist、intset等。
  • 开启内存压缩:可以在redis.conf中设置hash-max-ziplist-entrieshash-max-ziplist-value参数。

8. 总结

Redis作为一款高性能的内存数据库,通过合理的内存管理、集群配置、持久化策略和性能优化,可以显著提高系统的稳定性和响应速度。本文详细介绍了Redis的进阶使用方法和技巧,希望能为您的开发工作提供帮助。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 硅纪元视角 | 中国电信“星辰大模型·软件工厂”,两分钟完成应用开发,效率飞跃!
  • 【优化算法】梯度下降法-白老爹定理(上)
  • 昇思25天打卡营-mindspore-ML- Day19-应用实践-生成式-DCGAN生成漫画头像
  • BAT-致敬精简
  • MVC(Model-View-Controller)模式
  • 中国星坤X1224系列线对板连接器:小巧稳定,助力物联网终端高效运行
  • Windows下Visual Studio 中配置第一个CUDA工程
  • 生活商城app微信小程序模板源码
  • [C++][ProtoBuf][初识ProtoBuf]详细讲解
  • 常用 Android 反编译工具apktooldex2jarenjarifyjd-guijadx
  • 数据库第01讲章节测验(选项顺序可能不同)
  • macOS笔记
  • 数字传输系统的演变与应用
  • 数据结构之B树
  • 『大模型笔记』《Pytorch实用教程》(第二版)
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • const let
  • HTTP--网络协议分层,http历史(二)
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Javascripit类型转换比较那点事儿,双等号(==)
  • KMP算法及优化
  • Linux gpio口使用方法
  • Vultr 教程目录
  • 关于List、List?、ListObject的区别
  • 聚簇索引和非聚簇索引
  • 普通函数和构造函数的区别
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用SAX解析XML
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • Hibernate主键生成策略及选择
  • NLPIR智能语义技术让大数据挖掘更简单
  • 阿里云ACE认证之理解CDN技术
  • # windows 安装 mysql 显示 no packages found 解决方法
  • (2)MFC+openGL单文档框架glFrame
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (纯JS)图片裁剪
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (七)Activiti-modeler中文支持
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET BackgroundWorker
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net Core中Quartz的使用方法
  • .Net Winform开发笔记(一)
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • @selector(..)警告提示
  • @Transactional 竟也能解决分布式事务?
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429