Redis 篇
文章平均质量分 97
还在努力中~
小扳
有一天,小扳手走进了一家五金店。它看到了各种各样的工具,有锤子、钳子、螺丝刀等等。小扳手觉得自己在这里太小了,不起眼,很容易被忽视。
展开
-
Redis 篇-深入了解 Redis 中的 RESP 通信协议与内存回收(过期 key 处理、内存淘汰策略)
删除完之后,再判断内存是否充足,如果还是不足,那么会接着循环来删除 key,如果达到充足的内存,则直接退出删除 key 的操作。若选择的删除策略为:TTL、LRU、LFU 这些策略,先创建一个池,用来存放准备删除的 key,在 Redis 数据库中从 0 直到 15 的数据库进行遍历抽样选择要放入池中的 key,默认每次抽样 5 个 key。如果当前内存不充足时,继续判断内存策略是否为默认 noeviction 策略,也就是即使内存满了,也不会执行删除 key 的操作,会发出错误信息。原创 2024-09-29 10:19:24 · 1770 阅读 · 91 评论 -
Redis 篇-深入了解在 Linux 的 Redis 网络模型结构及其流程(阻塞 IO、非阻塞 IO、IO 多路复用、异步 IO、信号驱动 IO)
1)抛开持久化不谈,Redis 是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。2)多线程会导致过多的上下文切换,带来不必要的开销。3)引入多线程会面临线程安全问题,必然要引入线程锁这样的安全手段,实现复杂度增高,而且性能也会大打折扣。原创 2024-09-26 16:28:09 · 1887 阅读 · 91 评论 -
Redis 篇-深入了解 Redis 五种数据类型和底层数据结构(SDS、Intset、Dict、ZipList、SkipList、QuickList)
每次执行新增、查询、修改、删除操作时,都检查一下 dict.rehashidx 是否大于 -1,如果是则将 dict.ht[0].table[rehashidx] 的 entry 链表 rehash 到 dict.ht[1],并且将 rehashidx++。:如果当前层已经达到目标值或找到了更大的值,改变层级,将 current 指针向下移动到下一层。5)将 dict.ht[1] 赋值给 dict.ht[0],给 dict.ht[1] 初始化为空哈希表,释放原来的 dict.ht[0] 的内存。原创 2024-09-24 15:55:26 · 1479 阅读 · 68 评论 -
Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群
在子进程写入磁盘过程中,主进程有可能会进行写操作,所有为了防止脏读的情况,在写数据的时候,将内存的数据进行拷贝,再来进行写操作。在 slave 加载 RDB 文件的时候,master 也会不断接收写操作的请求命令,这些命令会先保存到 repl_baklog 文件中,等待 slave 加载完成之后,master 发送 repl_baklog 中的命令到 slave 节点中,而 slave 节点接收到命令就会执行。重新启动该 Redis 服务之后,会自动从 RDB 文件中获取数据,重新将数据放到内存中。原创 2024-09-17 20:49:07 · 1699 阅读 · 84 评论 -
Redis 篇-深入了解使用 Redis 中的 GEO 数据结构实现查询附近店铺、BitMap 实现签到功能、HyperLogLog 实现 UV 流量统计
GEO 就是 Geolocation 的简写形式,代表地理坐标。Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。原创 2024-09-14 10:22:44 · 1523 阅读 · 65 评论 -
Redis 篇- 实战项目中使用 Redis 实现经典功能(异步秒杀商品、点赞功能、共同关注的好友、投喂功能)
查看消息的时候,按照时间来查看,从最新的时间到最旧的时间的顺序来进行查看,比如说,朋友圈,打开朋友圈最先看到的是最新的好友信息,用户查询自己的收件箱,比如像朋友圈,按照时间来排序好友发布的信息,而查看好友的朋友圈的时候,从上至下,来查看好友的消息。从用户集合中查询信息也不难,在实现的时候不就是直接去查看当前用户的收件箱,其实不然,需要考虑的细节还挺多的。原创 2024-09-11 22:29:47 · 2149 阅读 · 56 评论 -
Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)
key 为队列名称,*|ID 为消息的唯一 id,* 代表由 Redis 自动生成。group 代表组名,consumer 代表组内消费者名称,count 代表每次读取的最大数量,milliseconds 代表当没有消息时最长的等待时间,NOACK 代表无需手动 ACK,获取消息后自动确认。当使用 Stream 单消费者模式的时候,我们指定起始 ID 为 $ 时,代表读取最新的消息,如果我们处理一条消息的过程中,又有超过 1 条以上的消息到达队列,则下次获取时也只能获取到最新的一条,会出现漏读消息的问题。原创 2024-09-10 10:14:04 · 1695 阅读 · 51 评论 -
Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)
Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网络。它不仅提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务,其中包含了各种分布式锁的实现。Redisson 解决了不可重入问题、不可重试问题、超时释放问题、主从一致性问题。比如说,分布式锁的可重入锁、公平锁、联锁、红锁等等。原创 2024-09-08 21:36:17 · 2552 阅读 · 50 评论 -
Redis 篇-深入了解基于 Redis 实现分布式锁(解决多线程安全问题、锁误删问题和确保锁的原子性问题)
假设线程一正常获取锁之后,执行任务,但是该任务出现了阻塞情况,等待的时间较久,此时当锁到过期时间之后,就会自动被释放了,当时此时线程一还不知道当前锁被释放了,就在这时候,线程二来正常的获取锁,因为锁已经被释放了,所以线程二是可以获取锁成功的,接着,线程二获取锁之后,就开始执行任务了,此刻线程一任务执行完之后,会直接释放锁,这就出现线程一误删了线程二的锁问题。为了解决 Redis 分布式锁被误删的问题,可以想到的办法是:在释放锁之前,判断当前的锁 “是否” 是自己之前获取的锁,如果是,则可以直接释放锁;原创 2024-09-07 18:03:03 · 1868 阅读 · 36 评论 -
Redis 篇-深入了解查询缓存与缓存所带来的问题(读写不一致、缓存穿透、缓存雪崩、缓存击穿)
如果没有命中,根据用户 id 到数据库中查询用户信息,如果用户信息不为 null ,则说明用户信息是存在的,那么将用户信息写回到缓存中,方便下一次查询可以直接从缓存中获取用户信息;第一次会到数据库查询该用户信息,当该用户信息不存在时,则会在 redis 中设置空值,这样的好处,下一次的查询该用户,就不会打到数据库中了,减少了数据库的压力。设置缓存中 key 的逻辑过期,顾名思义:在实际上,缓存中的 key 是设置永远不过期,将其添加过期字段,通过查看该字段,来判断该 key 在缓存中是否已经过期了。原创 2024-09-03 10:30:36 · 2360 阅读 · 63 评论 -
SpringBootWeb 篇-深入了解 Redis 五种类型命令与如何在 Java 中操作 Redis
redis.windows.conf:配置文件,用来配置 Redis 服务器的各种参数和选项。redis-server.exe:Redis 服务端可执行文件,用来启动 Redis 服务端。redis-cli.exe:Redis 客户端可执行文件,用来启动 Redis 客户端。原创 2024-06-10 10:29:07 · 15324 阅读 · 98 评论