作者文章

fwq

FWQ
服务器教程
Redis的这些事你知道吗?
Redis的这些事你知道吗? 收藏 最近发现不少小伙伴都对数据库很感兴趣,所以今天继续给大家介绍数据库相关的知识,本文《Redis的这些事你知道吗?》主要内容涉及到Redis、数据库、key-value等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~ 引子 Redis  是一个高性能分布式的key-value数据库。它支持多种数据结构,并可应用于缓存、队列等多种场景下。使用过Redis的小伙伴们可能对这些已经非常熟知了,下面我想来谈谈Redis也许并不被每个人了解的那点事。 Redis持久化机制 刚看到标题你可能会说,我知道,不就是RDB和AOF嘛。这些已经是老生常谈了。那么我们今天就深入谈谈这两种持久化方式的逻辑和原理。 RDB的原理 在Redis中RDB持久化的触发分为两种:自己手动触发与Redis定时触发。 针对RDB方式的持久化,手动触发可以使用: (1)save:会阻塞当前Redis服务器,直到持久化完成,线上应该禁止使用。 (2)bgsave:该触发方式会fork一个子进程,由子进程负责持久化过程,因此阻塞只会发生在fork子进程的时候。 而自动触发的场景如下: 根据我们的 save m n 配置规则自动触发; 从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave; 执行 debug  reload 时处罚; 执行 shutdown时,如果没有开启aof,也会触发。 由于…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis延迟队列和分布式延迟队列的简答实现
Redis延迟队列和分布式延迟队列的简答实现 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《Redis延迟队列和分布式延迟队列的简答实现》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!         最近,又重新学习了下Redis,Redis不仅能快还能慢,简直利器,今天就为大家介绍一下Redis延迟队列和分布式延迟队列的简单实现。   在我们的工作中,很多地方使用延迟队列,比如订单到期没有付款取消订单,制订一个提醒的任务等都需要延迟队列,那么我们需要实现延迟队列。我们本文的梗概如下,同学们可以选择性阅读。 1. 实现一个简单的延迟队列。   我们知道目前JAVA可以有DelayedQueue,我们首先开一个DelayQueue的结构类图。DelayQueue实现了Delay、BlockingQueue接口。也就是DelayQueue是一种阻塞队列。   我们在看一下Delay的类图。Delayed接口也实现了Comparable接口,也就是我们使用Delayed的时候需要实现CompareTo方法。因为队列中的数据需要排一下先后,根据我们自己的实现。Delayed接口里边有一个方法就是getDelay方法,用于获取延迟时间,判断是否时间已经到了延迟的时间,如果到了延迟的时间就可以从队列里边获取了。   我们创建一个Message类,实现了Delayed接口,我们主要把getDelay和compareTo进行实现。在Message的构造方法的地方传入延迟的时间,单位是毫秒,计算好触发时间fireTime。同时按照延迟时间的升序进行排序。我重写了里边的toString方法,用于将Message按照我写的方法进行输出。 package com.hqs.delayQueue.bean; import java.util.concurrent.BlockingQueue; import java.util.concurrent.DelayQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; /** * @author huangqingshi * @Date 2020-04-18…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis实现高并发计数器
Redis实现高并发计数器 收藏 亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《Redis实现高并发计数器》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下Redis计数器,希望所有认真读完的童鞋们,都有实质性的提高。 业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制调用次数为例: /** * 是否拒绝服务 * @return */ private boolean denialOfService(String userId){ long count=JedisUtil.setIncr(DateUtil.getDate()+"&"+userId+"&"+"queryCarViolation", 86400); if(count /** * 查询违章 * @param plateNumber车牌 * @param vin 车架号…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis主从同步配置的方法步骤(图文)
Redis主从同步配置的方法步骤(图文) 收藏 本篇文章给大家分享《Redis主从同步配置的方法步骤(图文)》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 一丶主从概念  一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1 通过主从配置可以实现读写分离 master和slave都是一个redis实例(redis服务)  二丶主从配置 说明:搭建redis主服务和从服务可以在同一台电脑上搭建,也可以在不同电脑上搭建,博主这里使用一台电脑进行搭建 1.配置主 step1 查看电脑中的ip地址 step2 编辑redis配置文件sudo vi /etc/redis/redis.conf,绑定本机IP地址,不要写127.0.0.1 step3 重启redis服务,查看redis服务,出现配置的IP地址以及默认端口号6379 2.配置从 step1 复制etc/redis/redis.conf文件命名为slave.conf,用作于从服务配置文件,该配置文件名字随便起 step2 编辑slave.conf配置文件sudo vi slave.conf,需要配置三个地方,分别是绑定ip和端口号以及主从复制(类似于双机备份),因为博主这里使用的是同一台电脑,所以ip不用动,端口号不能与主服务的端口号一致博主这里改的6378,slaveof 配置主服务的ip(也就是本地ip)端口号为6379…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis分布式锁之红锁的实现
Redis分布式锁之红锁的实现 收藏 本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Redis分布式锁之红锁的实现》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~ 一、问题 分布式锁,当我们请求一个分布式锁的时候,成功了,但是这时候slave还没有复制我们的锁,masterDown了,我们的应用继续请求锁的时候,会从继任了master的原slave上申请,也会成功。 这就会导致,同一个锁被获取了不止一次。 二、办法 Redis中针对此种情况,引入了的概念。 三、原理 用Redis中的多个master实例,来获取锁,只有大多数实例获取到了锁,才算是获取成功。具体的红锁算法分为以下五步: 获取当前的时间(单位是毫秒)。 使用相同的key和随机值在N个节点上请求锁。这里获取锁的尝试时间要远远小于锁的超时时间,防止某个masterDown了,我们还在不断的获取锁,而被阻塞过长的时间。 只有在大多数节点上获取到了锁,而且总的获取时间小于锁的超时时间的情况下,认为锁获取成功了。 如果锁获取成功了,锁的超时时间就是最初的锁超时时间进去获取锁的总耗时时间。 如果锁获取失败了,不管是因为获取成功的节点的数目没有过半,还是因为获取锁的耗时超过了锁的释放时间,都会将已经设置了key的master上的key删除。 四、实战 Redission就实现了红锁算法,使用的步骤如下: 1、引入maven org.redisson redisson 3.9.0 2、引入代码 Config config1 = new Config(); config1.useSingleServer().setAddress("redis://172.0.0.1:5378").setPassword("a123456").setDatabase(0);…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis分布式锁详细介绍
Redis分布式锁详细介绍 收藏 IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Redis分布式锁详细介绍》,聊聊Redis分布式锁,我们一起来看看吧! 分布式锁 在单进程应用中,当一段代码同一时间内只能由一个线程执行时, 多线程下可能会出错,例如两个线程同时对一个数字做累加,两个线程同时拿到了该数字,例如40,一个线程加了10,一个线程加了20,正确结果应该是70, 但由于两个线程在自己的内存中一个算出的是50,一个算出的是60,此时二者都将自己的结果往该数字原本的地方写(保存), 这时候,肯定会有一个线程的值会被覆盖,因为读取->计算->保存 并不是原子操作(原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就会一直运行结束,中间不会有任何线程切换), 也就是说最终的结果要么是50,要么是60,而不可能是70(出现并发或并行的情况下,这种情况大概率会发生), 单进程应用发生这种情况时,可以由程序提供的锁语义直接上锁(例如java中的sychornized)保证该段代码只会被一个线程执行,按照顺序来进行,结果将是正确的。 在分布式应用中,由于一台机器上可能跑着相同的应用进程,或者在不同的机器上跑着,原本程序自带的语义锁已经无法起到作用, 因为相同的代码可能是在不同的机器、进程中执行,所以此时需要一个能够让不同机器、进程中,相同的应用代码执行到同一段代码时,也能够按照顺序执行(或者同一时间内只有一个线程能够执行), 这就需要用到中间件来协调,可以实现分布式锁的中间件有很多,redis就是其中一个。 redis实现分布式锁的原理 redis中分布式锁的原理其实就是在redis当中设置一个值(当然要保证分布式应用连的都是同一个redis,以这个redis作为中间点,否则当然是没用的),这个值只能由一个线程来存放,当其他线程(或者不同机器上的进程)也来存放时,发现这个值已经存在了,就说明此时已经有人在用这把锁了,这时候要么进行重试等待,要么进行放弃。 设置一般使用 SETNX (set if not exists) 指令,如果该值没有,则进行设置,有了则不设置,这就是拿锁的关键了,当拿到锁的人执行处理完毕后,再调用 DEL 执行进行锁的释放。 死锁问题 使用 SETNX…
2025-05-10 阅读全文 →
FWQ
服务器教程
Redis数据结构之链表详解
Redis数据结构之链表详解 收藏 本篇文章向大家介绍《Redis数据结构之链表详解》,主要包括redis链表,具有一定的参考价值,需要的朋友可以参考一下。 1 链表和链表节点的结构 1.1 节点结构 节点的结构大概长下边这个样子: 那么,把这些节点就连起来就成了这个样子: 1.2 链表结构 链表自然除了要把这些节点连起来,还得保存一些其他的信息,不然也太简单了,对吧。那么链表的结构大概长下边这个样子: head:指向链表的表头的指针tail:指向链表的表尾的指针len:记录链表的长度dup:函数用于复制链表节点所保存的值free:函数用于释放链表节点所保存的值match:函数则用于对比链表节点所保存的值和另一个输入值是否相等 结构都介绍完了,我们看个整体图吧: 注意: 链表可以保存各种不同类型的值哦! 2 链表相关的API 好了,完事了介绍完了~
2025-05-10 阅读全文 →
FWQ
服务器教程
面试分析分布式架构Redis热点key大Value解决方案
面试分析分布式架构Redis热点key大Value解决方案 收藏 本篇文章给大家分享《面试分析分布式架构Redis热点key大Value解决方案》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。 引言 关于 Redis 热点数据 & 大 key 大 value 问题也是容易被问的高阶问题,不如一次痛快点说完,让面试官无话可说,个人工作经验中,热点数据问题在工作中相比雪崩更容易遇到,只是大部分时候热点不够热,都会被提前告警解决,但这个问题一旦控制不了造成的线上问题也是足够让你今年绩效垫底了,废话不说进入正题。 正常情况下,Redis 集群中数据都是均匀分配到每个节点,请求也会均匀的分布到每个分片上,但在一些特殊场景中,比如外部爬虫、攻击、热点商品等,最典型的就是明星在微博上宣布离婚,吃瓜群众纷纷涌入留言,导致微博评论功能崩溃,这种短时间内某些 key 访问量过于大,对于这种相同的 key 会请求到同一台数据分片上,导致该分片负载较高成为瓶颈问题,导致雪崩等一系列问题。 1、面试官:你在项目中有没有遇到 Redis 热点数据问题,一般都是什么原因引起的? 问题分析:上次听群里大佬面试阿里 p7 就被问到这个问题,难度指数五颗星,对我等小白着实是加分项。 答:关于热点数据问题我有话要说,这个问题我早在刚刚学习使用 Redis…
2025-05-10 阅读全文 →
FWQ
服务器教程
浅谈Redis存储数据类型及存取值方法
浅谈Redis存储数据类型及存取值方法 收藏 来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《浅谈Redis存储数据类型及存取值方法》,介绍一下数据类型、Redis存储,希望对大家的知识积累有所帮助,助力实战开发! Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) String存取值: 是 redis 最基本的类型 一个 key 对应一个 value。value其实不仅是String,也可以是数字。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。 使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。 存值:SET key  value  取值:GET…
2025-05-10 阅读全文 →
FWQ
服务器教程
redis-shake同步redis数据的实现方法
redis-shake同步redis数据的实现方法 收藏 知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个数据库开发实战,手把手教大家学习《redis-shake同步redis数据的实现方法》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟! 有了redis shake 之后,同步redis数据库数据变得容易了很多,其实我们可以猜想,它应该利用了解析redis的rdb或aof的文件来达到数据同步的目的,事实上也差不多,有了之前的canal的使用经验,其同步思想也如出一辙; redis shake 简介 git地址: redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具 基本功能 redis-shake是我们基于redis-port基础上进行改进的一款产品。它支持解析、恢复、备份、同步四个功能。以下主要介绍同步sync; 恢复restore:将RDB文件恢复到目的redis数据库; 备份dump:将源redis的全量数据通过RDB文件备份起来; 解析decode:对RDB文件进行读取,并以json格式解析存储; 同步sync:支持源redis和目的redis的数据同步,支持全量和增量数据的迁移,支持从云下到阿里云云上的同步,也支持云下到云下不同环境的同步,支持单节点、主从版、集群版之间的互相同步。需要注意的是,如果源端是集群版,可以启动一个RedisShake,从不同的db结点进行拉取,同时源端不能开启move slot功能;对于目的端,如果是集群版,写入可以是1个或者多个db结点; 同步rump:支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移; 基本原理 edis-shake的基本原理就是模拟一个从节点加入源redis集群,首先进行全量拉取并回放,然后进行增量的拉取(通过psync命令)。如下图所示: 如果源端是集群模式,只需要启动一个redis-shake进行拉取,同时不能开启源端的move slot操作。如果目的端是集群模式,可以写入到一个结点,然后再进行slot的迁移,当然也可以多对多写入; 目前,redis-shake到目的端采用单链路实现,对于正常情况下,这不会成为瓶颈,但对于极端情况,qps比较大的时候,此部分性能可能成为瓶颈,后续我们可能会计划对此进行优化。另外,redis-shake到目的端的数据同步采用异步的方式,读写分离在2个线程操作,降低因为网络时延带来的同步性能下降; 更多内容请参阅官方说明 下面演示下,基于单节点模式下,使用redis shake完成redis两个节点数据库的完整过程; 环境准备…
2025-05-10 阅读全文 →