Redis晋级之路!!

本节pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>my-code-note-for-java</artifactId><groupId>org.example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.augus</groupId><artifactId>springbootAddRedis</artifactId><version>0.0.1-SNAPSHOT</version><name>springbootAddRedis</name><description>springbootAddRedis</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.7.2</spring-boot.version></properties><dependencies><!--SpringBoot与Redis整合依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--guava Google 开源的 Guava 中自带的布隆过滤器--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency><!--jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency><!--lettuce--><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.1.RELEASE</version></dependency><!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.2.3</version></dependency><!--persistence--><dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0.2</version></dependency><!--    springboot  demo     --><!--        springboot        --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--        mybatis        --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--        mybatis-plus        --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--        lombok        --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--        swagger        --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.springboot.SpringbootApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

什么是Redis

Redis是一个功能强大、高性能的内存数据库。
Redis支持持久化、事务、管道、发布订阅、主从控制、集群。
通常,使用Redis进行数据缓存、会话存储、实时分析、分布式锁等功能。

Redis十大数据结构

① String

基本操作
set/setnx/setex/setpx/setexat/setpxat/setkeepttl
mset/mget:一次设置/获取多个kv
setrange/getrange:设置/获取key的0-x的索引
incr/decr:如果value为数字+1/-1
append: 向value中追加内容

进阶操作
命令合并、分布式锁

②List

List底层是双端链表,对两段的操作性能很高,通过索引下标操作中间的节点性能会较差。List容量是232-1,大概是40多亿,主要功能是push/pop,一般用于栈、队列、消息队列等场景。

**应用场景:**微信公众号,订阅的公众号发布的新文章会插入到自己的list中 lpush likearticle:用户id 公众号id

基本操作
lpush:将一个或多个值插入到列表的头部。如果键不存在,会创建一个空列表并进行插入操作。多个值按从左到右的顺序依次插入到列表头部。
rpush:将一个或多个值插入到列表的尾部。如果键不存在,会创建一个空列表并进行插入操作。多个值按从左到右的顺序依次插入到列表尾部。
lrange:返回列表中指定范围内的元素。start 和 stop 是索引,索引从 0 开始,负索引表示从列表末尾开始计数(-1 表示最后一个元素)。
lpop:移除并返回列表的第一个元素(头部)。
rpop:移除并返回列表的最后一个元素(尾部)。
lindex:通过索引获取列表中的元素。索引从 0 开始,负索引表示从列表末尾开始计数(-1 表示最后一个元素)。
rindex
llen:返回列表的长度。
lrem:从列表中移除前 count 个值等于 value 的元素。count 的值可以是正数、负数或零:
ltrim:对列表进行修剪,只保留指定范围内的元素,删除其余的元素。start 和 stop 是索引。
linsert before/after:在列表中指定元素的前面或后面插入一个新元素。如果指定的元素不存在,则不进行任何操作。
del:删除指定的键及其关联的值。

Redis持久性

AOF和RDB

AOF会把每个写操作都写入日志中,Redis重启时,可以通过重新执行日志文件中的写操作来恢复数据。
RDB通过将某个时间点的快照存储起来,Redis重启时,可以通过快照文件来实现数据的恢复。
相比之下,AOF在数据一致性上优于RDB,但是RDB在恢复速度、占用磁盘空间、性能方面都优于AOF。

如何使用AOF和RDB,纯缓存模式

对于持久性的关闭,我们都可以通过修改配置文件的方法来实现。
在将两种持久化都关闭的情况下,我们仍然可以使用命令的方法,来让两种方法对redis的数据进行保存。

Redis事务

Redis事务是不保证原子性的。
但是Redis可以将事务中的操作全部抛弃。
Redis的事务规则是,如果事务中有报错则全部不执行,如果事务中没有报错就全部执行,但是错误的操作不会阻碍后续操作的执行。
同时,Redis还提供了watch的操作,可以监控某个key,使得key在watch期间不能被修改。

Redis管道

是为了解决每次操作都需要经历往返的RTT所造成的性能消耗问题。
管道就是一次性执行多条命令的操作,redis只需要进行一次回复。

Redis订阅发布

订阅一个channel,同一个channel可以有多个订阅者。
channel发布信息的时候所有的订阅者都可以收到消息,但是由于channel只负责发送消息,也不管消息是否安全到达,也不会保存发送的消息,所以基本没什么应用场景。

Redis主从复制

redis的主从复制是master以写为主,slave以读为主,当master数据发生改变的时候,自动将新的数据异步同步到其他slave。

Redis哨兵

功能
主从监控:监控主从redis库运行是否正常
消息通知:哨兵可以将故障转移的结果发送给客户端
故障转移:如果master异常,则会进行主从切换。将其中一个slave作为新的master
配置中心:客户端通过连接哨兵来获取当前redis服务的主节点地址

