作者文章

fwq

FWQ
服务器教程
Redis IP地址的绑定的实现
Redis IP地址的绑定的实现 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《Redis IP地址的绑定的实现》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 很多时候我们的redis的IP地址一般都是默认的127.0.0.1代表只能接受本机的访问,因此我们其他机器上想要访问这个redis的时候,就需要去修改ip地址的访问。 第一步:进入到我们的redis配置文件,比如我这里是在/opt/myRedis/redis.conf,使用命令跳转到相应路径下 cd /opt/myRedis/ 第二步:编辑该目录下的redis.conf配置文件 vim redis.conf 第三步:进入到配置文件之后,在查看模式下(也就是在只读的时候,跳转到最后一行,好像是按一个G可以快捷跳转)按下/可以在文本里面查找,在文本末尾输入 /bind 即下图: 然后找到这个内容,并在前面加上#将它注释掉。 即下图 第四步: 找到下图所在的内容,并将protected -mode yes改为no 即下图 然后重启redis服务就可以了。
2025-05-10 阅读全文 →
FWQ
服务器教程
k8s部署redis集群实现过程实例详解
k8s部署redis集群实现过程实例详解 收藏 大家好,我们又见面了啊~本文《k8s部署redis集群实现过程实例详解》的内容中将会涉及到k8sredis、集群部署等等。如果你正在学习数据库相关知识,欢迎关注我,以后会给大家带来更多数据库相关文章,希望我们能一起进步!下面就开始本文的正式内容~ 写在前面 一般来说,REDIS部署有三种模式。 单实例模式,一般用于测试环境。 哨兵模式 集群模式 后两者用于生产部署 哨兵模式 在redis3.0以前,要实现集群一般是借助哨兵sentinel工具来监控master节点的状态。 如果master节点异常,则会做主从切换,将某一台slave作为master。 引入了哨兵节点,部署更复杂,维护成本也比较高,并且性能和高可用性等各方面表现一般。 集群模式 3.0 后推出的 Redis 分布式集群解决方案 主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用 如果master节点异常,也是会自动做主从切换,将slave切换为master。 总的来说,集群模式明显优于哨兵模式 那么今天我们就来讲解下:k8s环境下,如何部署redis集群(三主三从)? 前置准备 一、nfs安装 nfs # 服务端 #…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis key-value乱码的解决
Redis key-value乱码的解决 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《Redis key-value乱码的解决》,介绍一下乱码、Rediskey-value,希望对大家的知识积累有所帮助,助力实战开发! redis 配置类 import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringBootConfiguration; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import…
2025-05-10 阅读全文 →
FWQ
服务器教程
从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路
从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《从单点 Redis 到 1 主 2 从 3 哨兵的架构演进之路》,介绍一下服务器、Redis、架构,希望对大家的知识积累有所帮助,助力实战开发! ​一、前言 我们有个项目中用的 MySQL、Redis、ES、微服务都是单节点部署的,没有做集群模式部署,为了提高整体的可用性,对项目的部署架构进行了升级,支持高可用。 通过本篇,你可以学到以下内容: Redis真实的多服务器部署实战 Redis真实的主从模式部署实战。 Redis真实的哨兵集群模式部署实战。 Redis 主节点宕机后,Redis…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis与C#的异步操作:如何提高并发性能
Redis与C#的异步操作:如何提高并发性能 “纵有疾风来,人生不言弃”,这句话送给正在学习数据库的朋友们,也希望在阅读本文《Redis与C#的异步操作:如何提高并发性能》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新数据库相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢! Redis与C#的异步操作:如何提高并发性能 在现代互联网应用中,高并发性能是至关重要的。为了提升应用的性能和响应速度,我们需要采取一些措施来优化应用程序的编码和架构。其中一个关键的优化点就是通过使用异步操作来提高并发性能。在本文中,我们将探讨在C#中如何利用Redis进行异步操作,以提高应用程序的并发性能。 首先,我们需要了解一下Redis和异步操作的概念。 Redis是一个开源的内存数据库,它通过键值对的方式存储数据,并提供了丰富的数据结构和高效的读写操作。它被广泛应用于缓存、队列和分布式锁等场景,以提升应用程序的性能和可靠性。 异步操作是一种非阻塞的编程模式,它允许我们同时执行多个操作而不会阻塞主线程。在C#中,我们可以使用async和await关键字来实现异步操作。通过异步操作,我们可以更好地利用系统资源,提高系统的并发性能。 下面是一个使用Redis进行异步操作的示例代码: using StackExchange.Redis; using System; using System.Threading.Tasks; public class RedisService { private readonly ConnectionMultiplexer _redis; public RedisService(string connectionString) { _redis =…
2025-05-10 阅读全文 →
FWQ
服务器教程
一文详解 Redis 中 BigKey、HotKey 的发现与处理
一文详解 Redis 中 BigKey、HotKey 的发现与处理 收藏 对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《一文详解 Redis 中 BigKey、HotKey 的发现与处理》,主要介绍了Redis、数据库、BigKey、HotKey、阿里云,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!   一 前言 在Redis的使用过程中,我们经常会遇到BigKey(下文将其称为“大key”)及HotKey(下文将其称为“热key”)。大Key与热Key如果未能及时发现并进行处理,很可能会使服务性能下降、用户体验变差,甚至引发大面积故障。 二 大Key与热Key的定义 我们经常能够在公司内部的Redis开发使用规范手册,或网络中大量的Redis最佳实践文章里看到有关大Key、热Key的定义,然而这些资料中的大Key热Key判定标准却不尽相同,但可以明确的是,它们的判定维度是一致的:大Key通常都会以数据大小与成员数量来判定,而热Key则以其接收到的请求频率、数量来判定。 1 什么是大Key 通常我们会将含有较大数据或含有大量成员、列表数的Key称之为大Key,下面我们将用几个实际的例子对大Key的特征进行描述: 一个STRING类型的Key,它的值为5MB(数据过大) 一个LIST类型的Key,它的列表数量为20000个(列表数量过多) 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多) 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大) 需要注意的是,在以上的例子中,为了方便理解,我们对大Key的数据、成员、列表数给出了具体的数字。为了避免误导,在实际业务中,大Key的判定仍然需要根据Redis的实际使用场景、业务场景来进行综合判断。 2 什么是热Key…
2025-05-10 阅读全文 →
FWQ
服务器教程
基于Redis实现分布式锁的方法(lua脚本版)
基于Redis实现分布式锁的方法(lua脚本版) 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《基于Redis实现分布式锁的方法(lua脚本版)》,聊聊分布式锁、Redislua脚本,我们一起来看看吧! 1、前言 在Java中,我们通过锁来避免由于竞争而造成的数据不一致问题。通常我们使用synchronized 、Lock来实现。但是Java中的锁只能保证在同一个JVM进程内中可用,在跨JVM进程,例如分布式系统上则不可靠了。 2、分布式锁 分布式锁,是一种思想,它的实现方式有很多,如基于数据库实现、基于缓存(Redis等)实现、基于Zookeeper实现等等。为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件 互斥性:在任意时刻,只有一个客户端能持有锁。 不会发生死锁:即使客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性:只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人:加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。  3、基于Redis实现分布式锁 以下代码实现了基于redis中间件的分布式锁。加锁的过程中为了保障setnx(设置KEY)和expire(设置超时时间)尽可能在一个事务中,使用到了lua脚本的方式,将需要完成的指令一并提交到redis中; 3.1、RedisConfig.java package com.demo.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import…
2025-05-10 阅读全文 →
FWQ
服务器教程
聊一聊Redis与MySQL双写一致性如何保证
聊一聊Redis与MySQL双写一致性如何保证 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《聊一聊Redis与MySQL双写一致性如何保证》,介绍一下RedisMySQL、双写一致性,希望对大家的知识积累有所帮助,助力实战开发! 1 什么是一致性? 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。 强一致性: 这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验性好,但实现起来往往对系统的性能影响大; 弱一致性: 这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入的值,也不承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间级别(比如秒级别)后,数据能够达到一致状态; 最终一致性: 最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。这里之所以将最终一致性单独提出来,是因为它是弱一致性中非常推崇的一种一致性模型,也是业界在大型分布式系统的数据一致性上比较推崇的模型;  2 三个经典的缓存模式 缓存可以提升性能、缓解数据库压力,但是使用缓存也会导致数据不一致性的问题。一般我们是如何使用缓存呢?有三种经典的缓存使用模式: Cache-Aside Pattern; Read-Through / Write-Through Write-behind (1) Cache-Aside Cache-Aside Pattern, 即旁路缓存模式。它的提出是为了尽可能地解决缓存与数据库的数据不一致问题。 a. Cache-Aside读流程…
2025-05-10 阅读全文 →
FWQ
服务器教程
如何使用Redis解决缓存不一致问题?
如何使用Redis解决缓存不一致问题? 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《如何使用Redis解决缓存不一致问题?》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 缓存和数据库的数据不一致是如何发生的? 首先,我们得清楚“数据的一致性”具体是啥意思。其实,这里的“一致性”包含了两种情况: 缓存中有数据,那么,缓存的数据值需要和数据库中的值相同; 缓存中本身没有数据,那么,数据库中的值必须是最新值。 不符合这两种情况的,就属于缓存和数据库的数据不一致问题了。不过,当缓存的读写模式不同时,缓存数据不一致的发生情况不一样,我们的应对方法也会有所不同,所以,我们先按照缓存读写模式,来分别了解下不同模式下的缓存不一致情况。我们可以把缓存分成读写缓存和只读缓存。 对于读写缓存来说,如果要对数据进行增删改,就需要在缓存中进行,同时还要根据采取的写回策略,决定是否同步写回到数据库中。 同步直写策略:写缓存时,也同步写数据库,缓存和数据库中的数据一致; 异步写回策略:写缓存时不同步写数据库,等到数据从缓存中淘汰时,再写回数据库。使用这种策略时,如果数据还没有写回数据库,缓存就发生了故障,那么,此时,数据库就没有最新的数据了。 所以,对于读写缓存来说,要想保证缓存和数据库中的数据一致,就要采用同步直写策略。不过,需要注意的是,如果采用这种策略,就需要同时更新缓存和数据库。所以,我们要在业务应用中使用事务机制,来保证缓存和数据库的更新具有原子性,也就是说,两者要不一起更新,要不都不更新,返回错误信息,进行重试。否则,我们就无法实现同步直写。 当然,在有些场景下,我们对数据一致性的要求可能不是那么高,比如说缓存的是电商商品的非关键属性或者短视频的创建或修改时间等,那么,我们可以使用异步写回策略。 下面我们再来说说只读缓存。对于只读缓存来说,如果有数据新增,会直接写入数据库;而有数据删改时,就需要把只读缓存中的数据标记为无效。这样一来,应用后续再访问这些增删改的数据时,因为缓存中没有相应的数据,就会发生缓存缺失。此时,应用再从数据库中把数据读入缓存,这样后续再访问数据时,就能够直接从缓存中读取了。 接下来,以 Tomcat 向 MySQL 中写入和删改数据为例,来给你解释一下,数据的增删改操作具体是如何进行的,如下图所示: 从图中可以看到,Tomcat 上运行的应用,无论是新增(Insert 操作)、修改(Update 操作)、还是删除(Delete 操作)数据 X,都会直接在数据库中增改删。当然,如果应用执行的是修改或删除操作,还会删除缓存的数据 X。 那么,这个过程中会不会出现数据不一致的情况呢?考虑到新增数据和删改数据的情况不一样,所以我们分开来看。 新增数据…
2025-05-10 阅读全文 →
FWQ
服务器教程
使用AOP+redis+lua做方法限流的实现
使用AOP+redis+lua做方法限流的实现 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《使用AOP+redis+lua做方法限流的实现》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 需求 公司里使用OneByOne的方式删除数据,为了防止一段时间内删除数据过多,让我这边做一个接口限流,超过一定阈值后报异常,终止删除操作。 实现方式 创建自定义注解 @limit 让使用者在需要的地方配置 count(一定时间内最多访问次数)、 period(给定的时间范围),也就是访问频率。然后通过LimitInterceptor拦截方法的请求, 通过 redis+lua 脚本的方式,控制访问频率。 源码 Limit 注解 用于配置方法的访问频率count、period import javax.validation.constraints.Min; import java.lang.annotation.*; @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public…
2025-05-10 阅读全文 →