![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis
Shen_Li_Java_ing
加电!加电!!加电!!!
展开
-
使用redis分布式锁,不要把锁放在本地事务内部
在使用分布式锁的时候,习惯性的尽量缩小同步代码块的范围。但是如果数据库隔离级别是可重复读,这种情况下不要把分布式锁加在@Transactional注解的事务方法内部。因为可能会出现这种情况:原创 2024-07-04 21:29:20 · 341 阅读 · 0 评论 -
Redis分布式锁的应用场景有哪些
在多线程并发的场景下,JavaSynchronized/Reentrantlock锁能够实现同⼀个JVM进程内多线程并发的安全性,但⽆法保证多个JVM进程实例构成的集群环境在多线程下的安全性。在⼀些业务场景下需要引⼊分布式锁。原创 2024-07-03 19:52:30 · 458 阅读 · 0 评论 -
Redis如何实现主从复制
发生在初始化阶段,从节点会主动向主节点发出一个同步请求,之后主节点会生成一份当前数据的快照给从节点,从节点在收到数据进行加载后,会完成全量复制。主是主服务器,从是从服务器,主服务器(master )的数据如果更新了也会同步到从服务器(slave),一个主服务器可以搭配很多个从服务器,,每一次Master(主)结点发生数据变更之后,会把变化的增量数据同步给从节点,增量复制是通过维护offset复制偏移量来实现的。Redis主从复制包括。原创 2024-07-02 22:08:00 · 778 阅读 · 0 评论 -
CAP原理---最终一致性
当客户端在Redis的主节点修改了数据后,立即返回,即使在主从网络断开的情况下,主节点依旧可以正常对外提供修改服务,所以Redis满足「可用性」。,最终从节点的状态会和主节点的状态将保持一致。在网络分区发生时,两个分布式节点之间无法进行通信,我们对一个节点进行的修改操作将无法同步到另外一个节点,所以数据的「一致性」将无法满足,因为两个分布式节点的数据不再保持一致。分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的,这意味着必然会有网络断开的风险,这个网络断开的场景的专业词汇叫着「网络分区」。原创 2024-07-02 22:06:29 · 435 阅读 · 0 评论 -
Redis和Memcached的区别
能够提供高可用服务。Memcached 没有提供原生的集群模式,需要依靠客户端实现往集群中分片写入数据。value值大小不同: Redis最大可以达到512M;memcache只有1mb。,Memcached使用多线程的非阻塞IO模型。(Redis6.0引入了。MemCached 数据结构单一,仅用来缓存数据,而。MemCached不支持数据持久化,重启后数据会消失。原创 2024-05-17 20:54:13 · 339 阅读 · 0 评论 -
redission分布式锁框架
如果Redis提供了主从集群,当我们向集群写数据时,主机需要异步的将数据同步给从机,而万一在同步过去之前,主机宕机了,就会出现死锁问题。概率低,同步是毫秒级.看门狗机制,锁续期,可以用来解决锁提前释放的问题,默认30s过期,每10s检查一次,如果发现业务代码还在执行,后台线程就主动续约。redission框架出来的时间较早,功能比较完善 先入为主。不能多次获取同一把锁。可重入锁的意义是在于防止死锁。线程在获取锁失败后,应该能多次尝试。业务还没执行完,锁就释放了。trylock可重试。原创 2024-05-17 20:44:02 · 249 阅读 · 0 评论 -
Redis如何实现持久化
AOF(append only file)持久化:以独立日志的方式记录每次写命令,Redis重启时会重新执行AOF文件中的命令达到恢复数据的目的。通过RDB方式的持久化,一旦Redis异常退出,就会丢失最近一次持久化以后更改的数据。b. RDB文件使用特定二进制格式保存,Redis版本升级过程中有多个格式的RDB版本,存在老版本Redis 无法兼容新版RDB格式的问题。a. AOF可以更好的保护数据不丢失,可以配置AOF每秒执行一次fsync操作,如果Redis进程挂掉,最多丢失1秒的数据。原创 2024-05-15 22:30:06 · 608 阅读 · 0 评论 -
Redis事务
事务中如果有命令执行失败的话,其他命令仍然会被执行,不支持回滚。-----》那如何保证Redis的原子性操作,可以使用。,因为他在执行命令时是单线程的,事务在执行过程中不会被中断。原创 2024-05-15 21:37:07 · 186 阅读 · 0 评论 -
Redis哨兵机制
这时如果要恢复服务的话,需要人工介入,选择一个「从节点」切换为「主节点」,然后让其他从节点指向新的主节点,同时还需要通知上游那些连接 Redis 主节点的客户端,将其配置中的主节点 IP 地址更新为「新主节点」的 IP 地址。这样也不太“智能”了,要是有一个节点能监控「主节点」的状态,当发现主节点挂了,它自动将一个「从节点」切换为「主节点」的话,那么可以节省我们很多事情啊!它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。原创 2024-05-14 22:07:05 · 714 阅读 · 0 评论 -
Redis缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。c.错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;5.错误降级:当Redis 缓存出现故障或异常时,返回默认值或友好提示,而不是抛出错误,确保对用户透明且不影响系统的整体功能。2.降低缓存优先级:降低 Redis 缓存的优先级,让部分请求直接绕过缓存访问数据源,减轻Redis的负担。原创 2024-05-14 22:05:15 · 653 阅读 · 0 评论 -
基于Redis实现分布式锁
基于这个场景,我们可以发现,问题关键在于,竞争者可以释放其他人的锁。那么在异常情况下,就会出现问题,所以我们可以进一步给出解决方案:分布式锁需要满足谁申请谁释放原则,不能释放别人的锁,也就是说,分布式锁,是要有归属的。今天,就让我们从最基础的步骤开始,依照分布式锁的特性,层层递进,步步完善,将它优化到最优,让大家完整地了解如何用Redis来实现一个分布式锁。今天,就让我们从最基础的步骤开始,依照分布式锁的特性,层层递进,步步完善,将它优化到最优,让大家完整地了解如何用Redis来实现一个分布式锁。原创 2024-05-13 22:30:34 · 499 阅读 · 0 评论 -
Redis和Mysql 如何保证一致性
把我们搭建的消费服务作为mysql的一个slave,订阅mysql的bin log日志,解析日志内容,再更新到redis。不光通过key的过期时间兜底,还需要在更新mysql时,同时尝试操作redis,这里的操作分两种方式,1是更新,直接将结果写入Redis,使用redis的过期时间,mysql更新时,redis不做处理,等待缓存过期失效,再从mysql拉取缓存。- 通常来说,过期时间兜底是行之有效的办法,根据实时性期待不一样,可以增加个删除逻辑,提升一致性。- 更新MySQL之后,操作Redis。原创 2024-05-13 20:50:23 · 829 阅读 · 0 评论 -
Redis如何进行内存管理的?---过期删除策略和内存淘汰策略
在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分CPU时间,对服务器的响应时间和吞吐量造成影响。周期性的随机检查一批设置了过期时间的key并进行处理,检查到的已过期的key将被删除。优点:可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。原创 2024-05-12 14:39:07 · 490 阅读 · 0 评论 -
Redis为什么快?
一个CPU同时只能执行一个线程的任务,如果是多线程的场景的话,不同线程去争夺CPU资源,上下文切换开销很大,所以redis采用了单线程。(注:Redis 6.0之前,服务端和客户端的连接以及如何去处理客户端的命令都是共用一个线程的,也就是单线程 , 在Redis 6.0之后,处理服务端和客户端的连接专门用多线程去跑了,但是处理命令还是单线程。但不是每个连接时时刻刻都有数据的,维护太多的线程会浪费资源,通过IO多路复用可以让一个线程监控多个socket连接。(1)Redis是基于。原创 2024-05-12 14:00:41 · 634 阅读 · 2 评论 -
Redis缓存策略
(读的时候不动缓存,那什么时候动缓存呢,那就是写的时候,对吧)。就相当于把redis当数据库来用了,要保证写的数据同步到redis中去,这种全量写,一般是不会读数据库的,数据库的压力就会很小,只扛写的压力。和Cache-Aside差不多,也是先从缓存中获取数据,没有就查数据库,然后放入缓存,区别是,Cache-Aside在于应用服务不再和缓存直接交互,而是先访问数据服务,数据服务自己来根据情况查询缓存或数据库。先去缓存中看看有没有数据,有数据就返回,没有数据的话,就去查数据库,然后把数据放到缓存中。原创 2024-05-11 18:47:26 · 462 阅读 · 0 评论 -
Redis缓存篇
当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value="null",并设置其过期时间极短,后面再出现查询这个key的请求的时候,直接返回null,就不需要再查询数据库了。缓存击穿跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是某个热点的key失效,大并发集中对其进行请求,就会造成大量请求读缓存没读到数据,从而导致高并发访问数据库,引起数据库压力剧增。而对于空数据的key有限的,重复率比较高的,则可优先采用第一种方式进行缓存。原创 2024-05-10 22:30:02 · 764 阅读 · 0 评论