redis特点

 

redis非关系型数据库

特点

  多线程:6.0版本后,利用多核

  可持久化

  事务

  支持lua脚本

  分布式锁

  发布/订阅

  主从复制

  sentinel:自动故障转移

  集群

关于NoSQL

  没有表结构

  用简单键值方法来存储数据

    key是检索数据的唯一标识,redis中key都是string类型

    value作为数据存储的对象,支持多种数据结构(string、list、set、zset、hash)

 

 

事物:数据库操作的最小工作单元,是指一个完整的动作,要么全部执行,要么什么也没有做。
原子性:指的是对数据的更改,要么执行,要么不执行,一个操作不可再分

事务四大特性

原子性:是指事务作为一个整体被执行,要么成功要么失败。
  比如:转账,A给B转转账10块,那A会减少10块,B会增加10块
一致性:指事务被执行后,从一个一致性状态到另一个一致性状态。
  比如:转账,转账前,A余额10+B余额0=10;转账后,A余额0+B余额10=10
隔离性:是指多个事务并发执行时,互不影响。
  比如:转账,A给B转账,C给D转账
持久性:是指事务被执行后,结果是不可改变的
  比如:转账,A给B转完之后,A剩下0,B剩下10块

 

redis的事物不是原子性,但是redis执行每一个命令都是原子性的

以上两种的情况结果:
  语法格式错误,命令入队时就出错,事物内所有命令都不执行
  命令入队成功,执行时失败,除了失败的命令,其他命令照常执行

汇总:
  事物中如果有一条命令执行失败,后续的命令仍然会被执行,没有回滚。
  如果在组队阶段,有一个失败了,后面都不会成功;
  如果在组队阶段成功了,在执行阶段有哪个命令失败就这条失败,其他命令则正常执行,不保证都成功或都失败

 

缓存一致性问题:

  强一致性:延迟双删机制,非查询操作,前后都删除缓存
  弱一致性:定时任务,每隔10分钟把缓存删除,再重新查一下


#什么是双删机制?
  双删机制是指在更新数据库时,先将缓存中的数据删除一次,然后再更新数据库,最后再将缓存中相同的数据删除一次。这样做的目的是为了确保即使多个客户端同时访问,操作成功后缓存依然不被旧数据污染。
#为什么需要双删机制?
  在分布式系统中,数据更新时若只清空缓存一次,另一客户端仍有可能读取到旧的、未失效的数据。在高井发情况下,这可能导致数据的不一致。双删机制通过删除两次来降低这种风险。但需要注意的是,双删机制并不能完全消除缓存不一致的可能性,只是降低了概率。
#注意事项
  虽然双删机制能够有效减少缓存不一致的概率,但它并无完美之法。在高并发场景下,可能出现以下问题:
  时间窗口:在删除缓存和更新数据库之间的执行时间窗口内,可能仍有其他请求读取到旧数据。
  性能开销:双重删除操作增加了额外的延迟,可能对性能造成一定的影响。
#替代方案
  除了双删机制,还有其他一些策略可以帮助保持缓存一致性,例如:
  使用消息队列:通过将缓存删除操作放入消息队列中,确保删除指令在数据更新后异步执行。
  短期缓存有效期:设置缓存的失效时间,确保即使在未删除缓存时,旧数据也能在一定时间后失效。
  使用一致性哈希:实现对数据的加锁,防止在更新数据库时发生读取。

 

redis常见问题

  缓存穿透:缓存和数据库不存在,大量请求进来。设空值/加校验参数是否合法
  缓存击穿:某个key某个时间点失效,大量请求进来。设置热点数据不过期/加锁
  缓存雪崩:大量key某个时间点失效,大量请求进来。设置失效时间随机/设置热点数据不过期/加锁

 

posted on 2025-05-14 17:06  拾句  阅读(29)  评论(0)    收藏  举报