分布式缓存

分布式之数据库和缓存双写一致性方案解析(三)

我的未来我决定 提交于 2020-04-07 10:30:26
正文 博主本来觉得, 《分布式之数据库和缓存双写一致性方案解析》 ,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用 先删缓存,再更新数据库,再删缓存 这一方案作为缓存更新策略,而不是先更新数据库,再删缓存。并且搬出了两篇大佬的文章, 《Cache Aside Pattern》 , 《缓存与数据库不一致,咋办?》 ,希望博主能加以说明。因为问的人太多了,所以才有了这篇文章的诞生。 正文 在开始这篇文章之前,我们先自己思考一下以下两个更新策略 方案一 (1)删缓存 (2)更数据库 (3)删缓存 方案二 (1)更数据库 (2)删缓存 大家看下面的文章前,自己先思考一下, 方案一的步骤(1)有没有存在的必要 ? 先上一个结论:方案二存在的缺点,方案一全部存在,且方案一比方案二多一个步骤,所以应该选方案二。 下面,针对 《Cache Aside Pattern》 , 《缓存与数据库不一致,咋办?》 这两篇文章提出的论点,提出小小的质疑。这两篇文章认为方案二不行的原因,主要有以下两点 (1)方案二在步骤(2),出现删缓存失败的情况下,会出现数据不一致的情形,如下图所示 Cache Aside Pattern方案存在什么问题? 答:如果先操作数据库,再淘汰缓存,在原子性被破坏时: (1) 修改数据库成功了 (2) 淘汰缓存失败了 导致,数据库与缓存的数据不一致 (2

大型网站技术架构——网站架构的伸缩性设计

眉间皱痕 提交于 2020-04-06 22:45:28
首先,所谓网站的伸缩性,指 不需要改变网站的软硬件设计,仅仅通过改变部署的服务器数量就可以扩大或者缩小网站的服务处理能力 。在整个互联网行业的发展渐进演化中,最重要的技术就是 服务器集群 ,通过不断地向集群中添加服务器来增强整个集群的处理能力。 一、网站架构的伸缩性设计 1.1 不同功能进行物理分离实现伸缩   (1)纵向分离:将业务处理流程上得不同部分分离部署,实现系统的伸缩性;   (2)横向分离:将不同的业务模块分离部署,实现系统的伸缩性; 1.2 单一功通过集群规模实现伸缩   使用服务器集群,即将相同服务部署在多台服务器上构成一个集群整体对外提供服务。具体来说,集群伸缩性又分为应用服务器集群伸缩性和数据服务器集群伸缩性。这两种集群对于数据状态管理的不同,技术实现也有很大的区别。  It is said that 当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛来拉车 。 二、应用服务器集群的伸缩性设计 2.1 应用服务器那点必须知道的事儿   (1)应用服务器应该被设计成 无状态 的,即应用服务器不存储请求上下文信息;构建集群后,每次用户的请求都可以发到集群中任意一台服务器上处理,任何一台服务器的处理结果都是相同的;   (2)HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态

五分钟学后端技术:如何学习分布式系统和相关技术

倾然丶 夕夏残阳落幕 提交于 2020-04-06 05:21:46
转载自 https://www.cnblogs.com/wetest/p/6806506.html 和 https://www.cnblogs.com/dudu0614/p/8821811.html 什么是分布式系统 分布式这一概念,一直都是后端工程师绕不过去的一个坎,今天,我们就一起来看看到底什么是分布式系统,又有哪些分布式技术世我们需要学习的。 根据百度百科的介绍,分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。 从分布式系统的诞生说起 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ、微信、淘宝。那么,一个互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂?本文就是想从最基本的地方开始,探寻服务器端系统技术的基础概念。 承载量是分布式系统存在的原因 当一个互联网业务获得大众欢迎的时候,最显著碰到的技术问题,就是服务器非常繁忙。当每天有1000万个用户访问你的网站时,无论你使用什么样的服务器硬件,都不可能只用一台机器就承载的了。因此,在互联网程序员解决服务器端问题的时候,必须要考虑如何使用多台服务器,为同一种互联网应用提供服务,这就是所谓

Codis 分布式缓存部署

丶灬走出姿态 提交于 2020-03-25 09:17:40
3 月,跳不动了?>>> 环境介绍: 1:机器三台 ,IP/hostname 如下, hostname的设置很重要zookeeper / codis的通信都会用到,所以要配置好三台机器的hosts文件. 10.221.8. 220 机器的hostname为 Redis1 10.221.8 .221 机器的hostname为 Redis2 10.221.8 .222 机器的hostname为 Redis3 三台机器的/etc/hosts 文件添加如下解析 10.221.8. 220 Redis1 10.221.8.1. 221 Redis2 10.221.8.1. 222 Redis3 2: 三台机器的系统都是centos 6.5 已经安装基本服务. yum -y install gcc gcc-c++ make glibc glibc-devel glib2 glib2-devel patch autoconf automake(安装基本编译工具) yum -y install ntp wget unzip vixie-cron ntsysv openssh-clients sysstat irqbalance subversion(安装常用系统软件,按需) yum update -y (更新软件包) 3:使用三台机器做codis集群的服务部署如图: 服务的部署 第一步:

Redis分布式缓存&分布式锁

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-15 11:51:31
1.背景 由于业务需求最近准备将系统中原有的memcached改造为Redis,实现多数据类型的分布式缓存。 2.分布式缓存: 3.集成改造 1) Pom依赖 vcsp-genericProfessionServer\pom.xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.10.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency> View Code 2) application-*.properties #redis配置********************* spring.redis.hostName

