Redis

Redis 黑马程序员Redis入门到实战教程 1 基本概念 1.1 Redis(::Re::mote ::Di::ctionary ::S::erver) 键值型存储,value支持多种不同数据结构。 单线程,每个命令具备原子性。(6.0之后的多线程仅是在网络处理部分,核心命令执行还是单线程) 低延迟,速度快(基于内存、IO多路复用、良好的编码)。 支持数据持久化。 支持主从集群和分片集群。 支持多语言客户端。 1.2 SQL和NoSQL SQL(Structured Query Language):结构化的、关联的、SQL查询(语法固定)、事务(ACID) NoSQL(Not only SQL):非结构的、非关联的、非SQL的(语法不固定,不统一)、不一定满足事务全部要求(BASE) 键值对:Redis 文档:MongoDB 图:Neo4j 列:HBase 1.3 Redis通用命令 // 1. 列出所有符合条件的key : KEYS [pattern] KEYS * KEYS a* // 2. 删除所有指定的key : DEL key [key ...] // 3. 判断key是否存在 : EXISTS key [key ...] // 4. 给一个key设置有效期,过期自动删除 : EXPIRE key seconds // 5. 查看命令具体用法 : help [command] // 6. 查看一个key的有效期 : TTL key 2 底层数据结构 Redis是一个key-value数据库,key一般是String类型,不过value的类型有很多:...

August 18, 2024 · 6 min · 1108 words · RLTEA

Redis补充

Redis补充 1 Redis网络模型 Redis的核心业务部分(命令处理)是单线程,但是整个Redis是多线程的。 v4.0:引入多线程异步处理一些耗时较长的任务,例如异步删除命令unlink。 v6.0:在核心网络模型中引入多线程,进一步提高对于多核CPU的利用率,但是核心部分依然是单线程。 为什么选择单线程? 性能瓶颈是网络延迟,不是执行速度,多线程并不会带来巨大性能提升。 多线程会导致过多的上下文切换,带来不必要的开销。 引入多线程可能会面临线程安全问题,必须引入线程锁这样的安全手段,实现复杂度增高,性能也大打折扣。 原理篇-27.Redis网络模型-Redis单线程及多线程网络模型变更_哔哩哔哩_bilibili 2 Redis通信协议 RESP协议 原理篇-28.Redis通信协议-RESP协议_哔哩哔哩_bilibili 3 Redis事务 Redis事务的三个阶段 MULTI %事务开始 ... %命令入队 EXEC %事务执行 Redis事务特点 redis不支持回滚,事务失败,继续执行余下的命令 事物内部命令错误,所有命令都不会执行 事物内部出现运行错误,正确的命令会被执行 Redis事务没有原子性,持久性仅在开启AOF的always模式下支持。 Redis事务总是有隔离性(单线程)和一致性。 Redis事务相关命令 WATCH:乐观锁,给事务提供CAS机制,可以监控一个或者多个键,一旦其中有一个被修改,之后的事务就不会执行,监控一直持续到EXEC或者UNWATCH。 MULTI:用于开启事务,开启后可以继续送入命令,当EXEC被调用时,才被执行。 EXEC:执行事务块内所有命令,返回所有命令的返回值,按照命令先后排序。 DISCARD:清空事务队列,放弃执行事务。 UNWATCH:取消watch对所有key的监控。 4 缓存和数据库的一致性 设置有效期:给缓存设置有效期,到期自动删除,再次查询时更新 优势:简单方便 缺点:时效性差,缓存过期之前可能不一致 场景:更新频率较低,时效性要求较低的业务 同步双写:在修改数据库的同时,直接修改缓存 优势:时效性强,缓存与数据库强一致 缺点:有代码侵入,耦合度高 场景:对一致性,时效性要求较高的缓存数据 异步通知:在修改数据库时发送事件通知,相关服务监听到通知后修改缓存数据 优势:低耦合,可以同时通知多个缓存服务 缺点:时效性一般,可能存在中间不一致状态 场景:时效性要求一般,有多个服务需要同步 基于MQ的异步通知,对业务代码仍然有一定侵入性 基于Cannal的异步通知,可以做到几乎0侵入 4.1 缓存更新策略 删除缓存而不是更新缓存 先删数据,后删缓存 4.2 缓存不一致处理 使用消息队列,把要删除和删除失败的key放入消息队列,利用重试机制,删除对应的key 对代码有侵入性 数据库订阅+消息队列保证key被删除 利用canal或其他服务监听binlog 复杂度提升 延时双删防止脏数据 延迟时间需要具体的考量和测试 设置过期时间兜底 5 热key重建 使用互斥锁,保证只有一个线程重建,其他线程等待该线程重建完后,获取缓存数据即可。 不显示设置过期时间,而是设置逻辑过期字段,发现逻辑过期后,采用单独的线程构建缓存。 6 大key问题 单个简单key存储的value过大,hash、set、zset、list中存储过多元素。...

August 18, 2024 · 1 min · 166 words · RLTEA