Redis 工作总结
1.Redis是什么
Redis是互联网技术领域使用最为广泛的存储中间件,它是Remote Dictionary Service的首字母缩写,也就是远程字典服务。
2.Redis的用途?
2.1 计数器
2.2 缓存
2.3 分布式锁
2.4 消息中间件
3.Redis的数据类型
3.1 string(字符串)
Redis的字符串是动态字符串,是可以修改的字符串,采用预分配冗余空间的方式 来减少内存的频繁分配。当字符串长度小于1M时,扩容都是加倍扩容,当超过1M时,每次扩容时增加1M的空间【字符串最大长度为 512M】 。
基本命令: set 、 get 、 exists 、 del
批量命令: mset 、 mget
其他命令: expire 、 setex 、 setnx 、 incr 、 incrby 【自增的最大值是signed long】
3.2 list(列表)
Redis的列表相当于Java语言里面的 LinkedList ,底层是链表实现。插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
常用命令: rpush 、 lpush 、 rpop 、 lpop
查询命令: llen 、 lrange 、 lindex 、 ltirm
3.3 hash(哈希)
Redis 的字典相当于 Java 语言里面的 HashMap ,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。当 hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收
常用命令: hset 、 hget 、 hgetall 、 hlen 、 hmet
其他命令: hincr 、 hincrbu
3.4 set(集合)
Redis 的集合相当于 Java 语言里面的 HashSet ,它内部的键值对是无序的唯一的。当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
常用命令: sadd 、 smembers 、 sismember 、 scard 、 spop
3.5 zset(有序集合)
Redis 的Zset 类似Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set ,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score ,代表这个 value 的排序权 重。它的内部实现用的是一种叫着「 跳跃列表 」的数据结构。zset 中最后一个 value 被移除后,数据结构自动删除,内存被回收。
常用命令: sadd 、 smembers 、 sismember 、 scard 、 spop
3.6 公共操作
3.6.1 删除操作
del key [key …]
3.6.2 有效期
expire key second [单位] 设置key的有效期
ttl key 查看key的有效期 【-1 永久有效 -2 已失效 正整数 有效期】
已设置有效期的字符串重新set key value后有效期失效。
4.Redis数据持久方案
4.1 RDB
是一种快照式的数据存储,它会周期性的保存当前时间点Redis所有的数据到磁盘中。
当Redis需要进行快照操作时,它会fork出一个子进程,负责将快照写入磁盘,而父进程则继续处理请求。由于Redis使用了写时复制(COW)的技术,所以子进程只需要复制到父进程中发生过改变的数据页,而不是复制整个Redis进程的内存空间。因此,这个过程不会对父进程的性能造成较大的影响。
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件之后,我们搜索save,可以看到下面的配置信息:
save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。
save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。
save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
优点:RDB持久化文件,速度比较快,而且存储的是一个二进制文件,传输起来很方便。
缺点:RDB无法保证数据的绝对安全,有时候就是1s也会有很大的数据丢失。
4.2 AOF
是一种追加式的存储方式,会实时的记录Redis的写操作到磁盘中。
在Redis的配置文件中存在三种同步方式,它们分别是:
vim /etc/redis/6379.conf
● appendfsync always:
命令写入aof_ buf后立即调用系统fsync操作同步到AOF文件,fsync完成后线程返回。这种情况下,每次有写命令都要同步到AOF文件,硬盘IO成为性能瓶颈,Redis只能支持大约几百TPS写入,严重降低了Redis的性能;即便是使用固态硬盘(SSD),每秒大约也只能处理几万个命令,而且会大大降低SSD的寿命。
● appendfsync no:
命令写入aof_ buf后调用系统write操作,不对AOF文件做fsync同步;同步由操作系统负责,通常同步周期为30秒。这种情况下,文件同步的时间不可控,且缓冲区中堆积的数据会很多,数据安全性无法保证。
● appendfsync everysec:
命令写入aof_ buf后调用系统write操作,write完成后线程返回; fsync同步文件操作由专门的线程每秒调用一次。everysec是前述两种策略的折中,是性能和数据安全性的平衡,因此是Redis的默认配置,也是我们推荐的配置。
AOF执行流程:
命令追加(append): 将Redis的写命令追加到缓冲区aof_buf;【避免硬盘IO成为Redis的瓶颈】
文件(write)和(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘;【丢失数据】
文件重写(rewrite): 定期重写AOF文件,达到压缩的目的。AOF文件重写:
子进程执行【避免Redis无法正常使用】新增一个AOF文件,子进程开启时增加了一个AOF重写缓存,Redis服务器主进程在执行完写命令之后,会同时将这个写命令追加到AOF缓冲区和AOF重写缓冲区 。AOF重写文件写完之后会将AOF重写缓存中的数据写入AOF重写文件【主线程阻塞】,写入完成后将AOF重写文件重命名为覆盖原有文件【主线程阻塞】。
AOF文件重写触发条件:
1.没有BGSAVE命令(RDB持久化)/AOF持久化在执行;
2.没有BGREWRITEAOF在进行;
3.当前AOF文件大小要大于server.aof_rewrite_min_size(默认为1MB),或者在redis.conf配置了auto-aof-rewrite-min-size大小;
4.当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比(在配置文件设置了auto-aof-rewrite-percentage参数,不设置默认为100%)
5.如果前面三个条件都满足,并且当前AOF文件大小比最后一次AOF重写时的大小要大于指定的百分比,那么触发自动AOF重写。
优点:AOF相对RDB更加安全,一般不会有数据的丢失或者很少。
缺点:AOF相对RDB持久化的速度更慢,存储的是一个文本文件,到了后期文件会比较大,传输困难。
官方推荐同时开启AOF和RDB。
5.Redis集群模式
5.1 Codis
Codis是基于Redis Cluster的代理工具,可以通过代理实现数据的分片和负载均衡。Codis具有配置简单、扩展性好等特点。
5.2 Redis Sentinel
Redis Sentinel是Redis官方提供的高可用方案,可以通过自动故障检测、自动主从切换等功能,实现Redis的高可用。
5.3 Redisson
Redisson是一个开源的Redis客户端,支持分布式锁、分布式集合、分布式对象等功能,可以将多个Redis实例组成一个集群来提供高并发服务。
5.4 Twemproxy
Twemproxy是一个代理工具,支持多个Redis实例之间的分片和负载均衡,可以通过配置实现数据的分片和负载均衡
6.RedisAP模式
6.1 高可用性
Redis在分布式模式下采用AP模型,可以在节点故障的情况下,保证整个系统的高可用性,不会影响用户使用和数据的完整性。Redis采用主从复制和哨兵模式来保证系统在节点故障时的高可用性。
6.2 数据一致性
Redis为了保证数据一致性,对于主从复制中的主节点和从节点进行数据同步,采用异步复制方式,保证了高性能。Redis同时采用哨兵模式,负责监控所有的Redis节点,一旦某个节点故障,哨兵会自动发现新的主节点,保证数据的一致性和可用性。
6.3 高扩展性
Redis采用AP模型,可以实现分布式的节点扩展,保证系统的高扩展性。Redis的节点之间采用无中心化的结构,各个节点之间相互独立,通过分片的方式来进行数据存储与同步,简单易上手,非常容易实现扩展。
7.内存淘汰策略
7.1 拒绝淘汰
noeviction 拒绝写入操作。【3.0+默认策略,保证业务数据的安全性】
7.2 允许淘汰
7.2.1全量数据范围淘汰
allkeys-random:随机淘汰任意键值。【数据集较大,保持数据的随机性要求】
allkeys-lru:淘汰整个键值中最久未使用的键值。【数据集小,侧重当前热度。】
allkeys-lfu:淘汰整个键值中最少使用的键值。【数据集小,侧重整体热度。4.0+】
7.2.2设置过期时间数据淘汰
volatile-random:随机淘汰设置了过期时间的任意键值。【数据集较大,保持数据的随机性要求】
volatile-ttl:优先淘汰更早过期的键值。【数据集小,侧重数据的及时更新】
volatile-lru:淘汰所有设置了过期时间的键值中,最久未使用的键值。【数据集小,侧重当前热度。3.0-默认策略】
volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值。【数据集小,侧重整体热度。4.0+】
相关文章:
Redis 工作总结
1.Redis是什么 Redis是互联网技术领域使用最为广泛的存储中间件,它是Remote Dictionary Service的首字母缩写,也就是远程字典服务。 2.Redis的用途? 2.1 计数器 2.2 缓存 2.3 分布式锁 2.4 消息中间件 3.Redis的数据类型 3.1 string&am…...
GO学习之 数据库(Redis)
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

谈一谈浏览器与Node.js中的JavaScript事件循环,宏任务与微任务机制
JavaScript中的异步代码 JavaScript是一个单线程非阻塞的脚本语言。这代表代码是执行在一个主线程上面的。但是JavaScript中有很多耗时的异步操作,例如AJAX,setTimeout等等;也有很多事件,例如用户触发的点击事件,鼠标…...
User Java bean的命名规范
Java Bean 是一种用于表示简单的、可重用的组件的规范。它是一个符合特定命名和约定的 Java 类,通常用于封装数据和提供访问方法。以下是关于 Java Bean 命名规范的一些准则: 类名: 类名应该使用驼峰命名法(Camel Case)…...
ajax和fetch的区别
ajax 和 fetch的相同点和区别是什么? 以前我们都用ajax去做请求, 但是原生的ajax不好用,我们会用$.ajax或者axios插件去请求,他们都是ajax的封装 最近出来个fetch是什么? 问到这里的时候,你就已经入坑了&am…...

java+springboot+mysql村务档案管理系统
项目介绍: 使用javaspringbootmysql开发的村务档案管理系统,系统包含超级管理员、工作人员角色,功能如下: 超级管理员:系统用户管理(工作人员管理);公开资料;会议记录&…...

windows查看/删除DNS缓存
一、查看DNS缓存 打开CMD,输入ipconfig/displaydns 二、删除DNS缓存 打开CMD,输入ipconfig/flushdns...

自动化测试之Junit
Junit引入注解参数化单参数多参数方法传参 测试用例执行顺序断言测试套件 Junit引入 Junit来编写和组织自动化测试用例,使用Selenium来实际模拟用户与Web应用程序的交互。也就是使用JUnit的测试功能来管理和运行Selenium测试。常见的做法是,使用JUnit作…...

Spring Boot 整合MyBatis-Plus
😀前言 本篇博文是关于Spring Boot 整合MyBatis-Plus的,希望你能够喜欢😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的…...

CC++ 常用技巧
C 中的C C 是面向过程的是把整个大程序分为一个个的子函数;C 是面向对象的是把整个程序划分为一个个的类。C 是完全兼容C 的,C 是C 的子集,C 是C 的超集。C 又对C 做了很多补充和提升,因此使用C 会比使用纯C 更方便。混用C和C&am…...

【AndroidStudio】屏蔽小米打印
使用小米手机调试时,会一直有notifyQueue load error的打印 在过滤器重添加过滤条件即可 -message:notifyQueue...

Tomcat的安装与介绍
首先我们先了解一下什么是服务器?什么是服务器软件? 什么是服务器?安装了服务器软件的计算机。 什么是服务器软件? 服务器软件是一种运行在服务器操作系统上,用于接收和处理客户端请求,并提供相应服务和资…...

说点大实话丨知名技术博主 Kirito 测评云原生网关
作者:徐靖峰 关注了阿里云云原生公众号,经常能看到 MSE-Higress 相关的推文,恰逢这次阿里云产品举办了一个 MSE-Higress 云原生网关的测评活动,借此机会体验了一把云原生网关的功能。 购买流程体验 购买网关时,页面明…...

时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现SO-CNN-BiLSTM蛇群算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现SO-CNN-BiL…...

简述docker的网络模式
Docker 提供了多种网络模式,用于控制容器之间以及容器与主机之间的网络通信。以下是 Docker 的一些常见网络模式 briage模式: docker容器启动时默认就是该模式,在该模式下,docker容器会连接到一个名为docker0的虚拟以太网桥上,通…...
MySql-8.0.34 CentOS 安装命令记录
1、执行以下命令获取 glibc 版本,根据版本下载相应的MySQL安装包。 ldd --version 2、下载MySQL。 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34-linux-glibc2.17-x86_64.tar.gz 3、解压 tar -xzvf mysql-8.0.34-linux-glibc2.17-x86_64.t…...

开发电子木鱼功德+1需要多少钱
冥想木鱼小程序是一种结合了冥想和科技的应用形式,为用户提供了随时随地进行冥想的便捷方式。开发一款高质量的冥想木鱼小程序需要综合考虑技术实现、冥想专业性和用户体验等多个方面。本文将详细介绍冥想木鱼小程序的开发过程,并探讨其中的专业性与思考…...
批处理中扩展解释%~的相关知识和用法,并给出示例和实际运行结果展示
批处理中扩展解释%~的相关知识和用法,并给出示例和实际运行结果展示 在批处理脚本中,%~是一个特殊的前缀,用于对参数和变量进行字符串处理。这个前缀后面可以跟着不同的字符,用于执行不同的操作。下面是一些常见的用法:…...
LA@向量组间的表示关系
文章目录 2个向量组间的表示关系向量组的相互表出向量组用另一个向量组表示👺线性表示的系数矩阵矩阵乘法与线性表出列向量组线性表示行向量组线性表示 向量组等价👺向量组等价的性质推论 等价矩阵与向量组等价的关系行等价矩阵的行向量组等价列等价矩阵…...

Mybatis与Spring集成
目录 一.Spring整合Mybatis 1.什么是Spring整合Mybatis 新建一个ssm 编辑 导入pom依赖 导入generatorConfig.xml 导入Spring-context.xml文件 导入Spring-mybatis.xml文件 自动生成Bookmapper.xml和Bookmapper文件 编写接口类:Bookbiz 编写接口实现类 …...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...