分布式缓存 — MongoDB

笑着哭i 提交于 2020-03-14 07:39:22
--- 数据库管理系统 数据库管理系统主要分为俩大类:RDBMS、NOSQL。在个人电脑、大型计算机和主机上应用最广泛的数据库管理系统是关系型DBMS。NoSQL是对不同于传统的关系数据库的数据库管理系统的统称。 两者最重要的不同点是NoSQL不使用SQL作为查询语言。其数据存储可以不需要固定的表格模式,也经常会避免使用SQL的JOIN操作,一般有水平可扩展性的特征。 常见的数据库管理系统,及其排名情况如下: NoSQL数据库四大家族 NoSQL中的四大家族主要是:列存储、键值、图像存储、文档存储,其类型产品主要有以下这些。 存储类型 NoSQL 键值存储 最终一致性键值存储 Cassandra、Dynamo、Riak、Hibari、Virtuoso、Voldemort 内存键值存储 Memcached、Redis、Oracle Coherence、NCache、Hazelcast、Tuple space、Velocity 持久化键值存储 BigTable、LevelDB、Tokyo Cabinet、Tarantool、TreapDB、Tuple space 文档存储 MongoDB、CouchDB、SimpleDB、 Terrastore 、 BaseX 、Clusterpoint 、 Riak、No2DB 图存储 FlockDB、DEX、Neo4J、AllegroGraph

浓缩精华的架构演进过程,经验总结,值得收藏!

◇◆丶佛笑我妖孽 提交于 2020-03-09 12:27:53
架构设计的演进过程 业务驱动技术的发展是亘古不变的道理。最开始的时候,业务量少,业务复杂度低,采取的技术也相对简单,基本满足用户对功能的需求。随着IT信息化的普及,更多的交易放到了网络上,信息量增加和访问次数频繁就是要解决的问题了。因此,逐渐加入了缓存、集群等技术手段。同时对业务的扩展性和伸缩性的要求也越来越高。高并发、高可用、可伸缩、可扩展、够安全的软件架构一直是架构设计追求的目标。今天我们来看一下架构设计经历了哪些阶段,每个阶段都解决了哪些问题,又引出了哪些新问题。主要是引起大家的思考,在不同的业务发展阶段采取合适技术手段,用变化拥抱变化是IT人追求的目标。 应用与数据一体模式 最早的业务应用以网站、OA等为主,访问的人数有限,单台服务器就能够应付。通常,将应用程序和数据库部署到一台服务器上面,如图1-1所示。在这一阶段,我们利用LAMP(Linux Apache MySQL PHP)技术就可以迅速搞定,并且这些工具都是开源的。很长一段时间内,有各种针对这种应用模式的开源代码可以使用。这种模式基本上没有高并发的要求,可用性也很差。有的服务器采用托管模式,上面就安装了不同的业务应用,一旦服务器出现问题,所有的应用就罢工了。不过其开发和部署成本相对较低,适合刚刚起步的应用服务。图1 就描述了单个应用和数据库运行在单台服务器的模式,我们称这种模式为应用与数据一体模式。 图 1

