参考
- http://www.redis.cn/
- https://www.runoob.com/redis/redis-data-types.html
- https://developer.aliyun.com/article/1095427
- https://zhuanlan.zhihu.com/p/445885116
- https://blog.csdn.net/liu_dongdong55/article/details/120881332
- https://blog.csdn.net/weixin_43520450/article/details/107548277
- https://zhuanlan.zhihu.com/p/100885432
- https://zhuanlan.zhihu.com/p/340082703
- https://blog.csdn.net/w15558056319/article/details/121490953
- https://zhuanlan.zhihu.com/p/354720754
- https://www.cnblogs.com/myseries/p/12853369.html
正文
类型
- 字符串(strings): 一个 key 对应一个 value
- 散列(hashes): 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
- 列表(lists): 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
- 集合(sets): Set 是 string 类型的无序集合。
- 有序集合(sorted sets) : zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。成员是唯一的,但分数(score)却可以重复。
- bitmaps: 即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)。由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。
- hyperloglogs : 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
- 地理空间(geospatial): GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。
事务
-
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令
-
Redis 事务语法性错误会正常执行事务的其他命令,编译性错误(语法错误)则所有命令都不执行。
-
Watch 命令,乐观锁监听缓存,缓存不一致则会导致当前事务提交失败。
持久化
-
RDB (默认开启) :
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。三种触发持久化机制:save、bgsave、自动化。
性能好,但数据持久化存在间隔,可能丢失数据。 -
AOF:
工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。持久化配置:always、everysec(默认)、no。
数据最多丢失1s,恢复慢,如果设置为 always 则影响磁盘 io。 -
RDB+AOF 混合:
混合持久化并不是一种全新的持久化方式,而是对已有方式的优化。混合持久化只发生于 AOF 重写过程。使用了混合持久化,重写后的新 AOF 文件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。
优点:结合 RDB 和 AOF 的优点, 更快的重写和恢复。
缺点:AOF 文件里面的 RDB 部分不再是 AOF 格式,可读性差。
订阅发布模式
和之前用过的 WebSocket 很像,简版 RabbitMQ。
集群
哨兵模式可以自动选举主节点,当主节点出故障时自动选举出来新主节点。
- 建议至少3台,1主2从。
- 支持命令配置集群(重启失效)、配置文件(一直生效)配置集群。
- 主节点可以读写,从节点只读。
- 从节点也包含从节点,从节点也是只读不可写的。
主从复制原理
- 从节点首次加入或重新连接,会完整复制主节点,然后新操作会追加。
哨兵模式
哨兵是Redis的一种运行模式,它专注于对Redis实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个Redis系统的可用性。
- 监控(Monitoring):持续监控Redis主节点、从节点是否处于预期的工作状态。
- 通知(Notification):哨兵可以把Redis实例的运行故障信息通过API通知监控系统或者其他应用程序。
- 自动故障恢复(Automatic failover):当主节点运行故障时,哨兵会启动自动故障恢复流程:某个从节点会升级为主节点,其他从节点会使用新的主节点进行主从复制,通知客户端使用新的主节点进行。
- 配置中心(Configuration provider):哨兵可以作为客户端服务发现的授权源,客户端连接到哨兵请求给定服务的Redis主节点地址。如果发生故障转移,哨兵会通知新的地址。这里要注意:哨兵并不是Redis代理,只是为客户端提供了Redis主从节点的地址信息。
穿透、雪崩和击穿
- 雪崩:雪崩就是指缓存中大批量热点数据过期后系统涌入大量查询请求,因为大部分数据在Redis层已经失效,请求渗透到数据库层,大批量请求犹如洪水一般涌入,引起数据库压力造成查询堵塞甚至宕机。
解决:redis 高可用,主从+哨兵;限流&降级;redis 持久化,重启快速恢复; - 穿透:对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。
解决:每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。 - 击穿:缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。
解决:可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。