分布式缓存

Nosql 数据库 MemCache、Redis、MongoDB 的区别

匿名 (未验证) 提交于 2019-12-03 00:43:02
1.memcached:单一键值对内存缓存的,做对象缓存无可替代的分布式缓存; 2.redis:是算法和数据结构的集合,快速的数据结构操作是他最大的特点,支持数据持久化; 3.mongodb 是 bson 结构、介于 rdb 和 nosql 之间的,更松散更灵活的,但是不支持事务,只用作非重要数据存储。 转载请标明出处: Nosql 数据库 MemCache、Redis、MongoDB 的区别 文章来源: https://blog.csdn.net/tlsxtk/article/details/92084613

深入理解分布式系统中的缓存架构(上)

匿名 (未验证) 提交于 2019-12-03 00:41:02
本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景。 1 缓存概述! 2 缓存的分类 缓存主要分为以下四类! 2.1 CDN缓存 基本介绍 CDN(Content Delivery Network 内容分发网络)的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求 应用场景 主要缓存静态资源,例如图片,视频 应用图 优点 2.2 反向代理缓存 基本介绍 反向代理位于应用服务器机房,处理所有对WEB服务器的请求。 如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载。 应用场景 一般只缓存体积较小静态文件资源,如css、js、图片 应用图 开源实现 2.3 本地应用缓存 基本介绍 指的是在应用中的缓存组件,其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适; 同时,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法直接的共享缓存

常用的分布式事务解决方案

匿名 (未验证) 提交于 2019-12-03 00:37:01
关于分布式事务,工程领域主要讨论的是强一致性和最终一致性的解决方案。典型方案包括: 两阶段提交(2PC, Two-phase Commit)方案 eBay 事件队列方案 TCC 补偿模式 缓存数据最终一致性 一、一致性理论 分布式事务的目的是保障分库数据一致性,而跨库事务会遇到各种不可控制的问题,如个别节点永久性宕机,像单机事务一样的ACID是无法奢望的。另外,业界著名的CAP理论也告诉我们,对分布式系统,需要将数据一致性和系统可用性、分区容忍性放在天平上一起考虑。 两阶段提交协议(简称2PC)是实现分布式事务较为经典的方案,但2PC 的可扩展性很差,在分布式架构下应用代价较大,eBay 架构师Dan Pritchett 提出了BASE 理论,用于解决大规模分布式系统下的数据一致性问题。BASE 理论告诉我们:可以通过放弃系统在每个时刻的强一致性来换取系统的可扩展性。 1、CAP理论 在分布式系统中,一致性(Consistency)、可用性(Availability)和分区容忍性(Partition Tolerance)3 个要素最多只能同时满足两个,不可兼得。其中,分区容忍性又是不可或缺的。 <img src="https://pic4.zhimg.com/v2-8bb62ba9e7ce9f35199da032e17f9bb7_b.png" data-rawwidth=

分布式缓存原理----Hash环/一致性Hash原理/Hash槽

匿名 (未验证) 提交于 2019-12-03 00:22:01
Memcached:为分布式客户端做分发,hash环 TWY Redis: 为分布式客户端做分发 , hash环 当前,Memcached、Redis这类分布式kv缓存已经非常普遍。从本篇开始,本系列将分析分布式缓存相关的原理、使用策略和最佳实践。 我们知道Memcached的分布式其实是一种“伪分布式”,也就是它的服务器结点之间其实是相互无关联的,之间没有网络拓扑关系,由客户端来决定一个key是存放到哪台机器。 具体来讲,假设我有多台memcached服务器,编号分别为m0,m1,m2,…。对于一个key,由客户端来决定存放到哪台机器,那最简单的hash公式就是 key % N,其中N是机器的总数。 但这有个问题,一旦机器数变少,或者增加机器,N发生变化,那之前存放的数据就全部无效了。因为你按照新的N值取模计算出的机器编号,和当时按旧的N值取模算出的机器编号肯定是不等的,也就意味着绝大部分缓存会失效。 这个问题的解决办法就是用1种特别的Hash函数,尽可能使得,增加机器/减少机器时,缓存失效的数目降到最低,这就是Hash环,或者叫一致性Hash。 Hash环 (2)把key也hash到这个环上。然后在这个环上进行匹配,看这个key和哪台机器匹配。 具体来讲,如下: 假定有这样一个Hash函数,其值空间为(0到2的32次方-1) ,也就是说,其hash值是个32位无整型数字

