Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作 数据库、缓存和消息中间件 。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 事务(transactions) 和不同级别的 磁盘持久化(persistence)-- RDB和AOF , 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
范围查询bitmaps, hyperloglogs 和 地理空间
(geospatial) 索引半径查询
误区1: 高性能的服务器一定是多线程的
误区2: 多线程(CPU上下文切换)一定比单线程效率高
核心: Redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,相比多线程,减少了CPU上下文切换的耗时。对于内存系统来说,没有上下文切换效率就是最高的,多次读写都是在一个CPU上的。
MySQL中的事务,要么同时成功,要么同时失败,必须保证原子性!
Redis单条命令是保证原子性的,但是Redis的事务不保证原子性!
Redis事务是没有隔离级别的概念
开启事务 – multi
命令入队 – …
执行事务 – exec
放弃事务 discard
编译型异常(命令有错)比如 set写成 se, 事务中所有的命令都不会被执行
执行时异常, 如果事务队列中存在语法性错误,比如给字符串加一,执行命令的时候,其他命令可以正常执行,错误命令抛出异常
检测某个值,其他线程不修改,该事物可以成功,如果其他线程修改了,该事物就会执行失败,
watch监视下的事务执行失败后,可以unwatch解锁,在重新开始监视
以快照的形式写入rdb文件。
如果需要进程大规模数据的恢复,且对数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
适合大规模的数据恢复
对数据的完整性要求不高
需要一定的时间间隔进行操作,如果redis意外宕机,最后一次持久化后的操作数据就没有了
fork进程的时候,会需要占用一定的内存空间
每一次修改都同步,文件的完整性比较好
每秒同步一次,可能会丢失1s的数据
相对于数据文件来说,aof远远大于rdb
修复的速度比rdb慢
AOF的运行效率也比rdb慢。
指的是将一个Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower)。 数据的复制是单向的 ,只能从主节点到从节点。Master以写为主,Slave以读为主
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种
服务冗余
负载均衡:分担服务器负载。尤其是在
写少读多的场景下,通过从节点分担读负载,可以大大提供Redis服务器的并发量
能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
哨兵集群,基于主从复制模式,所有的主从复制优点,它全有
主从可以切换,故障可以转移,系统的可用性会更好
哨兵模式就是主从模式的升级,手动转自动,更加健壮
Redis不好在线扩展,集群容量一旦到达上限,在线扩容十分麻烦
实现哨兵模式的配置很麻烦,里面有很多选择
就是用户想要查询一个数据,发现Redis中没有,也就是缓存没有命中,于是向持久层数
据库发起查询,发现也没有这个数据,于是本次查询失败。当用户很多的情况下,缓存都没有命中,又都去请求持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于缓存穿透
布隆过滤器 缓存空对象
这里需要注意和缓存穿透的区别,缓存击穿,是指一个key非常热点。在不停的扛着大量并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在也给屏蔽上凿开了一个洞
热点数据永不过期 加互斥锁
Redis高可用 多个服务器负载均衡
限流降级 加锁
数据预热 设置过期时间,均匀分布