- 博客(26)
- 收藏
- 关注
原创 redis为什么这么快
这意味着它不会因为线程创建导致的性能消耗;一个考场有50个考生(客户端),只有一个监考老师(线程),当考生完成答卷时,举手示意老师,卷子写完了(发出请求),让老师过来收卷子,老师收好卷子放到讲台上,告知学生可以离开了(做相应的读写操作)。所谓的I/O多路复用是一种同步的I/O模型,实现一个线程监听多个文件句柄,一旦某个文件句柄就绪就能够通知导对应应用程序进行相应的读写操作,没有文件句柄就绪时就会阻塞应用程序,从而释放cpu资源。所谓的I/O多路复用,通俗点讲就是:一个线程同时处理多个客户端的请求。
2024-09-11 15:46:42 227
原创 springboot体会BIO(阻塞式IO)
我们一样还是先启动服务端,再启动客户端1和客户端2,使用客户端1和客户端2向服务端写入消息,通过上述的例子我们得知,服务端会先处理客户端1的请求,客户端2的请求会阻塞。我们使用客户端1写入数据,再观察服务端和客户端1的日志打印,客户端写入成功,服务端读取成功,一切安好。服务端只能处理一个客户端的请求,第二个客户端发起请求,只能阻塞,直到第一个客户端的请求全部处理完毕。启动客户端1,再观察服务端的日志打印,成功监听客户端1与服务端建立了socket连接。写入是成功的,此时服务端的日志会有新增的打印吗?
2024-09-08 19:00:23 752
原创 同步异步,阻塞与非阻塞
阻塞,非阻塞的讨论对象是调用者(服务请求者),重点在于等消息时候的行为,调用者是否会去处理其他请求。被调用方先返回应答告知调用者,然后在计算调用结果,计算完最终结果后再通知并返回给调用方。同步,异步的讨论对象是被调用者(服务端),重点在于获得调用结果的消息通知方式上。调用方一直在等待,而且别的事情什么都不做,当前进程/线程会被挂起,啥都不干。调用在发出去后,调用方先去处理其他请求,不会阻塞当前进程/线程。调用者要一直等待调用结果的通知后再能进行后续的操作。6.阻塞与非阻塞的理解。3.同步与异步的理解。
2024-09-08 16:50:32 296
原创 redis之缓存淘汰策略
当Redis设置了最大内存限制(通过 maxmemory 配置项),并且当前使用的内存达到了这个限制,Redis会根据设定的淘汰策略来移除一些键,以便为新的键腾出内存。需要注意config set maxmwmery命令重启就失效了,想要永久修改,需要编辑redis的配置文件并重启redis服务。数据达到过期时间,不做处理,等下次访问该数据时,如果未过期,返回数据;输出的值为0,0代表redis的最大占用内存等同于服务器的最大内存。定期删除就是基于立即删除和惰性删除的折中的一种删除算法。
2024-09-03 19:46:27 830
原创 springboot集成guava布隆过滤器
代码里配置的误判率为0.03,这里就会有小伙伴问,误判率(hash冲突概率)不应该越低越好吗,那我配置成0.01或者0.00000000001可以吗?想要误报率控制在0.00000000001,比特数组的位数需要达到52717821并且使用37种hash算法。我们debug一下guava布隆过滤器的源码,点进去这个creat方法,断点打到如下图所示的位置。想要误报率控制在0.03,比特数组的位数需要达到7298440并且使用5种hash算法。我们先看误报率配置0.03的情况。再看误报率配置0.01的情况。
2024-08-30 20:06:06 621
原创 redis缓存预热、缓存雪崩、缓存穿透与缓存击穿
当这个数据被频繁请求,而此时该数据的缓存正好失效,导致大量并发请求同时打到数据库上,从而对数据库造成了极大的压力,甚至可能导致数据库崩溃。客户端请求的数据在缓存和数据库中都不存在的情况。这种情况通常发生在恶意用户,某些异常请求或者网络攻击中,这些请求不断地查询不存在的数据,导致请求直接打到数据库上,从而增加了数据库的负担,影响系统的性能和响应速度。(1)设置空值缓存:当请求的数据不存在时,可以将“空”值(如null或空对象)缓存一段时间,之后就不再请求数据库,减少对数据库的压力。2.造成缓存穿透的原因。
2024-08-30 18:00:57 380
原创 springboot+redis+mybatis体会布隆过滤器
由于第一次启动项目的时候,BloomFilter 类中的init方法会在一开始执行,此时我还并没有调用addUser方法添加用户,数据库中没有任何用户信息,所以第一次启动项目的时候,布隆过滤器中不会有任何的数据。我们调用getUser方法尝试获取用户信息,当我们传了一个数据库不存在的用户id时,当请求到布隆过滤器,布隆过滤器发现没有此数据,则直接返回,不会再往下查redis和mysql。我们启动项目后,手动调用下addUser方法,新增100条用户数据。2.编写Controller,新增用户和获取用户。
2024-08-30 11:10:30 779 1
原创 布隆过滤器
一般情况下,先查询Redis缓存,如果Redis中没有,再查询MySQL。在Redis前面添加一层布隆过滤器,请求先在布隆过滤器中判断,如果布隆过滤器不存在时,直接返回,不再反问Redis和MySQL。哈希函数:使用多个独立的哈希函数,将要插入的元素通过这些哈希函数得到多个位置,然后将这些位置在位数组中的对应位设置为1。不能删除元素(标准的布隆过滤器),因为删除一个元素可能会影响到其他元素的查找结果。如果布隆过滤器中存在时,再访问Redis,再访问数据库。有,是可能有(因为有hash冲突);
2024-08-30 10:11:09 304
原创 canal的安装与使用
(1)访问官网地址:https://github.com/alibaba/canal,点击右侧的【Releares】,鼠标下滑,我们以1.1.6版本的canal为例,下载对应版本的tar包。(1)canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议。进入/bin文件夹,执行命令 ./startup.sh 命令启动canal服务。进入/logs/canal文件夹,执行命令vim canal.log查看日志。
2024-08-23 18:24:38 350
原创 redis之大key问题
对于string类型,使用del命令删除,如果过于庞大使用unlink命令删除。对于zset类型,使用zscan+zremrangebyrank命令进行删除。大key问题说的不是某个key有多大,而是某个key对应的value很大。执行命令 redis-cli -a 密码 -p 端口 --bigkeys。hash,list,set,zset元素个数不超5000个。对于set类型,使用sscan+srem进行删除。对于hash类型,使用hscan+hdel删除。对于list类型,使用ltrim命令进行删除。
2024-07-24 23:34:28 235
原创 redis之单线程与多线程之争
redis的单线程指的是:redis的网络I/O和键值对读写是由一个线程来完成的,redis在处理客户端的请求时包括socket读,解析,执行,socket写等都是由一个顺序串行的主线程处理,这就是所谓的单线程。(2)某些业务场景使用单线程会造成redis服务端阻塞,像删除大key,aof文件的重写等场景,如果不用异步方式去执行命令的话,很容易造成redis的阻塞,造成redis服务不可用。(1)适配硬件的发展,多核cpu已经是普遍存在的现象,redis单线程不能最大化的利用硬件资源。
2024-07-24 16:54:13 286
原创 redis如何禁用某些命令
在生产中,redis的某些命令是很危险的,像flushdb/flushall 或者keys *此时我们用redis-cli连接redis客户端执行以下上述我们禁用的相关命令。执行上述命令全部提示未知的命令,此时我们就成功禁用了redis的相关命令。这里我禁用了flushdb命令,flushall命令以及keys命令。上述命令可能会带来很大的生产事故,那么如何禁用这些命令呢?格式为 rename-command 要禁用的命令 “”保存配置重启redis服务。修改redis配置文件。
2024-07-23 19:13:47 285
原创 springboot使用redisTemplate模板连接redis集群
答案就是springboot默认不会去更新redis集群的状态,虽然6999节点宕机,7004从节点成功上位,由于springboot未更新redis集群状态,所以程序依然认为6999节点存在,当key的hash槽正好落在6999节点上的时候,程序仍然会往6999节点写入,由于6999节点已经宕机,因此程序会抛出异常,连接超时。配置为所有的redis节点信息,格式为:ip:端口,ip:端口,ip:端口,ip:端口,ip:端口,ip:端口。从redis客户端来看,redis集群一切正常。
2024-07-23 15:31:45 805
原创 redis之集群容灾与扩容
执行命令:./redis-cli -a 密码 --cluster add-node 127.0.0.1:7006 127.0.0.1:7005 --cluster-slave --cluster-master-id 7981494cb67410f40327a5b24b92acabbd03636e。注意这里的ip地址各位小伙伴在实操的时候换成真实的ip,7005作为新加入的节点,6999作为引荐他加入组织的老大哥,引荐的redis必须是当前redis集群的master节点。从哪些master节点中获取槽位?
2024-07-12 14:12:25 705
原创 redis集群报错: Node xx is not empty. Either the node already knows other nodesor contains some key in ..
redis集群搭建报错:[ERR] Node xxxx is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.3.检查每个redis节点,是否存在nodes.conf文件,存在则删除。1.检查每个redis节点,是否存在dump.rdb文件,存在则删除。2.检查每个redis节点,是否存在aof文件,存在则删除。
2024-07-11 18:20:27 272
原创 redis之集群搭建
我这边因为是在同一台服务器上搭建的redis集群,所以我在执行组装集群命令的时候,redis给我了一个警告,意思大致就是我的master节点和slave节点都在一台服务器上,实际生产是不可能这样部署的,所以这里就不过多赘述了。没条件的小伙伴,例如作者我,可以在一台服务器上启动6个redis实例(我启动的redis实例端口为6999 7000 7001 7002 7003 7004)我们发现,再次写入k1时,将redis的客户端重定向到了7001,在7001redis实例中完成了写入。
2024-07-11 16:56:38 428
原创 redis集群中的哈希槽位(slot)为什么是16384个
因此,如果有16384个插槽,每个插槽的状态需要占用16384个比特,即16384 / 8 = 2048字节,即2KB的空间。集群节点越多,心跳包的消息体携带的数据越多,如果节点超过1000个,也会造成网络的拥堵,对于节点数在1000个以内的redis集群,16384个槽位足够用了。Redis主节点的哈希槽信息是通过bitmap存储的,在传输过程中,会对bitmap进行压缩,bitmap的填充率越低,压缩率越高。也就是说slots越小,填充率就会越小,压缩率就会越高,传输效率就会越高。
2024-07-09 11:37:51 586
原创 redis之集群分片
它通过将数据分布在多个节点(片)上,每个节点(片)负责数据集的一部分,从而可以扩展存储容量和并发处理能力,解决了单个Redis实例的内存和并发限制问题。(3)读写分离:在Redis集群中,每个主节点都可以处理读和写请求,从而提供更高的响应能力。(1)数据分布式存储:Redis集群可以将数据分布在多个节点上,每个节点负责存储数据集的一部分,从而提供更高的存储容量和并发处理能力。(5)自动分片:Redis集群通过哈希槽来决定数据存储的位置,自动将数据分片存储到不同的节点上,简化了数据分片的操作。
2024-07-08 23:00:14 409
原创 redis之哨兵监控
在生产环境中,可能会存在网络阻塞,网络抖动等现象,实际redis主节点并没有宕机,由于网络原因导致哨兵收不到redis服务端的响应,因此就需要多个哨兵同时认为redis主节点宕机,才会去重新选择新的redis主节点,这里也解释了文章中第3部分讲到的,哨兵的个数需要是基数,我们以3个哨兵为例,当2个(我们在sentinel 配置文件中 配置的sentinel monitor参数,其中票数配置的2)哨兵认为redis主节点宕机了,那么就是客观(ODOWN)下线。
2024-06-25 15:49:48 610
原创 redis之主从复制
实现的原理在于主节点会记录从节点的同步数据的偏移量(offset),从节点同步到4这个偏移量的时候挂了,这时候主节点持续写入,总的偏移量到了7,那么当从节点恢复的时候,会把4-7之间的数据同步到从节点当中。我们使用shutdown命令将其中一个从节点关闭,然后主节点执行set指令,然后将从节点再启动,我们发现刚才主节点写入的数据出现在了从节点中。(3)当其中一个从节点挂了,在从节点恢复期间,主节点仍然在写入,那么当从节点恢复的时候,会把宕机这段时间主节点中的数据同步到宕机的从节点吗?
2024-06-21 16:30:25 507
原创 Redis持久化之AOF
AOF重写机制的原理是根据当前内存中的数据库状态,生成一个新的AOF文件,新的AOF文件包含了恢复当前数据库状态所需的最少命令操作,因此新生成的AOF文件会比旧的AOF文件更小。当aof文件超过了1kb之后,进行了aof文件的重写,重写过的aof文件变成了appendonly.aof.2.base.rdb同时又新生成了一个appendonly.aof.2.incr.aof文件记录增量的写操作。通过AOF重写可以将AOF文件重新生成,去除冗余的指令,同时优化文件结构,减少碎片化,提升文件的读写性能。
2024-06-19 20:26:06 923
原创 Redis持久化之RDB
本质都是redis服务端在linux系统中,fork一个子进程,子进程将内存中的数据写入到磁盘上的dump.rdb文件,此时redis的主进程仍然能处理redis客户端发送的指令。在我配置的存放rdb文件的路径下生成了一个dump.rdb文件,因为配置文件里记录的是5秒钟内有2次变化,就会生成rdb文件,我们的操作满足这个要求,因此生成了rdb文件。感兴趣的小伙伴可以试试。RDB依赖于主进程的fork,在大数据集的情况下,fork的时候内存中的数据被克隆了一份,大致2倍的膨胀,需要考虑。
2024-06-17 23:25:41 624
原创 Redis7安装教程
执行命令 cp /test/redis-7.0.15/redis.conf /test/redis_conf复制一份配置文件并保存到指定位置。有的小伙伴可能会问,为什么要备份配置文件,这里主要考虑的是,如果redis配置文件参数配置不当,有备份可以还原。执行命令 ./redis-server /test/redis_conf/redis7.conf。进入到redis安装包的路径,我这里以/test为例(安装包放到/test下)执行命令cd /test/redis-7.0.15/src。
2024-06-11 19:22:40 585 2
原创 Access denied; you need (at least one of) the SUPER privilege(s) for this operation
将可执行sql文件通过navicat导入阿里云mysql,导入过程中报错【Access denied;SQL 语句中含有需要 Supper 权限才可以执行的语句,而 RDS MySQL不提供 Super 权限。详见:https://developer.aliyun.com/article/66463。如果没使用阿里云的RDS实例,导入数据的时候报这个错的话,执行命令为当前数据库账号复权即可。mysql数据迁移至阿里云RDS实例(阿里云mysql组件)命令为:GRANT ALL PRIVILEGES ON。
2024-04-11 19:04:07 1442
原创 对于程序员来说,是懂业务更重要,还是懂技术更重要
公司想要盈利,需要对客户提供产品,提供服务,所谓的产品就是符合客户日常工作习惯,解决客户日常工作难题的一类产物,就以软件为例,客户不会因为你用了什么高端技术而多给你一部分钱去购买,反而会在意你的产品有没有他想要的功能。不和业务相关联的增删改查都是垃圾,如果不懂业务,是写不出符合客户预期功能的代码的,懂业务意味着理解公司的业务模式、行业特点、用户需求和市场趋势,这样才能更好地满足用户需求,提高产品的竞争力。3.如果你喜爱编程,擅长钻研,喜欢学习,励志成为技术大牛,那么就坚定不移的走技术路线。
2024-03-16 11:29:46 719
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人