云服务器分布式配置过程

只谈情不闲聊 提交于 2020-03-03 12:02:10
服务器两次被入侵,导致我一切推倒重来,在重新配置的过程,总结下安装经验 如果需要安装包,可以留言,这次重新安装配置后都有存下来 数据库的配置 tomcat及JDK的配置 zookeeper的配置及dubbo可视化界面(未更新) fastDfs分布式文件系统服务器(用于上传配置) 在Storage上安装nginx配置图片服务虚拟主机(用于下载) redis缓存服务器安装及jedis集成使用(未更新) solr搜索应用服务器安装配置及集成使用(未更新) 来源: CSDN 作者: 陈晨* 链接: https://blog.csdn.net/weixin_41998993/article/details/104626212

hibernate4 配合分布式缓存memcache的痛苦配置

天大地大妈咪最大 提交于 2020-03-01 16:22:40
hibernate最强大的莫过于缓存功能,配上分布式的memcache应该性能飞快,结果各种麻烦 基本配置网上都有,就不说了 hibernate3缓存的配置 <prop key="hibernate.cache.provider_class">com.googlecode.hibernate.memcached.MemcachedCacheProvider</prop> 这种方式只能应用与hibernate3 这种是hibernate4 hibernate.cache.region.factory_class=com.googlecode.hibernate.memcached.MemcachedRegionFactory 而这个class只有在hibernate-memcache 1.5的版本才有,这个版本是专门给hibernate4使用的,如果你使用了1.6版本反而不支持了,1.5版本的jar包我没找到,直接下载源码导入项目吧,https://github.com/dzone/hibernate-memcached 我没有打成jar包,直接把代码引入到项目了,然后就是各种红色提示错误 首先是com.danga.MemCached.MemCachedClient提示找不到,找这个包我也找了半天,也不知道谁写的,如果没需求其实可以直接删了,无非就是一个memcache的客户端

分布式缓存的基本原理

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-29 22:57:24
随着互联网的发展,用户规模和数据规模越来越大,对系统的性能提出了更高的要求,缓存就是其中一个非常关键的组件,从简单的商品秒杀,到全民投入的双十一,我们都能见到它的身影。 分布式缓存首先也是缓存,一种性能很好但是相对稀缺的资源,和我们在课本上学习的CPU缓存原理基本相同,CPU是用性能更好的静态RAM来为性能一般的DRAM加速,分布式缓存则是通过内存或者其他高速存储来加速,但是由于用到了分布式环境中,涉及到并发和网络的问题,所以会更加复杂一些,但是有很多方面的共性,比如缓存淘汰策略。计算机行业有一句鼎鼎大名的格言就指出了缓存失效的复杂性。 There are only two hard things in Computer Science: cache invalidation and naming things (计算科学中最难的两件事是命名和缓存失效) – Phil Karlton 本文包括四个部分,分布式缓存的更新模式、失效机制、淘汰策略和常见问题及解决方案,重点是围绕缓存的通用原理和实现来说明,不针对某个具体的系统,算法部分主要采用伪代码说明。 缓存的更新模式 Cache Aside模式 读取失效:cache数据没有命中,查询DB,成功后把数据写入缓存 读取命中:读取cache数据 更新:把数据更新到DB,失效缓存 图示 // Read data = cache.get(id