Redis缓存和数据库一致性问题
Redis缓存和数据库一致性问题缓存应用和数据库在更新时经常会出现不一致的问题,采用哪种策略,值得去思考。从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。因此,接下来讨论的思路不依赖于给缓存设置过期时间这个方案。
先删除缓存,再更新数据库
该方案会导致不一致的原因是。同时有一个请求A进行更新操作,另一个请求B进行查询操作。那么会出现如下情形:(1)请求A进行写操作,删除缓存(2)请求B查询发现缓存不存在(3)请求B去数据库查询得到旧值(4)请求B将旧值写入缓存(5)请求A将新值写入数据库上述情况就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。那么,如何解决呢?采用延时双删策略
123456public void write(String key,Object data){ redisUtils. ...
redis分布式锁
背景为了保证数据的一致性,在一些业务处理中都会选择加锁来保证数据的一致性。在单机模式下我们通常选择使用synchronized等这种JAVA提供好的jvm锁来实现,但是在集群和分布式情况下,这种jvm级别的锁式无法满足我们的需求,因为一个服务部署在多台服务器上,这些服务器上的jvm是无法通讯的,所以我们需要一种方案来解决分布式情况下数据一致性。
在互联网公司,基本上企业内部都会有自己的一套分布式锁开发框架
前言分布式锁一般有三种实现方式:
数据库乐观锁
基于redis实现分布式锁
基于zooKeeper实习哪分布式锁
本次讲着重介绍redis实现分布式锁,和与数据库和zooKeeper实习分布式锁的对比。
可靠性为了保证分布式锁的可用,我们至少要保证锁的实现同时满足以下四个条件:
互斥性。在任意时刻,只能有一个客户端持有锁
不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁
具有容错性。只要大部分的redis节点正常运行,客户端就可以加锁和解锁
解铃还须系铃人。加锁和解锁的对象必须是同一个客户端,客户端不能把别人加的锁给解了。
redi ...
redis面试题
在分布式数据库中CAP原理CAP+BASECAP123456789C:Consistency(强一致性)A:Availability(可用性)P:Partition tolerance(分区容错性)注意:分布式架构的时候必须做出取舍。一致性和可用性之间取一个平衡。多余大多数web应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向
经典CAP图123456CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类:CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
BaseBASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。
BASE其实是下面三个术语的缩写: 基本可用(Basically Ava ...
MySQL面试题
列式数据库的使用场景mysql为什么用b+树而不用跳表mysql走索引时范围查询和等值查询的io次数
MySQL进阶部分
一、MySQL的架构介绍1.MySql简介 概述:
2.MySQL逻辑架构介绍
1.Connectors指的是不同语言中与SQL的交互
2 Management Serveices & Utilities:系统管理和控制工具
3 Connection Pool: 连接池管理缓冲用户连接,线程处理等需要缓存的需求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
4 SQL Interface: SQL接口。接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5 Parser: 解析器。SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由 ...
docker安装redis集群
拉取镜像1docker pull redis:5.0.5
创建redis容器创建三个 redis 容器:
redis-node1:6380
redis-node2:6381
redis-node3:6382
12345docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6380docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6381docker create --name redis-node3 --net host -v /data/redis-data ...
ShardingSphere
什么是 ShardingSphereApache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。
一套开源的分布式数据库中间件解决方案。
有三个产品:JDBC、Proxy、Sidecar。
什么是分库分表当我们使用读写分离、索引、缓存后,数据库的压力还是很大的时候,这就需要使用到数据库拆分了。
数据库拆分简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。
分库分表之垂直拆分专库专用。一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。如下图:
优点:
拆分后业务清晰,拆分规则明确。
系统之间整合或扩展容易。
数 ...
MySQL基础部分
一、为什么要学习数据库数据库的好处 1.持久化数据到本地 2.可以实现结构化查询,方便管理
二、数据库的相关概念 1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和DBMS通信的语言
三、数据库存储数据的特点 1、将数据放到表中,表再放到库中 2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。 4、表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性” 5、表中的数据是按行存储的,每一行类似于java中的“对象”。
四、初始MySQLMySQL产品的介绍MySQL产品的安装MySQL服务的启动和停止 方式一:计算机——右击管理——服务 方式二:通过管理员身份运行 net start 服务名(启动服务) net stop ...
Elasticsearch概述
第1章 Elasticsearch概述01-开篇教学视频
结构化数据
非结构化数据
半结构化数据
02-技术选型Elasticsearch 是什么The Elastic Stack, 包括 Elasticsearch、 Kibana、 Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。
Elaticsearch,简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎, 是整个 ElasticStack 技术栈的核心。
它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
elastic英 [ɪˈlæstɪk] 美 [ɪˈlæstɪk]n. 橡皮圈(或带);松紧带adj. 橡皮圈(或带)的;有弹性的;有弹力的;灵活的;可改变的;可伸缩的
全文搜索引擎Google,百度类的网站搜索,它们都是根据网页中的关键字生成索引,我们在搜索的时候输入关键字,它们会将该关键字即索引匹配到的所有网页返回;还有常见的项目中应用日志的搜索等等。对于这些非 ...
面试之算法1
题目原题目:
12Given two array A, B, in all the indexes o array A elements which are also n array B. For example a = [5,3,1,5,4],b =[5,3],and the resutis [0,1,3]
翻译后:给定两个数组A、B,找出两个数组中重复的A的索引下标
思路思路1:双重for循环暴力破解i,时间复杂度O(n^2^),然后用一个list存放结果
思路2:先把一个数组放入hashmap中,然后再把一个数组放入hashmap,如果有重复那么就不能放入,然后把下标放入list队列,时间复杂度O(N)
思路3:因为hashmap是Api,所以如果这不考虑移除且数组中的数是正整数,那么可以考虑使用一个数组,把值当做索引存入,时间复杂度O(N)
实现暴力破解
基本排序算法
排序类型
平均情况
最好情况
最坏情况
辅助空间
稳定性
冒泡排序
O(n²)
O(n)
O(n²)
O(1)
稳定
选择排序
O(n²)
O(n²)
O(n²)
O(1)
不稳定
直接插入排序
O(n²)
O(n)
O(n²)
O(1)
稳定
折半插入排序
O(n²)
O(n)
O(n²)
O(1)
稳定
希尔排序
O(n^1.3)
O(nlogn)
O(n²)
O(1)
不稳定
归并排序
O(nlog₂n)
O(nlog₂n)
O(nlog₂n)
O(n)
稳定
快速排序
O(nlog₂n)
O(nlog₂n)
O(n²)
O(nlog₂n)
不稳定
堆排序
O(nlog₂n)
O(nlog₂n)
O(nlog₂n)
O(1)
不稳定
计数排序
O(n+k)
O(n+k)
O(n+k)
O(k)
稳定
桶排序
O(n+k)
O(n+k)
O(n²)
O(n+k)
(不)稳定
基数排序
O(d(n+k))
O(d(n+k))
O(d(n+kd))
O(n+kd)
稳定
推荐文章:https://www.cnblogs.com ...
剑指 Offer II 099. 最小路径之和
剑指 Offer II 099. 最小路径之和题目
12345678910111213141516171819202122给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例 1:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]输出:12 提示:m == grid.lengthn == grid[i].length1 <= m, n <= 2000 <= grid[i][j] <= 100
思路这种肯定是通过动态规划实现的,但是我们可以通过递归到记忆化递归到动态规划的思路
实现递归之穷举本解法思路:从左上角开始,穷举每一个位置,找到每一个位置到1的各种可能的路径,我拿到最小的哪一个就可以啦。
123456789101112131415161718192021222324252627282930313233 ...
动态规划
动态规划动态规划题目的特点
计数
求最大最小值
求存在性
最后都是得出一个最优值,而不是所有的可能性。
动态规划解题思路有2,5,7三种类型的硬币,求用这三种硬币拼出来的总量为27,但是用的硬币个数最小。
组成部分一:确定状态也就是说,在解动态规划问题的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么
确定状态需要两个意识:
最后一步也就是最后存在的解
例如:
这个题一定存在一个解,即K枚硬币组合在一起达到了总量为27
关键点1我们不关心前面的k-1枚硬币是怎么拼出来27-aK的(可能有一种拼法,可能有100种拼法),而且我们现在甚至还不知道ak和K,但是我们确定前面的硬币拼出了27-ak
##### 关键点2
因为是最优策略,所以拼出27-ak的硬币数量一定要最小,否则这就不是最优策略了
需要最小的硬币数,所以:
这个时候,我们可以用递归方法解题
但是有一个问题,递归是从上到下进行计算的,这样的话会产生大量的重复运算
所以说,这不是一个好的解法,解决方法就是将计算结果保存下来,改变计算顺序
看到这里是不是感觉好像记忆化递归的逆序,没错!这就是 ...
95%算法思想
算法思想是解决问题的核心,万丈高楼起于平地,在算法中也是如此,95% 的算法都是基于这 6 种算法思想,接下了介绍一下这 6 种算法思想,帮助你理解及解决各种算法问题。
1 递归算法1.1 算法策略递归算法是一种直接或者间接调用自身函数或者方法的算法。
递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。
优缺点:
优点:实现简单易上手
缺点:递归算法对常用的算法如普通循环等,运行效率较低;并且在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,递归太深,容易发生栈溢出
1.2 适用场景递归算法一般用于解决三类问题:
数据的定义是按递归定义的。(斐波那契数列)
问题解法按递归算法实现。(回溯)
数据的结构形式是按递归定义的。(树的遍历,图的搜索)
递归的解题策略:
第一步:明确你这个函数的输入输出,先不管函数里面的代码什么,而是要先明白,你这个函数的输入是什么,输出为何什么,功能是什么,要完成什么样的一件事。
第二步:寻找递归结束条件,我们需要找出什么时候递归结束,之 ...
剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 36. 二叉搜索树与双向链表题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
思路这个题目的意思是,把一个二叉搜索树转化为一个链表,这个链表的顺序是从小到大的排序的双向环装链表。
这个样的话,我们可以先把这个节点进行一个中序遍历,中序遍历的结果就是一个顺序的
123456789// 打印中序遍历void dfs(Node root) { if(root == null) return; dfs(root.left); ...