分类归档

服务器教程

服务器知识、操作系统教程、服务器常用软件等

FWQ
服务器教程
SpringBoot AOP Redis如何实现延时双删功能
SpringBoot AOP Redis如何实现延时双删功能 0浏览 收藏 小伙伴们对数据库编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《SpringBoot AOP Redis如何实现延时双删功能》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助! 一、业务场景 在多线程并发情况下,假设有两个数据库修改请求,为保证数据库与redis的数据一致性,修改请求的实现中需要修改数据库后,级联修改Redis中的数据。请求一:A修改数据库数据 B修改Redis数据请求二:C修改数据库数据 D修改Redis数据并发情况下就会存在A —> C —> D —> B的情况(一定要理解线程并发执行多组原子操作执行顺序是可能存在交叉现象的) 1、此时存在的问题 A修改数据库的数据最终保存到了Redis中,C在A之后也修改了数据库数据。 此时出现了Redis中数据和数据库数据不一致的情况,在后面的查询过程中就会长时间去先查Redis,从而出现查询到的数据并不是数据库中的真实数据的严重问题。 2、解决方案 在使用Redis时,需要保持Redis和数据库数据的一致性,最流行的解决方案之一就是延时双删策略。注意:要知道经常修改的数据表不适合使用Redis,因为双删策略执行的结果是把Redis中保存的那条数据删除了,以后的查询就都会去查询数据库。所以Redis使用的是读远远大于改的数据缓存。延时双删方案执行步骤 1> 删除缓存2> 更新数据库3> 延时500毫秒 (根据具体业务设置延时执行的时间)4> 删除缓存 3、为何要延时500毫秒? 这是为了我们在第二次删除Redis之前能完成数据库的更新操作。假象一下,如果没有第三步操作时,有很大概率,在两次删除Redis操作执行完毕之后,数据库的数据还没有更新,此时若有请求访问数据,便会出现我们一开始提到的那个问题。 4、为何要两次删除缓存?…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis处理高并发之布隆过滤器详解
Redis处理高并发之布隆过滤器详解 0浏览 收藏 本篇文章给大家分享《Redis处理高并发之布隆过滤器详解》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 缓存穿透、击穿、雪崩 首先我们从缓存会出现的几种问题,来进行分析,在高并发的场景下如果出现这种情况,我们应该如何解决。 正常情况下,我们的web应用会先去请求缓存服务,如果缓存命中,那么就去拿缓存里面的数据,返回结果给应用, 缓存穿透 缓存穿透与缓存雪崩和缓存击穿还是不一样的,雪崩和击穿的情况下,数据库的数据都是真正常的,可以去请求数据库获取数据,只是缓存层出现问题,等待缓存恢复了,就会减轻数据库的压力。 而缓存透不一样的就是,缓存和数据库都没有要请求的数据,大量的请求来了,数据库的压力很大。 出现情况 数据库数据被大量清除,导致访问不到 黑客恶意攻击 常见的解决方案 redis缓存空值,请求不到的时候返回给应用空值。 使用布隆过滤器,把数据库的一部分数据hash到布隆过滤器里,在请求数据库之前先去布隆过滤器里筛选到一部分请求,判断数据是否存在,避免直接去访问数据库。 缓存击穿 出现情况 大量热点数据库过期,导致无法从缓存获取到数据,大量请求数据库也无法返回书就 解决方案 加锁,保证同一时间内,只允许有一个线程去更新缓存,等锁释放后在重新去请求缓存。 热点数据不去设置过期时间,如果要设置过期时间,在过期的时候通知后台去更新缓存的过期时间。 缓存雪崩 大量缓存在同一时间失效,导致大量请求进入数据库 redis故障宕机,导致缓存不能使用。 解决方案 同上加锁…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis中SDS简单动态字符串问题怎么解决
Redis中SDS简单动态字符串问题怎么解决 0浏览 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis中SDS简单动态字符串问题怎么解决》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 一、SDS的结构  c语言没有string类型,本质是char[]数组;而且c语言数组创建时必须初始化大小,指定类型后就不能改变,并且字符数组的最后一个元素总是空字符 ‘\0’ 。 以下展示了一个值为 “Redis” 的 C 字符串: Redis没有直接使用C语言的字符串方式,而是构建了一种简单动态字符串(Simple dynamic string, SDS)的类型,Redis中的字符串底层都是使用SDS结构进行存储,比如包含字符串的键值对底层都是使用SDS结构实现的。 SDS结构定义在sds.h中 struct sdshdr{     int len;//SDS保存的字符串长度     int free;//buf数组中未使用字节数量     char buf[];//字符数组,保存字符串 } 最后一个字节保存了空字符’\0’,保留了C字符串的规范,使得SDS结构的字符串,可以重用一部分C函数库的函数。 二、为什么不使用C字符串 主要是因为C字符串有以下缺点: 获取字符串长度时间复杂度为O(N):C字符串获取长度需遍历整个字符串,遇到’\0’空字符为止。如果未分配足够的内存,在进行字符串追加操作时可能会导致缓冲区溢出。 内存重分配:每次增长或者截短字符串,程序都要对保存C字符串的数组进行内存重分配操作,而内存重分配涉及复杂的算法,并可能需要执行系统调用,所以它通常比较耗时。如果C字符串中间保存有空格,程序在遍历时会错误地将其认为是字符串的结尾。C字符串由于这一限制,只能用于存储文本数据,而不能存储二进制数据,例如图片、音视频、压缩文件等。 三、怎样解决C字符串问题    1、SDS通过len属性记录了SDS长度,所以获取长度的时间复杂度为O(1),即strlen命令的时间复杂度是O(1)。 2、SDS空间分配策略避免了缓冲区溢出:当对SDS进行修改时,会先检查SDS空间是否满足修改,不满足会自动扩展到所需大小,然后才执行修改。…
2024-12-01 阅读全文 →
FWQ
服务器教程
redis数据的两种持久化方式对比
redis数据的两种持久化方式对比 0浏览 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《redis数据的两种持久化方式对比》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 一.概念介绍 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Apend Only File)。 RDB方式 RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。 •redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。 •对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。 •如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。 AOF方式 AOF方式是将执行过的写指令记录下来,在数据恢复时按照丛前到后的顺序再将指令执行一遍。 •AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。 •如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。 •因为采用了追加方式,如果不做任何处理的话,AOF文件会变得越来越大,为此,redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。举个例子或许更形象,假如我们调用了100次INCR指令,在AOF文件中就要存储100条指令,但这明显是很低效的,完全可以把这100条指令合并成一条SET指令,这就是重写机制的原理。 •在进行AOF重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响AOF文件的可用性。 二. 两种方式优缺点 1. RDB方式 •优点: 1.RDB是一个单一的紧凑文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集. 2.RDB是一个紧凑的单一文件,方便传送,适用于灾难恢复. 3.RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.…
2024-12-01 阅读全文 →
FWQ
服务器教程
SpringBoot整合Redis的方法
SpringBoot整合Redis的方法 0浏览 收藏 各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《SpringBoot整合Redis的方法》,很明显是关于数据库的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享! 架构 方案 使用 redis 集中存储,实现分布式集群共享用户信息,这里我们采用第三方开源插件crazycake来实现,pom.xml 引入: <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency>     <groupId>org.crazycake</groupId>     <artifactId>shiro-redis</artifactId>     <version>3.2.3</version> </dependency> 配置 application.properties: # Redis # 数据库索引(默认为0) redis.database=0 # 服务器地址 变更为自己的 redis.host=127.0.0.1 # 服务器连接端口 redis.port=6379 # 服务器连接密码,如果不设置密码注释掉即可 # redis.password= # 连接超时时间(毫秒) redis.timeout=30000…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis与PHP的多数据库操作:如何实现数据分区
Redis与PHP的多数据库操作:如何实现数据分区 收藏 编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《Redis与PHP的多数据库操作:如何实现数据分区》,文章讲解的知识点主要包括,如果你对数据库方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。 Redis与PHP的多数据库操作:如何实现数据分区 Redis是一种快速、高性能的键值存储数据库,常用于缓存数据和处理高并发的操作。在实际应用中,我们经常需要处理大量的数据,而单一的Redis数据库可能无法满足我们的需求。因此,使用多个数据库进行数据分区是一种很常见的解决方案。本文将介绍如何通过PHP与Redis进行多数据库操作,以实现数据分区。 一、Redis多数据库简介 Redis支持将数据分布在多个数据库中。默认情况下,Redis创建了16个数据库,编号从0到15。我们可以通过select命令切换数据库,如下所示: $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->select(1); // 切换到数据库1 通过select命令切换数据库后,后续的操作都会在当前选定的数据库中进行。 二、使用哈希函数实现数据分区 在实际应用中,我们可能需要将数据分散存储在多个数据库中,可以使用哈希函数将数据的键进行分区,使其均匀分布在不同的数据库中。 下面是一个简单的示例,演示如何通过哈希函数实现数据分区: function getDatabaseIndex($key, $totalDatabases) { $hash = crc32($key); $databaseIndex…
2024-12-01 阅读全文 →
FWQ
服务器教程
Redis生成全局唯一ID的实现方法
Redis生成全局唯一ID的实现方法 0浏览 收藏 怎么入门数据库编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Redis生成全局唯一ID的实现方法》,涉及到Redis全局唯一ID,有需要的可以收藏一下 简介: 全局唯一ID生成器是一种在分布式系统下用来生成全局唯一ID的工具 特性: 唯一性 高性能 安全性 高可用 递增性 生成规则: 有时为了增加ID的安全性,我们可以不直接使用Redis自增的数值,而是拼接一些其他信息 ID组成部分: 符号位:1bit,永远为0 时间戳:31bit,以秒为单位,可以使用69年 序列号:32bit,秒内的计数器,支持每秒产生2^32个不同ID  ID生成类: package com.example.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import…
2024-12-01 阅读全文 →
FWQ
服务器教程
详解Redis实现限流的三种方式
详解Redis实现限流的三种方式 0浏览 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《详解Redis实现限流的三种方式》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!  面对越来越多的高并发场景,限流显示的尤为重要。       当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式。Redis不仅仅是可以做限流,还可以做数据统计,附近的人等功能,这些可能会后续写到。 第一种:基于Redis的setnx的操作       我们在使用Redis的分布式锁的时候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的时候,同时给指定的key设置了过期实践(expire),我们在限流的主要目的就是为了在单位时间内,有且仅有N数量的请求能够访问我的代码程序。所以依靠setnx可以很轻松的做到这方面的功能。      比如我们需要在10秒内限定20个请求,那么我们在setnx的时候可以设置过期时间10,当请求的setnx数量达到20时候即达到了限流效果。代码比较简单就不做展示了。     具体的setnx用法可以参照我另一篇博客     当然这种做法的弊端是很多的,比如当统计1-10秒的时候,无法统计2-11秒之内,如果需要统计N秒内的M个请求,那么我们的Redis中需要保持N个key等等问题 第二种:基于Redis的数据结构zset      其实限流涉及的最主要的就是滑动窗口,上面也提到1-10怎么变成2-11。其实也就是起始值和末端值都各+1即可。…
2024-12-01 阅读全文 →
FWQ
服务器教程
解决redis服务启动失败的问题
解决redis服务启动失败的问题 0浏览 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《解决redis服务启动失败的问题》,介绍一下失败、Redis启动,希望对大家的知识积累有所帮助,助力实战开发! 最近学redis,就遇到了各种坑,在这里分享一下 我是将redis做成后台 安装,配置环境变量统统省略掉了。 做成后台服务呢,首先,cd到redis的安装目录下,再cd到util,接着执行 ./install_server.sh 然后修改服务名称,将原来的redis_6379更名为redisd,这样下次启动比较方便,命令如下: cd /etc/init.d/ mv redis_6379 redisd 然后,就可以启动redis服务了 service redisd start 启动之后,就可以进入redis的客户端了 redis-cli 到这里,万事大吉了?好像坑并没有结束,第二天,重新打开虚拟机,再次启动redis服务的时候,竟然告诉我启动失败了 3389:C 29 May 09:31:49.331 # Fatal…
2024-12-01 阅读全文 →
FWQ
服务器教程
深入理解Redis内存淘汰策略
深入理解Redis内存淘汰策略 0浏览 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《深入理解Redis内存淘汰策略》,主要介绍了Redis内存淘汰,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了! 一、内存回收 长时间不使用的缓存 降低IO性能 物理内存不够 很多人了解了Redis的好处之后,于是把任何数据都往Redis中放,如果使用不合理很容易导致数据超过Redis的内存,这种情况会出现什么问题呢? Redis中有很多无效的缓存,这些缓存数据会降低数据IO的性能,因为不同的数据类型时间复杂度算法不同,数据越多可能会造成性能下降 随着系统的运行,redis的数据越来越多,会导致物理内存不足。通过使用虚拟内存(VM),将很少访问的数据交换到磁盘上,腾出内存空间的方法来解决物理内存不足的情况。虽然能够解决物理内存不足导致的问题,但是由于这部分数据是存储在磁盘上,如果在高并发场景中,频繁访问虚拟内存空间会严重降低系统性能。 所以遇到这类问题的时候,我们一般有几种方法。 对每个存储到redis中的key设置过期时间,这个根据实际业务场景来决定。否则,再大的内存都会随着系统运行被消耗完 增加内存 使用内存淘汰策略 二、设置内存 在实际生产环境中,服务器不仅仅只有Redis,为了避免Redis内存使用过多对其他程序造成影响,我们一般会设置最大内存。Redis默认的最大内存 maxmemory=0 ,表示不限制Redis内存的使用。我们可以修改 redis.conf 文件,设置Redis最大使用的内存。 # 单位为byte maxmemory 2147483648(2G) 如何查看当前Redis最大内存设置呢,进入到Redis-Cli控制台,输入下面这个命令。 config get…
2024-12-01 阅读全文 →