Redis-缓存
文章平均质量分 89
Redis-缓存
思静鱼
大道至简,行稳致远
展开
-
Redis中Lua脚本的使用场景
Redis 中的 Lua 脚本可以用于多种场景,以下是一些常见的使用场景及其对应的 Java 实现示例。通过使用 Lua 脚本,可以在 Redis 中实现复杂的逻辑和原子操作,同时利用 Java 客户端(如 Spring Data Redis)方便地执行这些脚本,提升性能并减少网络延迟。原创 2024-10-28 14:31:16 · 336 阅读 · 0 评论 -
Redis 和 Mysql 如何保证两者数据一致性
在分布式系统中,保证Redis和MySQL之间的数据一致性是一个复杂且重要的问题。由于Redis是内存数据库,而MySQL是磁盘数据库,它们的特性和持久化方式不同,因此需要特殊的注意和处理来确保数据的一致性。双写模式:在进行写操作时,先将数据写入MySQL,然后再将数据写入Redis。这种方式可以保证MySQL中的数据一定会被同步到Redis中,但是对于读操作来说效率较低。异步更新:在进行写操作时,只将数据写入MySQL,然后异步地将数据写入Redis。原创 2024-05-30 15:54:47 · 1306 阅读 · 0 评论 -
redis持久化RDB和AOF
Redis提供两种主要的持久化方式:RDB(Redis Database Backup)快照和AOF(Append-Only File)日志。RDB快照:○ RDB快照是通过在指定时间间隔内将内存中的数据保存到磁盘上的一个快照文件中来实现持久化的。○ 快照文件是一个二进制文件,包含了Redis在某个时间点上的数据状态。○ RDB快照是通过fork子进程来完成的,可以减少持久化对主进程的影响。○ RDB持久化适用于备份和恢复整个数据集的场景。原创 2024-05-30 15:24:16 · 728 阅读 · 0 评论 -
redis过期策略&淘汰策略
假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期, 如果过期的话, 就删除该键;volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。原创 2024-05-30 15:13:26 · 643 阅读 · 0 评论 -
使用Redis常遇到的问题
性能问题:Redis通常以内存为主要存储介质,因此在处理大规模数据或高并发请求时可能会出现性能瓶颈。解决这个问题的方法包括优化Redis配置、增加硬件资源、使用Redis集群等。数据一致性:由于Redis的主从复制和分片机制,可能会出现数据一致性问题,例如主节点故障时数据丢失或者从节点数据落后于主节点。可以通过配置Redis的复制策略、监控主从同步状态、使用Redis-Cluster等方式来解决这个问题。原创 2024-05-30 15:07:56 · 1286 阅读 · 0 评论 -
redis常见使用场景
通过以上流程,可以实现延迟处理任务或消息的功能。然而,需要注意的是,Redis延迟队列通常只能提供基本的延迟功能,如果需要更复杂的消息队列功能(如消息重试、消息持久化等),可能需要结合其他消息中间件来实现。如果你快速的在 Google 中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。原创 2024-05-30 15:03:55 · 1521 阅读 · 0 评论 -
Redis事务
Redis事务可以理解为一种将多个Redis命令打包,然后一次性、有序地执行的机制。它确保这些命令作为一个整体进行执行,要么全部成功执行,要么全部不执行,从而保持数据的一致性。定义:Redis事务是一个单独的隔离操作,事务中的所有命令都会序列化,然后按照顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。特点:原子性:在事务块中,所有命令要么全部成功执行,要么全部不执行。这意味着在事务中出现错误时,所有已暂存的命令都会被回滚,确保数据状态保持一致。原创 2024-05-30 14:58:13 · 909 阅读 · 0 评论 -
Redis详解
Twemproxy 本身不存在单点问题,因为你可以启动多个 Twemproxy 实例,然后让你的客户端去连接任意一个 Twemproxy 实例Twemproxy 是 Redis 客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,并且应该算比较可靠的。这样的话,当你的数据不断增长,需要更多的 Redis 服务器时,你需要做的就是仅仅将 Redis实例从一台服务迁移到另外一台服务器而已(而不用考虑重新分区的问题)。分区可以让 Redis 管理更大的内存,Redis 将可以使用所有机器的内存。原创 2024-05-30 14:55:52 · 814 阅读 · 0 评论 -
Redis三种集群方式
1.twemproxy,大概概念是,它类似于一个代理方式,使用方法和普通 Redis 无任何区别,设置好它下属的多个 Redis 实例后,使用时在本需要连接 Redis 的地方改为连接twemproxy,它会以一个代理的身份接收请求并使用一致性 hash 算法,将请求转接到具体 Redis,将结果再返回 twemproxy。因此旧 master 再次恢复的时候,会被作为一个 slave 挂到新的 master 上去,自己的数据会清空,重新从新的 master 复制数据。并且,它也提供复制和故障转移的功能。原创 2024-05-29 14:51:26 · 1038 阅读 · 0 评论 -
redis客户端Redisson
Redisson 是一个在 Java 中实现的 Redis 客户端,它提供了许多高级功能,包括分布式锁、延迟队列、分布式计数器等。Redisson 是一个基于 Redis 的 Java 驻内存数据网格(In-Memory Data Grid)和分布式处理框架,提供了丰富的分布式对象和服务,用于简化开发者在分布式系统中的操作。Redisson 提供了一系列的分布式对象,包括分布式集合、分布式锁、分布式队列、分布式消息队列、分布式地图等,还提供了分布式服务,如分布式限流、分布式远程调用等。原创 2024-05-29 11:18:28 · 913 阅读 · 0 评论 -
Java本地缓存
Java 中本地缓存通常指的是在应用程序内部通过数据结构(如 Map)或者专门的缓存库(比如 Ehcache、Guava Cache、Caffeine 等)实现的内存缓存,用于临时存储频繁访问的数据,以提高数据访问速度和降低对外部资源的依赖。提高数据访问速度:将频繁访问的数据存储在内存中,可以减少对外部资源(如数据库、远程服务)的访问,从而加快数据读取速度。减轻外部资源压力:通过缓存,可以减少对外部资源的请求次数,减轻外部资源的负载压力,提高系统整体的并发处理能力。原创 2024-05-29 10:32:27 · 2657 阅读 · 0 评论 -
Java本地缓存实现方案介绍
是基于java8实现的新一代缓存工具,缓存性能接近理论最优,可以看作是Guava Cache的增强版,功能上两者类似,不同的是Caffeine采用了一种结合LRU、LFU优点的算法:W-TinyLFU,在性能上有明显的优越性。这种方式在数据量小的情况下是可以的。Caffeine:由 Google 开源的 Java 缓存框架,提供了高性能和可伸缩的缓存实现,支持缓存的自动回收和多种缓存逐出策略等功能。所谓本地缓存,就是和应用服务器一起的缓存工具,将需要缓存的数据放到本地缓存中,可以大大的提升访问速度。原创 2024-01-05 21:42:58 · 2366 阅读 · 0 评论 -
常见的缓存淘汰算法
FIFO、LRU、LFU 和 WindowTinyLFU 是常见的缓存淘汰算法,用于决定在缓存容量不足时应该如何选择要淘汰的数据。原创 2024-01-07 15:37:24 · 1561 阅读 · 0 评论 -
实现多级缓存(Redis+Caffeine)
在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。随着不断的发展,这一架构也产生了改进,在一些场景下可能单纯使用Redis类的远程缓存已经不够了,还需要进一步配合本地缓存使用,例如Guava cache或Caffeine,从而再次提升程序的响应速度与服务性能。原创 2024-01-07 16:25:35 · 2278 阅读 · 0 评论 -
redis数据结构类型
只不过Redis的扩容机制跟HashMap有点不一样,Redis会有2个hashTable,第二个table只有再扩容的时候使用,当第一个table的容量达到一定量,这个量正常是已有的数据是table大小的时候就会扩容,但是当有在进行持久化的时候,使用量是table容量的5倍的时候扩容。比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。原创 2024-03-08 17:37:14 · 874 阅读 · 0 评论 -
Redis什么这么快和Redis单线程模型和多线程
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;4、非阻塞IO多路复用机制。原创 2024-03-08 16:22:42 · 956 阅读 · 0 评论 -
缓存雪崩、缓存穿透、缓存击穿
当然,可能针对缓存穿透的情况,也有可能是其他的原因引起,可以针对具体情况,采用对应的措施。缓存击穿,就是说某个 key 非常热点,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。undefined 缓存失效:缓存中的某些数据过期或者被淘汰,在数据重新加载到缓存之前,大量请求会直接穿透到存储系统中查询,导致存储系统负载剧增。2缓存失效:缓存中的某些数据过期或者被淘汰,在数据重新加载到缓存之前,大量请求会直接穿透到存储系统中查询,导致存储系统负载剧增。原创 2024-01-09 14:51:19 · 1333 阅读 · 0 评论 -
redis分布式锁-Redisson分布式锁
锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同一时刻只能被一个线程访问,Java中的锁我们都很熟悉了,像synchronized 、Lock都是我们经常使用的,但是Java的锁只能保证单机的时候有效,分布式集群环境就无能为力了,这个时候我们就需要用到分布式锁。其实我们设想一下,是否可以给获得锁的线程,开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。秒杀下单、抢红包等等业务场景,都需要用到分布式锁,我们项目中经常使用Redis作为分布式锁。原创 2023-10-26 10:48:45 · 220 阅读 · 0 评论