Redis
文章平均质量分 69
甜瓜瓜哥
这个作者很懒,什么都没留下…
展开
-
Redis中Set的数据结构
当Set的元素较多或者元素的大小较大时,Redis会转而使用哈希表(Hash Table)来表示Set。在ziplist中,当Set的元素较少且元素的大小适中时,Redis会使用ziplist来表示Set。Redis会根据Set的大小和元素的大小来自动选择使用ziplist还是哈希表作为底层数据结构。ziplist是一种紧凑的、压缩存储的数据结构,它将多个元素。使得Redis能够在不同场景下高效地处理Set类型的数据。这种方式对于小型Set是高效的。哈希表:Hash Table。,但可能会占用更多的内存。原创 2023-12-03 23:29:18 · 155 阅读 · 0 评论 -
Redis中Set的使用场景
Set是一个无序的字符串集合,不允许重复的数据存在。原创 2023-12-03 23:15:20 · 333 阅读 · 0 评论 -
Redis复习题
redis复习题原创 2023-11-08 11:53:54 · 57 阅读 · 0 评论 -
缓存与数据库到底先更新哪一个
缓存和数据库一致性的问题,最好的方式就是先更新数据库,再删除缓存,再加个补偿措施。参考资料面试官问我到底是先更新缓存还是先更新数据库?原创 2023-10-29 20:15:04 · 313 阅读 · 0 评论 -
Redis中的Lettuce
在Redis中,Lettuce是一个用于Java编程语言的开源的、高性能的Redis客户端库。它提供了异步、同步和响应式编程模型,可以与Redis服务器进行交互。Lettuce提供了一个强大、灵活且高性能的方式来与Redis进行交互,特别是在Java应用程序中。原创 2023-10-09 10:41:56 · 199 阅读 · 0 评论 -
Redis怎么实现短信验证登陆
从Redis中获取存储的验证码,并与用户输入的验证码进行比较,检查是否匹配。否则,验证失败,需要用户重新尝试或提供新的验证码。可以使用手机号作为键,验证码作为值,设置过期时间以确保验证码的有效期限。由于设置了验证码的过期时间,您需要确保在验证时检查验证码是否已过期。当用户请求登录时,您的应用程序需要生成一个随机的验证码,并将其关联到用户的手机号码上。将生成的验证码通过短信发送给用户的手机号码,以便用户可以进行登录验证。用户收到短信后,输入验证码在您的应用程序中进行验证。原创 2023-07-26 23:27:27 · 176 阅读 · 0 评论 -
Redis是如何缓存热点数据的
总的来说,Redis 之所以能够高效地缓存热点数据,主要得益于其快速的内存读写能力,合理的过期策略和淘汰策略,以及灵活的分布式特性。这使得 Redis 成为广泛应用于缓存层的强大工具。原创 2023-07-23 18:11:55 · 1221 阅读 · 0 评论 -
Redis的多路复用机制
当我们客户端向他注册事件的时候,调的就是这个接口。注册进来之后,假如我发了数据过来,触发了一个IO事件,那么这个时候selector会返回翻一个事件的数组,一个集合两个events,然后由我们的redis把这两个events的数据拿到之后进行处理。这些在Linux操作系统里提供了相应的函数,比方说我们要创建一个收集器或者叫多路复用神器,我们会去调用操作系统的epoll_create这个函数,来声明一个事件收集器的一个内存空间,专门用来存很多事件的,来感知有没有事件发生调epoll_create。原创 2023-07-23 18:03:40 · 390 阅读 · 0 评论 -
在学生成绩管理系统项目中引入Redis的作用
当用户登录成功后,系统会生成一个唯一的会话标识符,并将用户的相关信息存储在Redis中。需要注意的是,Redis 是一种内存数据库,数据存储在内存中,因此在使用 Redis 时需要考虑到数据的持久性和备份机制。这样,在相同查询请求再次出现时,可以直接从缓存中获取结果,而不必重新执行整个查询过程,从而节省了数据库的开销。在学生成绩管理系统中,对于重要的数据,可以考虑定期将其持久化到磁盘,以确保数据的安全性和可靠性。使用Redis的计数器功能来记录用户的请求次数,并在达到限制时拒绝额外的请求。原创 2023-07-21 00:17:09 · 214 阅读 · 0 评论 -
客户端如何定位redis集群的某个数据节点
需要注意的是,Redis 集群的配置和客户端定位的细节可能会随着 Redis 版本的更新而有所改变,因此在使用新版本的 Redis 时,建议查阅最新的官方文档以获取准确的信息。Redis 客户端维护一个集群映射表,该表存储了哈希槽和对应数据节点的映射关系。值得注意的是,Redis 客户端通常在启动时会通过执行集群的节点发现过程,获取集群中各个节点的信息,并构建本地的集群映射表。一旦客户端知道了数据所在的节点,它会将对应的读或写命令发送到该节点,与 Redis 服务器进行通信。原创 2023-07-20 10:35:33 · 488 阅读 · 0 评论 -
Redis集群数据hash分片算法
当Redis Cluster的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个key时,可以根据槽位定位算法定位到目标节点。Redis Cluster将所有数据划分为16384个slots(槽位),每个节点负责其中一部分槽位。Cluster默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位。再根据槽位值和Redis节点的对应关系就可以定位到key具体是落在哪个Redis节点上的。原创 2023-07-20 09:41:38 · 111 阅读 · 0 评论 -
Redis集群的工作原理
为了让大家的信息达成一致,启动的时候,每个人都得把自己负责的槽位信息告诉其他伙伴,一共有1万多个槽要通知其他小伙伴。需要告诉集群中的某个redis自己的IP和端口,那么该redis就给其发送一个MEET信息发起握手,对方需要回复一个PONG信息同意入伙,最后该redis再回他一个PING信息,三次握手就完成了。所以对于数据容量提升,并没有什么帮助,例如多个redis拼起来,每一个负责一部分数据,合体进化成一个大的缓存服务器,变成一个集群。有了集群和主从复制,就能保证高可用的同时,提升了数据容量。原创 2023-07-19 23:56:52 · 64 阅读 · 0 评论 -
常见的缓存淘汰策略及LRU原理
又考虑到删除一个元素,要把这个元素的前一个节点指向下一个节点,使用双链接最合适。链表不适合查询,因为每次都要遍历所有元素,可以和HashMap配合使用。目的是把最不常用的数据淘汰掉最简单的方法就是把所有元素按使用情况排序,最近使用的,移到末尾。缓存满了,就从头部删除。每次使用一个元素,都要把这个元素移到末尾,包含一次删除和一次添加操作,使用数组会有大量的拷贝操作,不适合。常用的数据结构有数组、链表、栈、队列,考虑到要从两端操作元素,就不能使用栈和队列。当我们使用缓存的时候,由于缓存的大小是有限的。原创 2023-07-12 17:04:00 · 295 阅读 · 0 评论 -
Redis的缓存淘汰策略
Redis是一个基于内存的key-value存储中间件,而内存又是一个非常宝贵的资源。如何用有限的服务器资源去支撑更多的业务,那我们就必须考虑到缓存的有效使用,也就是需要去考虑到缓存的淘汰算法。把一些不怎么使用的缓存淘汰掉。参考资料【Java面试】美团一面,描述一下Redis的缓存淘汰策略。原创 2023-06-29 19:12:02 · 710 阅读 · 0 评论 -
zset底层数据结构
跳表在链表的基础上增加了多级索引,通过多级索引位置的转跳,实现了快速查找元素。比如针对一张普通的链表,我想要查找元素27该如何查找呢?只能从链表的头部一个个往后遍历,这个过程中我们需要遍历6次,才能找到元素27。原创 2023-06-24 16:53:16 · 872 阅读 · 0 评论 -
实现分布式锁的解决方案中,你认为Zookeeper和Redis哪种解决方案更好
Redis可以使用SetNX这个指令去实现分布式锁。Zookeeper他可以用那个同一个节点的唯一性或者有序节点的这样的一个特性去实现分布式锁。Redis的读写性能比Zookeeper更好。所以在高并发的一些场景中,就是Zookeeper在实现分布式锁上还是会有些瓶颈的。所以我认为Redis要比Zookeeper更好。原创 2023-06-24 15:35:16 · 323 阅读 · 0 评论 -
Redis实现分布式锁原理
我们都知道,lock或者synchronized只在单个JVM中有效。由于订单系统在多机器部署,因此相对于整个集群环境来说,同时操作一份共享的变量或者数据,就存在不安全的问题了。原创 2023-06-10 13:03:25 · 87 阅读 · 0 评论 -
为什么要使用Redis
从高性能上来说,用户第一次访问数据库中的某些数据,因为是从硬盘上读取的,所以这个过程会比较慢。将该用户访问的数据存在缓存中,下一次再访问这些数据的时候,就可以直接从缓存中获取了。从高并发上来说,直接操作缓存能够承受的请求是远远大于直接访问数据库的。本地缓存最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束。在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。像map或者guava就是本地缓存。缓存分为本地缓存和分布式缓存。原创 2023-06-03 12:10:28 · 104 阅读 · 0 评论 -
如何解决超卖等常见问题
如果需要做一个秒杀系统,最重要的是要解决高并发问题。因为在那一刻肯定有很多顾客过来抢。秒杀活动一定是高并发的,在那一秒,无数的用户抢购商品,如果我们每个请求过来,都要与数据库进行交互,那么MySQL一定是扛不住的,所以我们的秒杀要基于redis来进行。Redis单机支撑每秒几万的写入。这样性能不是问题。而且Redis还可以做各种的水平扩展和集群支持。这样,性能就能完全满足我们的秒杀需要。那么这种情况下,在我们发布秒杀活动的时候,要将我们的商品与库存写入redis。原创 2023-06-03 11:57:08 · 651 阅读 · 0 评论 -
Redis的应用场景
可以使用Redis自带的SETNX命令实现分布式锁,除此之外,还可以使用官网提供的RedLock分布式锁实现。利用Redis原子性的自增操作,可以实现计数器的功能。可用于限制某个用户访问某个接口的频率,比如秒杀场景用于防止用户快速点击带来不必要的压力。可以使用Redis自身的发布/订阅模式或者List来实现简单的消息队列,实现异步操作。利用集合的一些命令,比如交集、并集、差集等,实现共同好友、共同爱好之类的功能。在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。原创 2023-05-28 17:13:15 · 87 阅读 · 0 评论 -
说一下在你的项目中Redis的应用场景
单机锁:几个线程对那个数据结构的方法的修改,加synchronized加锁,才能让这些数据在修改这些数据的时候,达到一个串行或者准确的效果。字符串(strings),散列(hashes),列表(list),集合(set),有序集合(sorted set)。你的项目有哪些数据结构或对象,在单机里需要单机锁,在多机(分布式),需要分布式锁。抽出来放入redis中。基本上就是拿它当缓存用。原创 2023-05-28 16:38:22 · 37 阅读 · 0 评论 -
扫码登录如何实现
通过已经登录过的APP应用去扫描未登录的Web端程序的二维码。通过某种机制触发登录凭证的写入,从而去实现Web端的这种登录的这样的一个过程。首先在网页端打开登录页面,展示一个二维码。这个二维码里面有一个唯一的编号,是服务器端生成的,然后浏览器定时去轮询这个二维码的状态。接下来在APP端去扫描这个二维码。把APP端的token信息二维码ID发送到Server端。Server收到请求后去修改二维码的扫码状态,并生成一个临时的token。这个时候,网页端展示的二维码状态会提示已扫码待确认。原创 2023-05-28 16:20:27 · 1387 阅读 · 0 评论 -
Redis怎么保证接口幂等性和消息不被重复消费
到了服务端,我们首先去判断version字段是否存在,如果version字段存在,才会继续走后面的逻辑处理。如果现在生产者又来了一条相同的消息到了消费者,现在我们去判断version字段是否存在。如果已经存在的话,那么就可以就不处理这个消息,这样就可以保证消息不被重复消费。我们在下单的过程中需要把商品添加到购物车,添加购物车之后然后后再提交订单。我们在提交订单这个动作,需要去保证接口幂等的。首先生产者会将消息发给消费者,消费者需要去基于生产者里面的消息的唯一属性,去做一些分布式锁的处理。原创 2023-05-27 18:18:59 · 331 阅读 · 0 评论 -
Redis和Mysql如何保证数据一致性
由于这个更新是有先后顺序的,并且它不像MySQL里面的多表事务一样,可以满足ACID的事务特性。在理想情况下,应用下次访问Redis的时候,发现Redis里面的数据是空的,就从数据库里面加载并保存到Redis里面。但是在极端情况下,由于删除Redis和更新数据库这两个操作并不是原子的,所以这个过程中,如果有其他线程来访问,还是会存在数据不一致的问题。如果先更新数据库再更新缓存,那么如果缓存更新失败,就会导致数据库中的数据和Redis中的数据不一致。原创 2023-05-27 15:17:19 · 478 阅读 · 0 评论 -
如何使用Redis实现消息队列
在客户端消费者读取Stream消息时,Redis服务器将消息回复给客户端的过程中,客户端突然断开了连接,消息就丢失了。如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候blpop和brpop或抛出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常,还有重试。删除一个消息,使用XDEL语法,注意,这个命令并没有删除Pending中的消息,因此查看Pending,消息还会在,可以在执行XDEL之后,XACK这个消息标识其处理完毕。原创 2023-05-27 12:38:28 · 225 阅读 · 0 评论 -
Redis数据持久化AOF和RDB原理
当执行保存操作时,Redis会将数据集的状态进行快照,并将其转换为二进制格式,然后将该快照保存到一个文件中。最初,Redis打算去分析原来的AOF文件,然后将其中的冗余指令去掉来给AOF文件瘦瘦身。为了节约空间,Redis定义了二进制的格式,把数据一条一条码在一起,生成了一个rdb文件。将之前的写入命令都记录下来,专门写入了一个文件,并给这种持久化方式也取了一个名字AOF,AOF是。,从创建重写子进程开始的那一刻起,Redis将后面来的命令复制并写到这个重写缓冲区中。,而不是修改已有的文件内容。原创 2023-05-18 15:54:11 · 90 阅读 · 0 评论 -
MySQL数据如何同步到Redis?
【补充】UDF函数指的是用户自定义函数(User-Defined Functions),它是MySQL提供的一种扩展功能,允许用户自定义自己的SQL函数并在SQL查询中使用。【补充】在 MySQL 中,二进制日志(Binary Log)通常简称为 binlog,是一种记录 MySQL 服务器对数据库更改操作的二进制格式日志。2)客户端向MySQL中写入数据时,触发器会被触发触发之后,调用MySQL的UDF函数。canal是阿里巴巴旗下的一款开源项目,基于数据库增量日志解析,提供增量数据订阅&消费。原创 2023-05-05 23:05:36 · 928 阅读 · 0 评论 -
Redis中的热点Key问题
在Redis中,我们把访问频率高的key,称为热key。比如突然有几十万的请求去访问redis中某个特定的key,那么这样会造成redis服务器短时间流量过于集中,很可能导致redis的服务器宕机。那么接下来对这个key的请求,都会直接请求到我们的后端数据库中,从而可能导致后端服务不可用。进而导致服务雪崩。简单理解,热Key就是访问频率高的那些Key。原创 2023-05-05 22:48:37 · 687 阅读 · 0 评论 -
Redis的底层数据结构
List、Hash、Sorted Set、Set这四种数据类型都有两种实现结构。List对应双向链表和压缩链表。Hash对应的是压缩列表和哈希表。Sorted Set对应压缩列表和跳表。这些只是Redis键值对中的数据类型,也就是数据的保存形式,这和Redis的底层数据结构是有区别的。在项目中,我们会根据不同的业务场景,结合Redis的特性进行不同的使用。特点是一个键对应的一个集合的数据。String类型的底层实现只有一种数据结构,就是简单动态字符串。去解决“重复点击注册造成的脏数据、这一问题。原创 2023-04-25 21:51:38 · 301 阅读 · 0 评论 -
Redis缓存雪崩、穿透、击穿
请求数据库这一步上锁,只有拿到锁的线程可以操作这个数据库。这个时候对数据库的压力就非常小。其他没有抢到锁的数据让他先睡几毫秒,然后再重新去redis里面去查询数据。数据库的主键就是从0开始递增的,没有负数。redis直接被这种数据穿透了,恶意用户去请求软件,然后用这个id等于负一的数据去请求。,导致软件直接和数据库进行沟通,把请求都打到了数据库上。,一般出现这种情况都不是正常的用户,而是一些恶意的用户。这就是缓存雪崩,大量的redis在同一时间失效。原创 2023-04-20 13:24:49 · 861 阅读 · 0 评论 -
Redis单机最大并发量
Redis的速度非常的快,单机的Redis就可以⽀撑,相对于MySQL来说,性能是MySQL的几十倍。原创 2023-04-19 17:29:21 · 3910 阅读 · 0 评论 -
Redis热点优化
热点数据的解决方法其实很简单,就是在Cache的Client端在本地缓存,当发现热点数据时直接读取本地缓存就可以了,不用请求Server。巨热点数据我们可以把key发布到所有服务器上,每个服务器起一个key的别名,然后我们查询的时候,随机查询其中一个服务器的key就可以了。某个商品的次数达到每秒一定次数后,热点探查模块就会给商品模块发送一个请求,告诉商品模块X是一个热点数据。比如有5个服务,热点探查模块会给5个服务都发送这个消息告诉他们服务商品X是热点数据。一般热点数据是有一个热点数据探查的一个模块。原创 2023-04-19 16:02:32 · 898 阅读 · 0 评论 -
Redis的介绍和其优缺点
Redis是一个键值(key-value)类型的NoSQL数据库SQL:结构化查询语言。原创 2023-04-19 14:24:13 · 63 阅读 · 0 评论 -
Redis支持的五种数据类型及应用场景
Redis是一个开源的key-value数据库。原创 2023-04-10 00:24:11 · 949 阅读 · 0 评论 -
Redis为什么这么快
使用sortedest,拿时间戳作为score,消息内容作为key,调用zadd来生产消息,消费者用‘zrangebyscore’指令获取N秒之前的数据轮询进行处理。从数据库一般是只读的,它会接收主数据同步过来的数据。避免同步机制的开销。如果Redis选择多线程模型,需要考虑数据同步的问题,则必然会引入某些同步机制,会导致在操作数据过程中带来更多的开销,增加程序复杂度的同时还会降低性能。如果Redis使用多线程模式,那么所有的底层数据结构的设计都必须考虑线程安全问题,那么Redis的实现将会变得更加复杂。原创 2023-04-04 21:18:16 · 787 阅读 · 0 评论