6 篇文稿
Redis的压缩列表ziplist到紧凑列表listpack ziplist 的结构(老版本用的) 大概长这样: 每个 里: - :前一个 entry 的长度(1 或 5 字节) - :当前 entry 是字符串还是整数,长度是多少 - :真正的数据 listpack 的结构(新版本用的) 大概长这样: 每个 里: 注意两点变化: 1. 没有 prevlen 了(不再依赖“记录前一个元素长度”来反
Redis网络模型(io多路复用) 阻塞IO(Blocking IO) 假设服务端只开启一个线程处理请求,第一个请求到来,开始调用内核read函数,然后就会发生阻塞,第二个请求到来时服务端将无法处理,只能等第一个请求读取完成。这种方式的缺点很明显,每次只能处理一个请求,无法发挥cpu多核优势,性能低下。 为了解决这个问题,我们可以引入多线程,这样就可以同时处理多个请求了,但服务端可能同时有成千上万
redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性) 在项目中,我们主要通过 Redisson 的读写锁机制 来保证数据的强一致性。 当执行读取操作时,我们会加上读锁(共享锁),这样可以做到: - 读读不互斥; - 读写互斥。 而在更新数据时,我们会加上写锁(排他锁),此时写写、读写都互斥。 这样可以确保在写入数据库的同时,其他线程无法读取缓存数据,从而避免出现脏读或不一
Redis分布式锁方案 使用 Redis 的 EX实现分布式锁时,主要问题是锁过期时间不好设置:如果设置过短,业务未完成锁就过期;设置过长,会降低系统并发度。为此可以使用 Redisson 封装的分布式锁,它内部通过「看门狗机制」自动续期锁(默认锁 30 秒,每 10 秒续期一次),同时通过 Lua 脚本保证加解锁的原子性,从而确保分布式环境下的并发安全。 Redisson分布式锁自动续约机制(看
Redis 的数据过期策略 Redis 采用 「惰性删除 + 定期删除」 两种策略相结合的方式,在 CPU 性能开销 与 内存占用 之间取得平衡。 --- 一、惰性删除(Lazy Expiration) 当客户端访问或修改某个键时,Redis 会在操作前调用 函数检查该键是否已过期: - 若已过期: Redis 会立即删除该键,然后向客户端返回 。 删除方式由配置项 决定: - 若开启( ),则采
缓存穿透 缓存穿透指的是:一个缓存和数据库中都不存在的数据,由于数据库无法写入缓存,导致频繁请求直接打到数据库,从而造成数据库压力过大甚至被“打穿”。 常见的解决方法包括:缓存空值 或 布隆过滤器。 布隆过滤器由一个全 0 的位图数组和 n 个哈希函数组成。当一个数据在请求缓存前,会先经过布隆过滤器。过滤器会通过 n 个哈希函数计算出 n 个哈希值,再分别对数组长度取模,并将对应的数组下标置为 1