服务限流
对软件系统来讲,限流就是对请求的速率进行限制,避免瞬时的大量请求击垮软件系统。因为软件系统的处理能力是有限的,当超过了其处理能力的范围,软件系统可能直接宕机。限流可能会导致用户的请求无法被正确处理或者无法立即被处理,不过,这往往也是权衡了软件系统的稳定性之后得到的最优解。
现实生活中,处处都有限流的实际应用,就比如排队买票是为了避免大量用户涌入购票而导致售票员无法处理。
本文主要介绍了常见的限流算法、限流对象的选择以及单机限流和分布式限流分别应该怎么实现。
参考文章:
服务限流详解
常见限流算法简单介绍 4 种非常好理解并且容易实现的限流算法!
图片来源于 InfoQ 的一篇文章《分布式服务限流实战,已经为你排好坑了》。
固定窗口计数器算法固定窗口其实就是时间窗口,其原理是将时间划分为固定大小的窗口,在每个窗口内限制请求的数量或速率,即固定窗口计数器算法规定了系统单位时间处理的请求数量。
假如我们规定系统中某个接口 1 分钟只能被访问 33 次的话,使用固定窗口计数器算法的实现思路如下:
将时间划分固定大小窗口,这里是 1 分钟一个窗口。
给定一个变量 counter 来记录 ...
Redis的持久化机制
使用缓存时经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中。大部分原因是为了之后重用数据(比如重启机器、机器故障之后恢复数据),或是为了做数据同步(比如 Redis 集群的主从节点通过 RDB 文件同步数据)。Redis 持久化机制(RDB 持久化、AOF 持久化、RDB 和 AOF 的混合持久化)相关的问题比较多,也比较重要,本文总结了 Redis 持久化机制相关的知识点和问题。
参考文章:
Redis 持久化机制详解
Redis持久化机制Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式:
快照(snapshotting,RDB)
只追加文件(append-only file, AOF)
RDB 和 AOF 的混合持久化(Redis 4.0 新增)
RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
数据备份机制RDB(默认):数据每隔一段时间写进磁盘rdb文件,故障后从文件读。可以在redis.conf配置多少秒内多少key修改时自动bgsave。占CPU和内存但恢复 ...
三大缓存读写策略
Cache的读写策略是指在计算机系统中,对于缓存(Cache)的数据读取和写入操作所采取的策略和方法。不同读写策略可根据系统需求和应用场景进行选择和配置,以达到最优性能和效果。本文简单记录了三大缓存读写策略旁路缓存模式、读写穿透、异步缓存写入,它们各有优劣不存在最佳模式,根据具体的业务场景选择适合的缓存读写模式。
参考文章:
3种常用的缓存读写策略详解
Cache Aside Pattern(旁路缓存模式)Cache Aside Pattern :平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。该策略中服务端需要同时维系 db 和 cache,并且以 db 的结果为准。
缓存读写步骤写:由应用先更新 db;然后应用再直接删除 cache 。
读 :应用从 cache 中读取数据,读取到就直接返回;若读取不到应用就会从 db 中读取数据返回;然后应用再把数据写到 cache 中。
**在写数据的过程中,是否可以先删除 cache 后更新 db? **
答案:肯定不可以!因为这样可能会造成 数据库(db)和缓存(Cache)数据不一致的问题。
举例:请求 1 先写数据 ...
Redis缓存与数据库的一致性
在处理涉及 Redis 和数据库(如 MySQL)的应用时,确保数据的一致性是非常关键的。特别是在高并发环境下,数据的一致性问题可能会变得尤为突出。
推荐文章:
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
四种基础同步策略保证缓存和数据库的双写一致性,共有四种同步策略,即先更新缓存再更新数据库、先更新数据库再更新缓存、先删除缓存再更新数据库、先更新数据库再删除缓存。
先更新缓存再更新数据库:第二步失败缓存库是脏数据
先更新数据库再更新缓存:第二步失败缓存库是旧数据
先删除缓存再更新数据库:第二步失败缓存库是空数据
先更新数据库、再删除缓存(推荐):第二步失败缓存库是旧数据
更新缓存还是删除缓存更新缓存的优缺点更新缓存的优点是每次数据变化时都能及时地更新缓存,这样不容易出现查询未命中的情况,但这种操作的消耗很大,如果数据需要经过复杂的计算再写入缓存的话,频繁的更新缓存会影响到服务器的性能。如果是写入数据比较频繁的场景,可能会导致频繁的更新缓存却没有业务来读取该数据。
删除缓存的优缺点(推荐)删除缓存的优点是操作简单,无论更新的操作复杂与否 ...
Redis的缓存穿透、缓存击穿、缓存雪崩
本文简单记录了Redis的缓存穿透、缓存击穿、缓存雪崩三大常见生产问题,及对应的解决方案。
推荐文章:
Redis常见面试题总结(下)
缓存穿透简介缓存穿透:简单来说就是大量请求的 key 是不合理的,缓存和数据库中都不存在,可用户仍源源不断的发起请求,导致每次请求都到数据库,从而压垮数据库。
举例:某黑客故意制造一些非法的 key 发起大量请求,导致大量请求落到数据库,结果数据库上也没有查到对应的数据。也就是说这些请求最终都落到了数据库上,对数据库造成了巨大的压力。
解决办法
业务层校验
用户发过来的请求,根据请求参数进行校验,对于明显错误的参数,直接拦截返回。
如请求参数为主键自增id,那么对于请求小于0的id参数,可以直接返回错误请求。
如传入的邮箱格式不对时直接返回错误消息给客户端。
不存在数据设置短过期时间
对于某个查询为空的数据,可以将这个空结果进行Redis缓存,但设置很短的过期时间,命令:SET key value EX 30000。
这种方式可解决请求 key 变化不频繁的情况,若黑客恶意攻击,每次构建不同的请求 key,会导致 Redis 缓存大量无 ...
达梦数据库SQL操作
达梦数据库(DM Database)是一款由中国公司自主研发的关系型数据库管理系统。它在安全性、性能、易用性等方面具有许多独特的优势。本文简单记录其 sql 简单使用。更多 SQL 语言使用说明,请参考《DM_SQL 语言使用手册》,手册位于数据库安装路径 /dmdbms/doc 文件夹下。如有其他问题,请在社区内咨询。
参考文章:
达梦技术文档
常规数据类型DM SQL 程序支持所有的 DM SQL 数据类型,包括:精确数值数据类型、近似数值数据类型、字符数据类型、多媒体数据类型、一般日期时间数据类型、时间间隔数据类型。此外,DM SQL 还扩展支持了 %TYPE、%ROWTYPE、记录类型、数组类型、集合类型和类类型,用户还可以定义自己的子类型。
DM 数据库具有 SQL-92 的绝大部分数据类型,常规数据类型主要包括如下几大类:
字符数据类型
数值数据类型
位串数据类型,即 bit 类型
日期时间数据类型,包括一般日期时间数据类型、时区数据类型和时间间隔数据类型
多媒体数据类型,主要包括两种格式,字符串和二进制
字符数据类型根据数据库初始化时的参数不同,字符串中能存储的汉 ...
达梦数据库基础
达梦数据库(DM Database)是一款由中国公司自主研发的关系型数据库管理系统。它在安全性、性能、易用性等方面具有许多独特的优势。本文简单记录其基本特性,下载安装。
参考文章:
达梦数据库的基础认识与使用
达梦技术文档
达梦数据库基础DM 特点达梦数据库在安全性、高性能、高可用、易用性、可扩展性等方面具有许多独特的优势,具体如下。
高安全性 多层安全机制:达梦数据库提供了多层次的安全机制,包括用户认证、权限管理、审计日志等。 加密技术:支持数据传输加密和存储加密,确保数据在传输和存储过程中的安全性。 合规性:符合国家信息安全标准,支持国密算法(如SM2、SM3、SM4),适用于政府、金融等高安全要求的行业。
高性能 并行处理:支持并行查询和并行加载,能够高效处理大规模数据。 优化器:智能查询优化器能够自动选择最优的查询计划,提高查询性能。 缓存机制:高效的缓存机制减少了磁盘I/O操作,提高了整体性能。
高可用性 集群支持:支持多种高可用架构,如主备复制、分布式集群等,确保系统的高可用性和故障恢复能力。 自动故障切换:在发生故障时,系统可以自动切换到备用节点,保证业务连续性。 ...
Redis集群
在互联网高并发、海量数据的场景下,单机 Redis 已无法满足系统对性能、存储和高可用性的需求。Redis 集群作为分布式缓存的终极解决方案,通过巧妙的架构设计实现了数据分片、自动故障转移和动态扩容。本文记录了相关原理、 Redis 集群的核心机制,及完整的实战部署流程。本文简单介绍了Redis的三种集群部署模式:主从模式,Sentinel(哨兵)模式,Cluster模式。
参考文章:
Redis集群部署的三种模式
Redis 集群模式Rdis最开始使用主从模式做集群,若master宕机需手动配置slave转为master;后来为了高可用提出哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。
三种集群模式对比Redis 发展至今形成了三种典型的集群模式,每种模式都针对不同的业务需求进行了优化:
模式
版本
核心优势
局限性
主从模式
Redis 2.8前
数据备份与读写分离
手动故障转移、无法动态扩容
哨兵模式
Redis 2.8 ...
Redis支持的数据类型
Redis(Remote Dictionary Server),远程字典服务,是用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,提供多种语言的API。
参考文章:
Redis 5 种基本数据类型详解
Redis 3 种特殊数据类型详解
Bloom filter(布隆过滤器)
【redis】数据类型之Bitfields
Redis 支持的数据类型
5 种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。
3 种特殊数据类型:HyperLogLog(基数统计)、Bitmap (位图)、Geospatial (地理位置)。
此外,还有一些其他的,比如 Bloom filter(布隆过滤器)、Bitfield(位域)。
5 种基本数据类型Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。
这 5 种数据类型是直接提供给用户使用的,是数据的保存形式,其底层实现主要依赖这 8 种数据结构:简单动态字符串(SDS)、 ...
分布式锁详解
分布式锁的英文是Distributed Lock。该术语用于描述在多节点系统中控制资源访问的关键技术,通过协调各节点对共享资源的操作权限,确保同一时刻只有一个节点能持有锁。
多线程环境中,线程之间常用互斥锁实现共享资源的独占访问。在多进程环境,特别是分布式环境,常使用分布式锁来实现共享资源的独占访问。简单来说,分布式锁就是指在分布式环境下,通过加解锁实现多节点对共享资源的互斥访问。
参考文章:
分布式锁介绍
分布式锁常见实现方案总结
分布式锁分布式锁的用途:分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。• 分布式锁应具备的条件:互斥、高可用、可重入、高性能、非阻塞。• 分布式锁的常见实现方式:关系型数据库比如 MySQL、分布式协调服务 ZooKeeper、分布式键值存储系统比如 Redis 、Etcd 。
分布式锁分布式锁
控制分布式系统不同进程共同访问共享资源的一种锁的实现。
如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性 ...




