InnoDB如何引擎通过Next-Key Lock部分解决幻读

1. 幻读问题概述

幻读是数据库并发事务中最棘手的一类问题。它指在同一事务内,连续执行两次相同的查询语句,第二次查询所返回的结果集与第一次查询的结果集不同。具体表现为:新增了符合查询条件的行

示例场景

1
2
3
4
5
6
7
8
9
10
-- 事务A
BEGIN;
SELECT * FROM users WHERE age BETWEEN 20 AND 30;

-- 此时事务B插入了一条新记录
INSERT INTO users (name, age) VALUES ('NewUser', 25);

-- 事务A再次查询
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- 发现多了一条记录,即"幻读"
阅读更多

SQL事务隔离级别详解

为什么需要事务隔离级别?

在并发环境下,多个事务同时操作数据库时会产生各种并发问题。如果不进行隔离控制,可能会导致数据的不一致性。主要会出现以下问题:

1. 脏读(Dirty Read)

  • 定义:一个事务读取到另一个事务未提交的数据
  • 危害:可能导致业务决策建立在不可靠的数据之上
阅读更多

缓存与数据库一致性问题研究

缓存的查询

先查询缓存,如果查询失败,那么去查询DB,之后重建缓存,基本上不存在异议。

缓存的更新

先更新DB还是先更新缓存?是更新缓存还是删除缓存?在常规情况下,怎么操作都可以,但一旦面对高并发场景,就值得细细思量了。

先更新数据库再更新缓存

线程A:更新数据库(第1s)——> 更新缓存(第10s)

阅读更多

Redis 跳表

前言

本文整体脉络如下图所示,笔者会从有序集合的基本使用到跳表的源码分析和实现,让你会对 Redis 的有序集合底层实现的跳表有着更深刻的理解和掌握。

跳表在 Redis 中的运用

这里我们需要先了解一下 Redis 用到跳表的数据结构有序集合的使用,Redis 有个比较常用的数据结构叫**有序集合(sorted set,简称 zset)**,正如其名它是一个可以保证有序且元素唯一的集合,所以它经常用于排行榜等需要进行统计排列的场景。

阅读更多

Redis 内存淘汰策略

Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。

1、通过配置文件配置

通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小

1
//设置Redis最大占用内存大小为100Mmaxmemory 100mb复制代码
阅读更多

数据分区理论

分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。

哈希算法

我们可能很快就想到了:哈希算法。因为对同一个关键字进行哈希计算,每次计算都是相同的值,这样就可以将某个 key 确定到一个节点了,可以满足分布式系统的负载均衡需求。

哈希算法最简单的做法就是进行取模运算,比如分布式系统中有 3 个节点,基于 hash(key) % 3 公式对数据进行了映射。

如果客户端要获取指定 key 的数据,通过下面的公式可以定位节点:

阅读更多

MySQL 索引二

索引介绍

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。

索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。

索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。

索引的优缺点

优点

阅读更多

Redis 集群

Sentinel 是HA(高可用)解决方案, Cluster与客户端分片是sharding(分布式数据库)方案

一. Sentinel模式

  • 什么是哨兵(Sentinel):

    由一个或多个Sentinel实例组成的Sentinel系统可以监视(十秒发送一个INFO心跳)多个主服务器,以及这些主服务器属下的所有从服务器.

    在被监视的主服务器进入下线状态时(因为一个主服务器负责本集群的一个Redis分片/一部分槽),哨兵们会从下线的主服务器属下的从服务器中挑选一个升级为新的主服务器.这个过程也叫故障转移操作.

阅读更多

Redis 实现商品秒杀

项目场景

实现一个商品秒杀的功能,能后台自定义秒杀时间段、商品库存等信息。

一、设计思路

这里简单分享下思路:

1.限流

秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增,由于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。这里使用基于Redis简单粗暴的限流方案:信号量(Semaphore)

阅读更多

Redis 持久化与复制

一.RDB持久化

 将当前数据库状态(当前保存的键值对)做一个快照,生成一个经过压缩的二进制文件,通过该文件可还原到生成RDB文件时的数据库状态.

二.AOF持久化

通过保存Redis服务器所执行的写命令生成AOF文件来记录数据库状态

  • 实现方式:

    1. 命令追加: 执行完一个写命令后,以协议格式将写命令追加到aof_buf缓冲区末尾

阅读更多