事务面试题

匿名 (未验证) 提交于 2019-12-03 00:16:01
事务的特性ACID 事务提供了一种机制,可用来将一系列数据库更改归入一个逻辑操作。更改数据库后,所做的更改可以作为一个单元进行提交或取消。事务可确保遵循原子性、一致性、隔离性和持续性(ACID)这几种属性,以使数据能够正确地提交到数据库中。 1.脏读 一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误的数据,这样就造成了脏读 2.不可重复读 3.幻读 第一个数据正在查询某一条数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,仿佛幻觉一样,这就是幻读 不可重复读是指在同一查询事务中多次进行,由于其他提交事务所做的修改和删除,每次返回不同的结果集,此时发生不可重复读 幻读是指在同一查询事务中多次进行,由于其他提交的事务所做的插入操作,每次返回不同的结果集,此时发生幻读表面上看,区别就在于不可重复读能看见其他事务提交的修改和删除,而幻读能看见其他事务提交的插入 1.default:(默认) 默认隔离级别,使用数据库默认的事务隔离级别 2.read_uncommitted:(读未提交) 这是事务最低的隔离级别,他允许另外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读

分布式系列

匿名 (未验证) 提交于 2019-12-03 00:09:02
分布式缓存 分布式缓存 知识点 jvm内置缓存ehcache ehcache 的五种集群模式 ehcache + Redis 实现一级缓存、二级缓存 分布式Redis缓存持久化 分布式Redis缓存水平拆分 分布式Redis缓存主从复制 分布式Redis缓存集群模式 分布式Redis缓存穿透、雪崩、效应 基于Redis实现分布式锁 为什么使用缓存、缓存用在什么地方? 使用缓存技术为了减轻服务器压力 单个 jvm 缓存简单实现 // 单个jvm 缓存简单实现 @Component public class MapCache < K , V > { // 缓存容器使用 ConcurrentHashMap不需要考虑线程安全问题 public final Map < K , V > concruent = new ConcurrentHashMap <>(); public V get ( K k ){ return concruent . get ( k ); } public void put ( K k , V v ){ concruent . put ( k , v ); } public void remove ( K k ){ concruent . remove ( k ); } } springboot 开启 ehcache 缓存 开启缓存 @EnableCaching

SpringBoot:redis分布式缓存

谁说胖子不能爱 提交于 2019-12-02 22:41:46
前言 应用系统需要通过Cache来缓存不经常改变得数据来提高系统性能和增加系统吞吐量,避免直接访问数据库等低速存储系统。缓存的数据通常存放在访问速度更快的内存里或者是低延迟存取的存储器,服务器上。应用系统缓存,通常有如下作用: 缓存web系统的输出,如伪静态页面。 缓存系统的不经常改变的业务数据,如用户权限,字典数据.配置信息等 大家都知道springBoot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据,这些都涉及到分布式系统缓存的实现。(ehcache可以通过Terracotta组件一个缓存集群,这个暂时不讲) 但是ehcache的设计并不适合做分布式缓存,所以今天用redis来实现分布式缓存。 架构图: 一二级缓存服务器 使用Redis缓存, 通过网络访问还是不如从内存中获取性能好,所以通常称之为二级缓存 , 从内存中取得的缓存数据称之为一级缓存。 当应用系统需要查询缓存的时候,先从一级缓存里查找,如果有,则返回,如果没有查找到,则再查询二级缓存,架构图如下 Spring Boot 2 自带了前面俩种缓存的实现方式,本文将简单实现第三种,高速一二级缓存实现 Redis分布式缓存 1.pom文件 <dependency>   <groupId>org

