Redis
文章平均质量分 83
嗯mua.
这个作者很懒,什么都没留下…
展开
-
【Redis】Redis内存过期策略和内存淘汰策略
Redis本身是一个典型的key-value内存存储数据库,因此所有的key、value都保存在之前学习过的Dict结构中。不过在其database结构体中,有两个Dict:一个用来记录key-value;:顾名思义并不是在 TTL 到期后就立刻删除,而是在访问一个 key 的时候,检查该 key 的存活时间,如果已经给过期才执行删除。删除以释放更多内存的流程。Redis会在处理客户端命令的方法。:就是当Redis内存使用达到设置的上限时,主动挑选。:顾名思义是通过一个定时任务,周期性的。原创 2023-08-11 20:44:12 · 474 阅读 · 0 评论 -
【Redis】Redis的数据结构
突然要插入一个长度为254字节的entry,采用头插法插入,那么原来第一个entry的previous_entry_length就变成了5,那么整体的entry长度就由原来的250变成了254字节,那么又导致原来的第二个entry的previous_entry_length变成了5…注意:ZipList中所有存储长度的数值均采用小端字节序,即低位字节在前,高位字节在后。Dict中的HashTable就是数组结合单向链表的实现,当集合中元素较多时,必然导致哈希冲突增多,链表过长,那么查询效率会大大降低。原创 2023-06-26 00:34:37 · 544 阅读 · 0 评论 -
【Redis】Redis最佳实践/经验总结
如果您需要高可用性,并且要求Redis集群中的每个节点都持有完整数据集并能够处理客户端请求,则可以选择Redis集群部署。如MSET或Pipeline这样的批处理需要在一次请求中携带多条命令,而此时如果Redis是一个集群,那批处理命令的多个key必须落在一个插槽中,否则就会导致执行失败。集群中节点越多,集群状态信息数据量也越大,10个节点的相关信息可能达到1kb,此时每次集群互通需要的带宽会非常高。总之,在使用Redis集群时,需要了解每个命令的集群兼容性问题,并采取相应的措施来确保集群的稳定性和性能。原创 2023-06-23 01:05:39 · 1003 阅读 · 0 评论 -
【Redis】缓存同步
Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。Canal ,译意为水道/管道/沟渠,canal是阿里巴巴旗下的一款开源项目,基于Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Canal推送给canal-client的是被修改的这一行数据(row),而我们引入的canal-client则会帮我们把行数据封装到Item实体类中。Canal提供了各种语言的客户端,当Canal监听到binlog变化时,会通知Canal的客户端。原创 2023-04-23 23:18:44 · 843 阅读 · 0 评论 -
【Redis】多级缓存(nginx缓存、redis缓存及tomcat缓存)
注:lua/item.lua的lua目录和nginx同级,完整路径为/usr/local/openresty/lua,在这个文件下面就可以编写缓存脚本。是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库,目前spring内部的缓存使用的就算Caffeine。注:用作缓存的nginx是业务nginx,需要部署为集群,再使用专门的nginx用来做反向代理。不会自动立即将其清理和驱逐,而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。在默认的情况下,当一个缓存元素过期的时候,原创 2023-04-16 23:19:01 · 969 阅读 · 0 评论 -
【Redis】Lua快速入门使用
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。官网:https://www.lua.org/在centos系统中默认已经安装了lua,所以我们在系统中新建一个文件:")通过命令运行。原创 2023-04-14 23:35:26 · 656 阅读 · 0 评论 -
【Redis】Redis分片集群
Redis如何判断某个key应该在哪个实例?将16384个插槽分配到不同的实例。根据key的有效部分计算哈希值,对16384取余。余数作为插槽,寻找插槽所在实例即可。如何将同一类数据固定的保存在同一个Redis实例中?这一类数据使用相同的有效部分,例如key都以{typeId}为前缀。原创 2023-03-04 23:26:49 · 469 阅读 · 0 评论 -
【Redis】Redis集群之哨兵机制
Sentinel的三个作用是什么?监控故障转移通知Sentinel如何判断一个redis实例是否健康?每隔一秒发送一次ping命令,如果超过一定时间没有响应则认为主观下线。如果大多数sentinel都认为实例主观下线,那么久判定为客观下线。故障转移步骤有哪些?首先选定一个slave作为新的master,执行然后让所有节点都执行slaveof 新地址 端口号修改故障节点,执行slaveof 新地址 端口号。原创 2023-03-04 22:16:35 · 678 阅读 · 3 评论 -
【Redis】Redis主从同步中数据同步原理
简述全量同步和增量同步的区别?全量同步:master将完整内存数据生成RDB,发送RDB到slave,后续命令则记录在repl_baklog,逐个发送给slave。增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。什么时候执行全量同步?slave节点第一次连接master节点时slave节点断开时间太久,repl_baklog中的offset已经被覆盖时什么时候执行增量同步?原创 2023-02-28 22:53:17 · 950 阅读 · 0 评论 -
【Redis】hmdp关注取关、共同关注、关注推送功能实现
我们在实现关注取关功能时,使用了redis的set结构存储数据,以用户id构建key,以被关注用户们的id集合为value。在这里我们有两个用户,所以有两个以被关注用户们的id集合,这两个集合可能会相交也可能不会相交,我们要做的就是取出这两个集合之中相同的部分。为用户持续的提供“沉浸式”的体验,通过无限下拉刷新获取新的信息。因为Feed流中的数据可能会更新,所以数据的角标也有可能发送变化,因此不能采用传统的分页模式。在个人主页当中,点击“关注”,前端发送一个请求去获取关注用户发布的笔记列表。原创 2023-01-31 23:59:31 · 384 阅读 · 0 评论 -
【Redis】hmdp点赞、排行榜、分页功能的实现
需求:实现步骤:在实现点赞功能前,我们还需要确定如何使用Redis来存储用户点赞记录?我们知道Redis存储的是键值对数据,那么我们可以先确定“键”的取值为: ,“值”的取值为 。确定好存储的数据之后,我们还需要考虑究竟是我们使用redis的哪种数据结构?因为点赞是有先后顺序的,所以我们采用 结构,需求和实现步骤都明晰了后我们开始实现。点击点赞按钮,发送请求:代码如下:1.5 逻辑解析代码逻辑:首先获得笔记id,拼接获得key值,再获得当前登录用户的id,根据用户id和key值查看redis中是否有原创 2023-01-31 15:31:31 · 712 阅读 · 0 评论 -
【Redis】Redis持久化策略
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。RDBAOF持久化方式定时对整个内存做快照记录每一次执行的命令数据完整性不完整,两次备份之间会丢失相对完整,取决于刷盘策略文件大小会有压缩,文件体积小记录命令,文件体积很大宕机恢复速度很快慢数据恢复优先级低,因为数据完整性不如AOF高,因为数据完整性更高系统资源占用高,大量CPU和内存消耗低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源使用场景。转载 2023-01-25 17:49:50 · 142 阅读 · 0 评论 -
【Redis】使用Redis实现签到和统计功能
Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb,内存占用低的令人发指!UV统计在服务端做会比较麻烦,因为要判断该用户是否已经统计过了,需要将统计过的用户信息保存。Hyperloglog(HLL)是从Loglog算法派生的概率算法,用于确定非常大的集合的基数,而不需要存储其所有值。从最后一次签到开始向前统计,直到遇到第一次未签到为止,计算总的签到次数,就是连续签到天数。:操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值。转载 2023-01-20 23:30:49 · 1055 阅读 · 0 评论 -
【Redis】GEO(地理坐标)数据结构
GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。一个点评平台,有多个频道,每个频道都有很多个店铺。我们按照频道类型做分组,相同频道的店铺作为同一组,以频道id为key存入同一个GEO集合中即可。其中,Value值存储店铺的id。原创 2023-01-20 18:33:15 · 2157 阅读 · 0 评论 -
【Redis】使用Redis作为消息队列
基于List的消息队列有哪些优缺点?转载 2023-01-17 21:45:05 · 852 阅读 · 0 评论 -
【Redis】使用阻塞队列+Redis优化秒杀业务
首先查询优惠券再判断秒杀库存然后查询订单......一步接着一步,整个业务的响应时间就是每步操作所花时间之和,我们将这种形式称为 `同步`。而且基本每个操作都要查询数据库。我们也知道查询数据库的时间不算快并且当并发量比较大时对数据库也不友好。所以我们需要对其进行优化。原创 2023-01-16 18:22:24 · 541 阅读 · 0 评论 -
【Redis】Redis实现分布式锁
*** 尝试获取锁* @param timeoutSec 锁持有的超时时间,过期后自动释放* @return true 代表获取锁成功;false 代表获取锁失败/*** 释放锁static {} //获取锁 @Override public boolean tryLock(long timeoutSec) {//获取线程标识 String threadId = ID_PREFIX + Thread . currentThread() . getId();原创 2023-01-15 16:17:00 · 735 阅读 · 0 评论 -
【Redis】Redis实现全局唯一ID
UUID(生成的是16进制的字符串,所以字符串包含字母,用作id不太合适)snowflake算法(雪花算法)数据库自增(用一张表单独维护自增id)每天一个key,方便统计订单量ID构造是 **时间戳 + 计数器 **原创 2023-01-13 21:17:04 · 1097 阅读 · 0 评论 -
【Redis】缓存工具封装
将封装成一个缓存工具类,方便以后重复使用。原创 2023-01-12 20:08:32 · 769 阅读 · 0 评论 -
【Redis】缓存击穿问题及其解决方案
第一个线程到来之后发现逻辑过期,于是获取互斥锁,再开启一个新线程去进行缓存重建。之后第一个线程成功缓存数据释放互斥锁之后,后面线程继续来访,发现命中缓存并且没有过期,返回重建数据。的实现思路就是在第一个线程到来的时候获取互斥锁,后面的线程来到之后尝试去获取互斥锁,获取失败,于是进行休眠重试。在线程1重建缓存的时候,线程2缓存又没命中,线程2也去重建缓存;:缓存击穿也叫做热点Key问题,就是少量被高并发访问并且缓存重建业务比较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的压力。原创 2023-01-12 15:11:38 · 3505 阅读 · 2 评论 -
【Redis】缓存雪崩问题及其解决方案
在同一时段大量的缓存key同时失效或者是Redis服务直接宕机,导致大量的请求到达数据库,给数据库带来巨大压力。如下图所示:左图为大量缓存key失效时的场景,右图为Redis服务宕机时的场景。原创 2023-01-11 16:07:58 · 272 阅读 · 0 评论 -
【Redis】缓存穿透问题及其解决方案
redis中无对应数据则再去访问数据库,如果数据库中也没有数据就再次发生了穿透;:当客户端发送请求到达redis时,发现redis中无数据,然后请求继续去查询数据库,发现数据库中也没有数据,那么为防止接下来有很多请求都来查询数据库,所以当数据库查询数据为空时,我们给redis中缓存一个空对象并设置一个过期时间TTL,那么接下来携带和第一次请求相同参数的请求就会直接在redis中获得空对象,然后直接命中返回。当中都不存在的情况,这样缓存就形同虚设,请求都会直接打到数据库。:客户端请求的数据在。原创 2023-01-11 16:02:18 · 747 阅读 · 0 评论 -
Redis 缓存击穿问题 解决方案(二) 逻辑过期
逻辑过期方案:用户查询某个热门产品信息,如果缓存未命中(即信息为空),则直接返回空,不去查询数据库。如果缓存信息命中,则判断是否逻辑过期,未过期返回缓存信息,过期则重建缓存,尝试获得互斥锁,获取失败则直接返回已过期缓存数据,获取成功则开启独立线程去重构缓存然后直接返回旧的缓存信息,重构完成之后就释放互斥锁。 由于线程获得锁之后要开启独立线程去重构缓存信息,那么我们最好提前声明定义一个线程池。 这样看来,只要命中了缓存,无论是否过期,是否获得锁看,都返回同一个缓存信息。转载 2022-09-26 16:40:05 · 2588 阅读 · 10 评论 -
Redis 缓存击穿问题 解决方案(一) 互斥锁
第一个线程过来访问,获得锁,只有第一个线程能够去直接访问数据库,然后把数据写入缓存。第二个线程过来,没得到锁,只能不断重试去获得锁,直至第一个线程释放锁,然后第二个线程就能够直接从缓存中获得数据。一个查询产品信息的方法可能会同时存在缓存穿透和缓存击穿的问题,如何同时解决这两个问题这里暂不涉及,只关注如何解决缓存击穿问题。 为防止所有请求都直接访问数据库,于是就有了如下两种解决。 接下来编写业务方法,查询一个热门产品。 缓存带来的问题有很多,有。,加锁之后线程从原来的。来解决缓存击穿问题。转载 2022-09-09 22:36:16 · 2052 阅读 · 0 评论