【2022.5.28】Redis源码 字符串源码 字符串由两个部分组成,一个是redis对象通用结构体 RedisObject ,一个是字符串特有的 SDS(Simple Dynamic String) 简单动态字符串结构体 123456789//RedisObject 16Bytesstruct RedisObject{ int4 type; //对象类型,如字符串 4bits int4 encod......
线程IO模型 阻塞型IO 在调用socket的读写方法时候,在阻塞的情况下,开始写入/读取后,除非结束不然会阻塞线程。 非阻塞型IO 非阻塞IO就是能读多少就读多少,能写多少就写多少,能读多少取决于内核为套接字分配的 读缓冲区 的字节数,能写多少取决于内核为套接字分配的 写缓冲区 的空闲空间字节数。读写完成后,直接返回,线程可以做其他事情,等待下一次读写。 事件轮询(多路复用) 在处理完其他逻辑后,需要重新读写......
Redis如何过期删除过期key-value? 惰性删除+定时删除 惰性删除:只在查询一个过期的key时执行删除操作 定时删除:每隔一段时间(默认是100ms)随机抽取一些设置了过期时间的key,检查是否过期。 Redis如何在内存即将满的时候做淘汰数据? noeviction:内存不足时拒绝写操作 allkeys-lru:当内存不足时,在键空间中,移除最新最少使用的key allkeys-random:......
什么是Redis并发竞争? 在一个服务集群同时对redis的某个key进行更新、删除时,可能会出现竞争,导致旧数据覆盖新数据存入Redis缓存中 怎么解决 在写少读多的情况下:通过分布式锁,确保同一时间只有一个服务实例在操作redis的某个数据,并且通过时间戳判断数据新旧,旧数据不能覆盖新数据 在写多读多的情况下:可以通过Redis的Lua脚本实现原子操作快速根据时间戳更新或者丢弃,但是会降低Redis的吞吐......
什么是缓存击穿? 热点数据过期后的短时间内,大量请求访问,在查询DB写入缓存的过程中,大量DB请求涌入,导致DB慢查询或者崩溃。 如何解决? 分布式互斥锁,通过分布式锁对查询进行线程数限制,并设置超时时间,超时报错。 手动过期:通过key-value格式存储数据,value为过期时间,某个线程读取到数据过期后,通过异步线程进行缓存的重新构建,避免击穿 ...
什么是缓存穿透? 非正常用户大量请求缓存中不存在的数据,导致业务逻辑去数据库查找,导致数据库崩溃。 缓存穿透解决方法 基于数据规则进行判断非法请求。 每次在数据库查询不到就写一个空值到缓存中 布隆过滤器 布隆过滤器如何更新? 尽量避免物理删除,做逻辑删除 开发定时任务,每隔几个小时,自动创建一个新的布隆过滤器数组,替换老的 ...
什么是缓存雪崩? 系统在高负载的情况下,缓存实例发生大面积宕机,导致大量请求无法通过缓存返回,直接请求数据库,导致数据库崩溃。 缓存雪崩的解决方法? 事前:使得缓存高可用 事中:使用ehcache缓存部分数据,通过hystrix做限流&降级,避免mysql崩溃 本地缓存的实时性怎么保证? 引入消息队列,数据更新时通过订阅消息队列进行本地缓存同步更新 设置一个比较短的过期时间,定期从DB重新拉取 事后......
缓存与数据库双写数据一致性问题 本质上来说,双写一致性问题是因为更新数据库和更新缓存不是原子操作,如果要做到强一致性,只能加分布式锁。不然就是做取舍问题。 缓存是用在:不经常变动,但是又经常查询,而且发生脏读不敏感的场景下使用 缓存+数据库读写模式: cache aside pattern 读的时候,先读缓存,缓存没有的话就读数据库,读到的数据库的值再存入缓存。 数据更新的时候,更新数据库,删除缓存。 ......
数据结构——列表(List) 什么是列表? Redis列表是一串字符串列表,按照插入顺序排序,可以从左边(头部)或者右边(尾部)进行数据的插入,一个列表最大支持2^32-1个元素插入。 常用命令 添加 从右边插入元素 1rpush key value [value ...] 从左边插入元素 1lpush key value [value ...] 向某个元素前/后插入元素 1linsert key befor......
前言 在前篇中,我们已经了解了redis的字符串了,接下来让我们继续学习Redis的数据结构——哈希(Hash)类型。 数据结构——哈希(hash) 什么是哈希(hash)? 如果你是Java、Python的工程师,相信你对键值(key-value)对很熟悉,在redis中hash就是一个键值对结构的数据类型,即field-value,一个hash由一个或多个field-value键值对组成。 常用命令 1......