memcached缓存分布式部署方案

匿名 (未验证) 提交于 2019-12-02 22:06:11
一、分布式方案介绍 比较流行的两种方案: 1.取余分布: 计算key的哈希值,与服务器数量取余,得到目标服务器。优点:实现简单,当某台服务器不可用时,故障转移方便;缺点:当增减服务器时, Key与服务器取余变动量较大,缓存重组代价极大。 代码实现可参考开源组件Memcached.ClientLibrary下的SockIOPool,源码地址: https://sourceforge.net/p/memcacheddotnet/code/HEAD/tree/trunk/clientlib/src/clientlib/SockIOPool.cs 2.一致性哈希环分布: 其原理参考 https://www.cnblogs.com/lpfuture/p/5796398.html http://www.zsythink.net/archives/1182 这两位老哥写的很清楚和直白,很容易理解。 一致性哈希环分布需要物理节点和虚拟节点,且虚拟节点对应到物理节点的服务器上。 二、代码实现 由于Memcached.ClientLibrary的作者已出取余分布的实现,这里不再叙述,以下代码和测试均是一致性哈希分布的。 1.数据结构: 服务器列表:List<string> servers;//IP:PORT 服务器虚拟节点数:List<int> weights;//与servers一一对应

Tair分布式缓存

北城余情 提交于 2019-12-02 18:31:33
Tair是为了解决什么问题而生? Redis很好用,相比memcached多了很多数据结构,支持持久化。但是在很长一段时间里,原生是不支持分布式的。后来就出现了很多redis集群类产品,Tair是其中胜出的优秀作品之一。 所以Tair的特性都是一些集群的特性,比如:容错、解决单点故障、跨机房管理、多集群管理、支持副本等。总而言之,是redis的高可用版本。 Tair的架构 Tair的整体风格是简约实用,包括三个必选模块:client、configserver和dataserver。一个可选模块:invalidserver。   还有一个必要软设施:一致性哈希算法提供分布式的负载均衡计算。 client的作用 1. 在应用端提供访问Tair集群的接口 2.更新并缓存数据分布表和invalidserver 地址等 3. 本地缓存,避免过热数据访问影响Tair集群服务 4. 流控 dataserver的作用 1. 提供存储引擎 2. 接受client和put、get、remove等操作 3. 执行数据迁移、复制等 4. 插件:在接受请求的时候处理一些自定义功能 5. 访问统计 invallidserver的作用 1. 接收来自client和invalid、hide等请求后,对属于同一组的集群(双机房独立集群部署方法)做delete、hide操作,保证同一组集群的一致 2

PHP实现Redis分布式锁

[亡魂溺海] 提交于 2019-12-02 16:37:56
锁在我们的日常开发可谓用得比较多。通常用来解决资源并发的问题。特别是多机集群情况下,资源争抢的问题。但是,很多新手在锁的处理上常常会犯一些问题。今天我们来深入理解锁。 一、Redis 锁错误使用之一 我曾经见过有的项目把查询结果存储到 Redis 当中时的伪代码如下: $redis = new \Redis('127.0.0.1', 6379); $cacheKey = 'query_cache'; $result = $redis->get($cacheKey); if ($result) { // 缓存有效则直接返回。 return $result; } else { // 缓存失效则重新获取并存储到 Redis。 $mysqlResult = []; $redis->set($cacheKey, json_encode($mysqlResult), 3600); return $mysqlResult; } 初看代码并不会发现问题所在。通常情况下,当服务器资源压力非常小的时候,这段代码不会有任何问题。并且,真的可以提升服务器吞吐性能。 假如,这个位置的代码出现了单点压力呢?比如,这个功能是统计结果,查询数据库需要花 5s。而且,由于该功能比较常用,单位时间内达到了 1000 次/秒。 这时就会出现并发穿透问题。 1000 个请求同时到达这个程序位置,都去读取缓存是否存在