哨兵监听
哨兵的配置来说,建议配置奇数个的三个以上的哨兵节点,所有哨兵节点都去监听master。当主节点故障之后,哨兵节点进行投票选举新的master,票数多的slave当选新的master。

选举规则
一般来说选举通过偏移量决定,即选取同步了新操作越多的slave被选取。

选举后的操作
选举结束后,哨兵会自动的修改配置文件,将异常的master降级为slave。

Redis集群

集群是支持多个master的场景的,同时集群有自适应的哨兵设计,所以不需要自己设计哨兵了。
集群的设计,开启多个redis实例,通过命令构建集群中的关系,设置主从关系。

槽位slot
redis设计16384个槽位,通过CRC16算法进行一致性哈希。

为什么是16384个槽位
选择16384个槽位,而不是更多的槽位,主要原因是
① 16384个槽位基本可以所有场景下的需求,这个数量的槽位可以满足1000个redis节点进行分配。作者认为一般不会超过1000个redis节点,如果超过1000个redis节点,会导致网络过于拥堵,网络也会难以管理。
② 如果选择65536个槽位,每一次心跳包的消息头大小到达8KB的大小,发送的心跳包就太大了。
③ 同时也是为了适应CRC16算法。

CRC16算法
这个算法是为了解决分布式缓存数据变动和映射问题而提出的。
CRC16希算法具有很好的容错性和拓展性。
但是CRC16算法可能会出现数据倾斜的问题(即当redis节点较少的时候,数据会跟多的堆积到某一台服务器上)


Redis高级

Redis的多线程

Redis的多线程是对于网络I/O请求进行多线程的操作,但是Redis主线程仍然采用单线程的方式。

好处
对Redis主线程采用单线程的方式,可以避免多线程情况下需要加锁保证线程安全而导致模型实现复杂的问题。

为什么Redis单线程仍然这么快

基于内存的操作
数据结构简单
多路复用和非阻塞的I/O
避免了上下文切换:单线程模型可以避免上下文切换和多线程的竞争问题,而且单线程不会出现死锁的情况。

BigKey问题

当key大于10KB就算作BigKey,String最大为512MB

危害
内存不均、集群迁移困难
超时删除
网络流量阻塞

如何删除BigKey
一般采用渐进式的方法删除

缓存双写一致性

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

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

相关文章

HTML下雪/烟花

