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.rhkb.cn/news/374844.html

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

相关文章

VMware虚拟机使用标准分区后对分区进行扩容

前言&#xff1a; 使用虚拟机创建系统后&#xff0c;/ 盘 想要扩容需要几步才能实现&#xff0c;下面将介绍具体流程 确定根分区磁盘以及分区号&#xff0c;和起始扇区和结束扇区 # 查看磁盘名称和分区 # 如下可看出根分区为 /dev/sda2 &#xff0c;磁盘为sda [root192 ~]# ls…

# Redis 入门到精通(一)数据类型(3)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;3&#xff09; 一、redis 数据类型–set 类型介绍与基本操作 1、set 类型 新的存储需求: 存储大量的数据&#xff0c;在查询方面提供更高的效率。需要的存储结构: 能够保存大量的数据&#xff0c;高效的内部…

redis相关知识记录

redis基本数据类型 Redis⽀持五种主要数据结构&#xff1a;字符串&#xff08;Strings&#xff09;、列表&#xff08;Lists&#xff09;、哈希表&#xff08;Hashes&#xff09;、集合&#xff08;Sets&#xff09;和有序集合&#xff08;Sorted Sets&#xff09;。这些数据结…

UnityHub 无法添加模块问题

文章目录 1.问题描述2.问题解决 1.问题描述 在Hub中无法添加模块 2.问题解决 1、点击设置 2、设置版本安装位置 可以发现installs的安装位置路径设置不是unity安装位置&#xff0c;这里我们更改成自己电脑unity安装位置的上一级路径 添加模块正常&#xff1a;

aws sap认证考试如何轻松通过

如何高效备考AWS SAP (Solutions Architect Professional) 认证? AWS SAP认证是AWS认证体系中难度最高的认证之一,要通过这个考试确实需要下一番功夫。但通过合理规划和有效准备,你可以提高通过的几率。以下是一些建议: 评估起点 首先诚实地评估自己的AWS知识水平和实践经验。…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …

STM32中断(NVIC和EXIT)

CM3 内核支持 256 个中断&#xff0c;其中包含了 16 个内核中断和 240个外部中断&#xff0c;并且具有 256 级的可编程中断设置。但STM32 并没有使用CM3内核的全部东西&#xff0c;而是只用了它的一部分。STM32有 76 个中断&#xff0c;包括16 个内核中断和 60 个可屏蔽中断&am…

Codeforces Round 954 (Div. 3)(A~D题)

A. X Axis 思路: 1~10暴力枚举一下所有可能 代码: #include<bits/stdc.h> using namespace std; #define N 1000005 typedef long long ll; typedef unsigned long long ull; ll n, m, t, h, k; ll a, b, c; ll ans, num, sum, cnt; ll temp[N], f1[N], f2[N]; bool f…

无头单向非循环链表实现 and leetcode刷题

无头单向非循环链表实现 1. 单链表的模拟实现IList.java接口&#xff1a;MySingleList.java文件&#xff1a; 2. leetcode刷题2.1 获取链表的中间节点2.2 删除链表中所有值为value的元素2.3 单链表的逆置2.4 获取链表倒数第k个节点2.5 给定 x, 把一个链表整理成前半部分小于 x,…

java使用easypoi模版导出word详细步骤

文章目录 第一步、引入pom依赖第二步、新建导出工具类WordUtil第三步、创建模版word4.编写接口代码5.导出结果示例 第一步、引入pom依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><…

AutoMQ vs Kafka: 来自小红书的独立深度评测与对比

测试背景 当前小红书消息引擎团队与 AutoMQ 团队正在深度合作&#xff0c;共同推动社区建设&#xff0c;探索云原生消息引擎的前沿技术。本文基于 OpenMessaging 框架&#xff0c;对 AutoMQ 进行了全面测评。欢迎大家参与社区并分享测评体验。 01 测试结论 本文主要测评云…

Elon Musk开源Grok

转载自&#xff1a;AILab基地 早在6天前&#xff0c;马斯克就发文称xAI将开源Grok 图片 13小时前&#xff0c;马斯克开源了旗下公司X的Grok训练模型&#xff0c;并喊话OpenAI&#xff0c;你名字里的Open到底在哪里 图片 下面是xai-org的GitHub开源地址[https://github.com/x…

yolov8、RTDETR无法使用多个GPU训练

yolov8、RTDETR无法使用多个GPU训练 网上看了好多解决方法&#xff1a; 什么命令行 CUDA_VISIBLE_DEVICES0,1 python train.py 环境变量都不行 最后找到解决方案&#xff1a;在ultralytics/engine/trainer.py 中的第246行 将 self.model DDP(self.model, device_ids[RANK])…

学习测试7-ADB的使用

ADB是什么&#xff1f; ADB&#xff0c;即 Android Debug Bridge&#xff08;安卓调试桥&#xff09; 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具&#xff0c;它可为各种设备操作提供便利&#xff0c;如安装和调试应用&#xff0c;并提供对 Unix shell&…

C++|智能指针

目录 引入 一、智能指针的使用及原理 1.1RAII 1.2智能指针原理 1.3智能指针发展 1.3.1std::auto_ptr 1.3.2std::unique_ptr 1.3.3std::shared_ptr 二、循环引用问题及解决方法 2.1循环引用 2.2解决方法 三、删除器 四、C11和boost中智能指针的关系 引入 回顾上…

如何分析软件测试中发现的Bug!

假如你是一名软件测试工程师&#xff0c;每天面对的就是那些“刁钻”的Bug&#xff0c;它们像是隐藏在黑暗中的敌人&#xff0c;时不时跳出来给你一个“惊喜”。那么&#xff0c;如何才能有效地分析和处理这些Bug&#xff0c;让你的测试工作变得高效且有趣呢&#xff1f;今天我…

SpringBoot配置flyway

背景 目前我们的项目代码都会交由Git、SVN等版本管理工具进行管理&#xff0c;但是我们的sql脚本&#xff0c;尤其是各类ddl脚本并没有进行版本的管理&#xff08;python的web框架Django默认就提供了类似的工具&#xff0c;从一开始就鼓励开发者通过版本管理的方式进行数据库的…

Android Studio 的Gradle下载慢,Gradle切换下载源

看图 下面的文字地址因为转义符号的问题&#xff0c;https后面少了一个斜杠看图片进行补充&#xff0c;直接复制不知道能不能用 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip

第一关:Linux基础知识

Linux基础知识目录 前言LinuxInternStudio 关卡1. InternStudio开发机介绍2. SSH及端口映射2.1 什么是SSH&#xff1f;2.2 如何使用SSH远程连接开发机&#xff1f;2.2.1 使用密码进行SSH远程连接2.2.2 配置SSH密钥进行SSH远程连接2.2.3 使用VScode进行SSH远程连接 2.3. 端口映射…

进度条提示-在python程序中使用避免我误以为挂掉了

使用库tqdm 你还可以手写一点&#xff0c;反正只要是输出点什么东西都可以&#xff1b; Demo from chatgpt import time from tqdm import tqdm# 示例函数&#xff0c;模拟长时间运行的任务 def long_running_task():total_steps 100for step in tqdm(range(total_steps), …