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的进阶使用方法和技巧,希望能为您的开发工作提供帮助。

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

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

相关文章

在Spring Boot中实现多租户架构的数据隔离

在Spring Boot中实现多租户架构的数据隔离 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 随着云计算和SaaS&#xff08;软件即服务&#xff09;模式的普及&#xff0c;多租户架构在企业应…

“四大水刊”水出新境界!仅一本剔除,飞升1区,IF3.8,1个月录用依然吊打!

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;来稿即录25天&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;纯正刊29天录用&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网 • 7天录用-检索&#xff08;急录友好&a…

我可能要和低价官网建设说拜拜了。

最近和团队商议&#xff0c;要不要放弃低价官网建设业务&#xff0c;大部分人要求放弃&#xff0c;我有点不舍&#xff0c;毕竟从公司开始就是靠网站建设业务存活和起价的。 对于设计师来说&#xff0c;对于美与体验的追求是无止境的&#xff0c;你让他搞个高大上网站&#xf…

ActiViz实战:鼠标交互和vtkCommand的问题

文章目录 前言一、消失的vtkCallbackCommand二、自定义命令vtkCommand1、自定义一个左键双击事件的命令2、使用观察者/命令模式3、结果三、vtkObject类中的事件1、vtkCommand中所有的事件2、鼠标事件测试3、如何添加左键的双击事件四、总结前言 在C++的VTK中,我们常用vtkCall…

《C++20设计模式》命令模式思考

文章目录 一、前言二、分析 拆解1、经典命令模式2、撤销操作3、关于Invoker类 三、实现 一、前言 哎&#xff01;只要是书上写的和经典设计模式不同&#xff0c;我就会很伤脑筋。&#x1f629; 命令模式到底是干什么的&#xff1f; 答&#xff1a;命令的发送者和接收者完全解…

如何在Windows系统中关闭占用特定端口的进程

前言 在日常的系统管理或开发调试过程中&#xff0c;我们常常会遇到需要关闭占用特定端口的进程的情形&#xff0c;以释放端口供其他服务或应用使用。本文将详细介绍在Windows操作系统中如何识别并终止占用特定端口的进程&#xff0c;以确保系统资源的合理分配和应用的正常运行…

C#win和Linux系统下文件查找

在C#中,文件遍历和查找可以通过不同的方法实现,取决于你希望如何操作文件系统和文件。 文件遍历 文件遍历涉及访问文件夹并获取其内容的过程。在C#中,可以使用以下方法进行文件遍历: 1. 使用 Directory 类 using System; using System.IO;class Program {static void M…

28个常用的损失函数介绍以及Python代码实现总结

28个常用的损失函数介绍以及Python代码实现总结 最近在做多分类的研究&#xff0c;总是遇到这么多损失函数&#xff0c;应该挑选哪一个损失函数呢&#xff1f;这样的问题。于是心血来潮便想着对损失函数进行总结。 以下是一个预览总结&#xff1a; 损失函数名称问题类型L1范…

80+ ChatGPT 文献综述指令

进行文献综述通常似乎是一项艰巨的任务。它是学术和研究工作的重要组成部分&#xff0c;涉及对先前发表的与特定主题相关的研究进行全面和批判性分析。目标是深入了解该主题的知识状况&#xff0c;找出差距&#xff0c;并为进一步研究奠定基础。 传统上&#xff0c;文献综述是…

STL复习-序列式容器和容器适配器部分

STL复习 1. 常见的容器 如何介绍这些容器&#xff0c;分别从常见接口&#xff0c;迭代器类型&#xff0c;底层实现 序列式容器 string string严格来说不属于stl&#xff0c;它是属于C标准库 **底层实现&#xff1a;**string本质是char类型的顺序表&#xff0c;因为不同编译…

3-一元函数微分学

看到高次求导0---->立即想到奇偶性

STM32智能无人机控制系统教程

目录 引言环境准备智能无人机控制系统基础代码实现&#xff1a;实现智能无人机控制系统 4.1 数据采集模块 4.2 数据处理与飞行控制 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;无人机应用与优化问题解决方案与优化收尾与总结 1. 引言 智能无人机控…

复旦微JFMVU3P-2FFVC1517 FPGA+AI全国产化人工智能数据处理平台,适用于雷达与中频信号采集、视频图像采集

板载FPGA实时处理器&#xff1a;JFMVU3P-2FFVC1517支持1个FMC&#xff08;HPC&#xff09;扩展接口支持2路QSFP光纤接口支持x8 Gen3 PCIE主机接口&#xff0c;系统带宽&#xff1e;5GByte/s支持1个R45自适应千兆以太网口支持1个GPIO/RS422接口 基于复旦微16nm工艺JFM9VU3P FPG…

鸿蒙应用APP开发实战:详细操作指南

HarmonyOS&#xff0c;作为华为的全场景分布式操作系统&#xff0c;为开发者提供了构建跨设备、无缝连接的智能生态应用的平台。本文将通过详细的操作步骤&#xff0c;指导你从零开始&#xff0c;逐步构建一款简单的HarmonyOS应用&#xff0c;包括项目创建、UI设计、逻辑实现、…

C语言 -- 深入理解指针(二)

C语言 -- 深入理解指针&#xff08;二&#xff09; 1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组8. 字符指针变量9. 数组指针变量2.1数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化 10. 二维…

玩转springboot之springboot加载自定义yml配置文件

加载自定义yml配置文件 springboot默认加载的是application.yml/properties配置文件&#xff0c;对于自定义的properties配置文件使用PropertySource和ConfigurationProperties注解搭配使用也可以进行加载注入&#xff0c;但是properties配置文件没有yml配置文件有层次感&#…

SQLServer的系统数据库用别的服务器上的系统数据库替换后做跨服务器连接时出现凭证、非对称金钥或私密金钥的资料无效

出错作业背景&#xff1a; 公司的某个sqlserver服务器要做迁移&#xff0c;由于该sqlserver服务器上数据库很多&#xff0c;并且做了很多的job和维护计划&#xff0c;重新安装的sqlserver这些都是空的&#xff0c;于是就想到了把系统4个系统数据库进行替换&#xff0c;然后也把…

Android进入Recovery模式 显示无命令 / no command

问题&#xff1a; 进入 recovery 模式后就显示no command&#xff0c;倒地机器人 解决&#xff1a; 在此界面按住电源键不放&#xff0c;再按一下音量

栈的匹配问题

栈 发现自己对栈掌握的不行啊&#xff0c;来补一补题。 因为栈 先进后出 的特点。非常适合做匹配类的题目。 例如 括号匹配 假如我们 将左括号 放在一起&#xff0c;当遍历到右括号的时候&#xff0c;这个右括号应该和离他最近的左括号匹配。也就是最晚遍历到的左括号。正好和…

Git 查看、新建、删除、切换分支

Git 是一个版本控制系统&#xff0c;软件开发者用它来跟踪应用程序的变化并进行项目协作。 分支的诞生便于开发人员在彼此独立的环境中进行开发工作。主分支&#xff08;通常是 main 或 master&#xff09;可以保持稳定&#xff0c;而新的功能或修复可以在单独的分支中进行开发…