文章目录 一、雪花二、烟花 一、雪花 <div id"snow"></div>body {margin: 0;background: #333; } body #snow {height: 100vh;overflow: hidden;position: relative;/*** Defaults**/--size: 1;--fallDuration: 10s;--swayDuration: 0.8s;--fallSlideSt…

复盘最近的面试

这个礼拜一直在面试&#xff0c;想着看看能否拿到不错的offer前去实习&#xff0c;从周一到周四&#xff0c;面了将近10家&#xff0c;特整理此份面经&#xff0c;希望对秋招的各位有所帮助 A公司 一面 面试官人很好&#xff0c;我回答的时候不会他会笑笑然后提醒我 自我介绍~…

数据通信与网络(三)

物理层概述&#xff1a; 物理层是网络体系结构中的最低层 它既不是指连接计算机的具体物理设备&#xff0c;也不是指负责信号传输的具体物理介质&#xff0c; 而是指在连接开放系统的物理媒体上为上一层(指数据链路层)提供传送比特流的一个物理连接。 物理层的主要功能——为…

项目中eventbus和rabbitmq配置后,不起作用

如下&#xff1a;配置了baseService层和SupplyDemand层得RabbitMQ和EventBus 但是在执行订阅事件时&#xff0c;发送得消息在base项目中没有执行&#xff0c;后来发现是虚拟机使用得不是一个&#xff0c;即上图中得EventBus下得VirtualHost&#xff0c;修改成一直就可以了

肆拾玖坊三级众筹模式玩法揭秘,白酒体验馆运作模式

发展至今&#xff0c;肆拾玖坊已积累了数百万忠实用户&#xff0c;拥有100多家分销商、5000多个新零售终端&#xff0c;覆盖全国34个省级行政区域、200余地市、1500个县区。成为中国创业界和酒行业的“现象级”企业。 今天&#xff0c;我们就来深入解析肆拾玖坊的营销模式&…

【FFmpeg】AVIOContext结构体

【FFmpeg】AVIOContext结构体 1.AVIOContext结构体的定义 参考&#xff1a; FFMPEG结构体分析&#xff1a;AVIOContext 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FFmpeg】调用ffmpeg库实现264软解 【FFmpeg】调用ffmpeg库进行RTMP推流和拉流 【FFmpeg】调用…

Linux入门攻坚——26、Web Service基础知识与httpd配置-2

http协议 URL&#xff1a;Uniform Resource Locator&#xff0c;统一资源定位符 URL方案&#xff1a;scheme&#xff0c;如http://&#xff0c;https:// 服务器地址&#xff1a;IP&#xff1a;port 资源路径&#xff1a; 示例&#xff1a;http://www.test.com:80/bbs/…

使用cv2对视频指定区域进行去噪

视频去噪其实和图象一样&#xff0c;只是需要现将视频截成图片&#xff0c;在对图片进行去噪&#xff0c;将去噪的图片在合成视频就行。可以利用cv2.imread()、imwrite()等轻松实现。 去噪步骤 1、视频逐帧读成图片 2、图片指定区域批量去噪 2、去噪后的图片写入视频 1、视频逐…

ios18计算器大更新使用指南,一招掌握新计算器使用技巧!

苹果推出iOS 18系统中&#xff0c;变化较大的之一就是以多年没有更新的计算器应用程序&#xff0c;新增了多个使用的功能&#xff0c;经过小编几天的使用&#xff0c;总结了几个iOS 18计算器的使用技巧和更新点分享给大家。 一、界面布局变化 与iOS 17相比&#xff0c;iOS18的…

写一个chrome插件,统一修改所有http请求的header头,包括ajax请求

要创建一个可以灵活修改HTTP请求头的Chrome扩展&#xff0c;包括一个用户界面来动态设置头部名称和值&#xff0c;可以按照以下步骤进行。我们会用到 chrome.storage API 来保存用户的设置&#xff0c;并在后台脚本中使用这些设置来修改请求头。 文件结构 my_chrome_extensio…

Java学习笔记(二)变量原理、常用编码、类型转换

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java变量原理、常用编码、类型转换详细使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 1、变量原理 1.1、变量的介绍 变量是程…

生成式AI时代,数据存储管理与成本如何不失控?

无数据&#xff0c;不AI。 由生成式AI掀起的这一次人工智能浪潮&#xff0c;对企业的产品、服务乃至商业模式都有着颠覆性的影响。因此&#xff0c;在多云、大数据、生成式AI等多元技术的驱动下&#xff0c;数据要素变得愈发重要的同时&#xff0c;企业对于数据存储的需求也在…

【Android14 ShellTransitions】(六)SyncGroup完成

这一节的内容在WMCore中&#xff0c;回想我们的场景&#xff0c;是在Launcher启动某一个App&#xff0c;那么参与动画的就是该App对应Task&#xff08;OPEN&#xff09;&#xff0c;以及Launcher App对应的Task&#xff08;TO_BACK&#xff09;。在确定了动画的参与者后&#x…

JVS开源底座与核心引擎的全方位探索,助力IT智能、高效、便捷的进化

引言 JVS产品的诞生背景 JVS是软开企服构建的一站式数字化的解决方案&#xff0c;产生的背景主要来源于如下几个方面&#xff1a; 企业数字化需求的增长&#xff1a;企业对IT建设的依赖程度越来越高&#xff0c;数字化、指标化的经营已经是很多企业的生存的基础和前提&#…

postman 工具下载安装使用教程_postman安装

本文讲解的是postman工具下载、Postman安装步骤、postman下载、postman安装教程。Postman是一款流行的API测试工具&#xff0c;它提供了一个用户友好的界面&#xff0c;用于发送和测试API请求&#xff0c;并且可以轻松地按需管理和组织请求。 这使得开发人员和测试人员能够更高…

CARIS HIPS and SIPSv12 是专业的多波束水深数据和声呐图像处理软件

CARIS HIPS and SIPS是专业的多波束水深数据和声呐图像处理软件。CARIS HIPS and SIPS适用于海洋应用需求。其可靠性和可用性对多波束水深数据处理和声呐图像都是很重要的。CARIS HIPS用于处理多波束水深数据&#xff0c;CARIS SIPS用于处理侧扫声呐图像和多波束背向散射回波数…

Result类忘记添加@Data注解导致406错误

在 Java 开发中&#xff0c;Data 注解本身与 HTTP 406 状态码的关系并不直接。HTTP 406 状态码表示 “Not Acceptable”&#xff0c;意味着服务器无法生成客户端可接受的响应。一般来说&#xff0c;这是由于客户端请求的格式&#xff08;例如 JSON 或 XML&#xff09;与服务器返…

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…

美国vps上面怎么部署网站或者应用程序?

美国的VPS提供了强大的计算资源和灵活的配置选项&#xff0c;是许多网站和应用程序的理想托管平台。通过正确的部署流程&#xff0c;用户可以充分利用这些资源&#xff0c;并确保其网站或应用程序的高性能和稳定性。 选择合适的VPS配置&#xff1a; 在部署网站或应用程序之前&a…

【扫雷游戏】C语言实现

机器学习&#xff1a;Transformer框架理论详解和代码实现>Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属…