memcached

分布式系统关注点(17)——先写DB还是「缓存」?

*爱你&永不变心* 提交于 2020-04-18 04:48:35
如果第二次看到我的文章, 欢迎右侧扫码订阅我哟~ 👉 本文长度为 4209字 ,建议阅读 12 分钟。 坚持原创,每一篇都是用心之作~ 在前一篇《 360°全方位解读「缓存」 》中,我们聊了运用缓存的三种思路,以及在一个完整的系统中可以设立缓存的几个位置,并且分享了关于浏览器缓存、CDN缓存、网关(代理)缓存的一些使用经验。 这次Z哥将深入到实际场景中,来看一下「进程内缓存」、「进程外缓存」运用时的一些最佳实践。由于篇幅原因,这次先聊三个问题。 首当其冲的就是“先写DB还是缓存?”。我想,只要你开始运用缓存,这会是你第一个要好好思考的问题,否则在前方等待你的就是灾难。。。 先写DB还是缓存? 一个程序可以没有缓存,但是一定要有数据库。这是大家的普遍观点,所以数据库的重要性在你的潜意识里总是被放在了第一位。 先DB再缓存 如果不细想的话你可能会觉得,数据库操作失败了,自然缓存也不用操作了;数据库操作成功了,再操作缓存,没毛病。 但是数据库操作成功,缓存操作的失败的情况该怎么解?( 主要在用到redis,memcached这种进程外缓存的时候,由于网络因素,失败的可能性大增 ) 办法也是有的,在操作数据库的时候带一个事务,如果缓存操作失败则事务回滚。大致的代码意思如下: begin trans var isDbSuccess = write db; if (isDbSuccess){

2020年最全java面试真题解析(980道),你没见过的面试题都在这

让人想犯罪 __ 提交于 2020-04-16 12:59:47
【推荐阅读】微服务还能火多久?>>> 今年跳槽想跳去哪个大厂呢,这是个问题。说实话,去年我面试也被虐了,为了能找到一份心怡的工作,特地的从朋友那里讨来一份面试圣经(阿里某大牛), 980道面试真题和解析,一共485页PDF 。 囊括Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈 。 由于面试真题 涉及全面,解析详细 ,所有的解析就不在文中给大家全部列出,整个 980道面试真题 都整理在一个pdf文档里面, 需要这一份pdf的朋友,末尾可领取: 每个专题总结将近50道真题(含解析),一共包含java、MyBatis、ZooKeeper、Dubbo等二十个多个专题。485页PDF。 20多个专题: 正文: MyBatis 面试题(27道): 什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。 2、MyBatis 可以使用 XML

Redis 21问,你接得住不?

ε祈祈猫儿з 提交于 2020-04-15 16:29:54
【推荐阅读】微服务还能火多久?>>> 作者:菜鸟小于 https://www.cnblogs.com/Young111/p/11518346.html 1.什么是redis? Redis 是一个基于内存的高性能key-value数据库。 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 3.使用redis有哪些好处? 1

Redis面试题,个个都是经典,希望有你想要的

白昼怎懂夜的黑 提交于 2020-04-15 08:59:49
【推荐阅读】微服务还能火多久?>>> 分享分享自己收藏的学习资料,有需要的朋友可以找我获取 根据自身面试经历整理以及不断收集的(珍藏版) 【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> https://www.cnblogs.com/xiaogeng88/p/12692306.html 1、什么是Redis?简述它的优缺点? Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘 上进行保存。 因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的 Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限 制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。 比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高 性能的tag系统等等。 另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的 memcached来用。

06 架构伸缩性

时光怂恿深爱的人放手 提交于 2020-04-13 07:07:56
比如双11, 网站的特点,可能是在某一段时间会有大量访问,过了这段时间,恢复正常。 如果一直保持着“双11标准”运营,那是浪费,所以,就要考虑网站的伸缩性. 业务功能分离 (横向分离,前台,交易,库存,产品 等) 单一业务功能,通过 集群 实现伸缩. 应用服务器: 通过负载均衡 + 集群 实现伸缩性。 分布式缓存 集群 的伸缩性设计. 不同于应用服务器集群的伸缩性设计,分布式缓存集群的伸缩性不能使用简单的负载均衡来实现。因为分布式缓存服务器集群中不同服务器中缓存的数据各不相同,缓存访问请求不可以在缓存服务器集群中的任何一台处理,必须先找到缓存有需要数据的服务器,才能访问,这个特点严重制约着缓存服务器集群的伸缩性设计,因为新上线的缓存服务器没有任何缓存数据,而已下线的缓存服务器还缓存着网站的许多热点数据。必须让新上线的缓存服务器对整个分布式缓存集群影响最小,也就是说新加入缓存服务器后应使整个缓存服务器集群中已经缓存的数据可能还被访问到,这是分布式缓存集群伸缩性设计的最主要目标。{也就是说,设计上缓存服务器集群应该作为一个整体} 应用程序通过 Memcached 客户端访问 Memcached 服务器集群,Memcached客户端主要由一组 API, Memcached 服务器集群路由算法,Memcached 服务器集群列表及通信模块组成. 其中路由算法负责根据应用程序输入的缓存数据

一不小心写了个免费的跨平台网络考试培训网教系统

时光总嘲笑我的痴心妄想 提交于 2020-04-12 08:30:03
之前的旧版本为许多客户服务了好多年,但随着技术变更与发展,旧版已难以再挑起大梁。因本人一直都扎根在网教行业,对实现网络考试与培训有着深刻的认识与理解,故打算用当前主流技术全新构建一套新的版本。 新版本采用.Net Core 2(目前已升级为.Net Core 3)c#语言编写(新版名为“麦荻网教系统”),结合分布式架构、微服务等技术开发而成。麦荻网教系统有着极高的并发承载能力,有着极强的稳定性能,且在应对超大规模的应用场景时也能有更好的应对能力与扩展性。麦荻网教系统前端基于Html5(开源免费)、Vue(开源免费)、iView(开源免费)等技术实现前后端分离架构开发而成。 1、麦荻网教系统支持部署在Windows Server 2012/2016/2019及更高版本的系统、支持部署在Ubuntu 14.10/16.10及更高版本的系统、支持部署在CentOS 7.0及更高版本的系统、支持部署在Docker 1.10及更高版本的系统。 2、麦荻网教系统支持SQL Server 2012/2014/2016及更高版本的数据库、支持MySQL 6.0及更高版本的数据库。 3、麦荻网教系统支持Memcached 1.4及更高版本的缓存组件(开源免费)、支持RabbitMQ 3.8(开源免费)及更高版本的队列组件。 4、您可以按自已的实际应用规模将“麦荻网教系统

一不小心写了个免费的跨平台网络考试培训网教系统

夙愿已清 提交于 2020-04-11 18:59:16
之前的旧版本为许多客户服务了好多年,但随着技术变更与发展,旧版已难以再挑起大梁。因本人一直都扎根在网教行业,对实现网络考试与培训有着深刻的认识与理解,故打算用当前主流技术全新构建一套新的版本。 新版本采用.Net Core 2(目前已升级为.Net Core 3)c#语言编写(新版名为“麦荻网教系统”),结合分布式架构、微服务等技术开发而成。麦荻网教系统有着极高的并发承载能力,有着极强的稳定性能,且在应对超大规模的应用场景时也能有更好的应对能力与扩展性。麦荻网教系统前端基于Html5(开源免费)、Vue(开源免费)、iView(开源免费)等技术实现前后端分离架构开发而成。 1、麦荻网教系统支持部署在Windows Server 2012/2016/2019及更高版本的系统、支持部署在Ubuntu 14.10/16.10及更高版本的系统、支持部署在CentOS 7.0及更高版本的系统、支持部署在Docker 1.10及更高版本的系统。 2、麦荻网教系统支持SQL Server 2012/2014/2016及更高版本的数据库、支持MySQL 6.0及更高版本的数据库。 3、麦荻网教系统支持Memcached 1.4及更高版本的缓存组件(开源免费)、支持RabbitMQ 3.8(开源免费)及更高版本的队列组件。 4、您可以按自已的实际应用规模将“麦荻网教系统

面试宝典系列-memcache的过期回收内存机制

有些话、适合烂在心里 提交于 2020-04-10 11:47:45
memcache不会释放内存,而是重新利用。 memcache是一个lazy的删除模式, 1、需要新的对象请求入驻这个chunk(存放块) 2、 过期的对象被get的时候才会清除 。 那当所有给memcache的内存都被占用了,这个时候,memcache有两个设置,要么报错,要么,就是用 LRU方法,把last recently used的数据清除出去,也就是删除近段时间最少使用的同规格chunk。 这个时候就会引发应外一个问题 ,就是当你chunk大小设置不合理的时候,比如slab20的 chunk大小非常大,一开始占用了很多内存,但是之后不论是否过期,不被再次利用到的时候就一直处于内存中,这样,当比较小的slab1中的chunk 满了,也没有内存新建slab并分割和slab1同样规格的chunk的时候,memcached就要启动LRU,来清理这个slab下的数据。那这种情 况就会造成在内存的极大程度浪费和cache命中率下降,是某些关键性的数据总是在内存中进进出出,得不到持久的保存。 关于memcache的内存分配机制,请关注下期 来源: oschina 链接: https://my.oschina.net/u/3646190/blog/1862595

面试宝典系列-memcache内存分配机制

百般思念 提交于 2020-04-10 11:30:37
Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存, 解决了内存碎片问题 。 Slab Allocator的基本原理是按照预先规定的大小,将分配的内存以page为单位,默认情况下一个page是1M(可以通过 -I参数 在启动时指定),分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),如果需要申请内存时,memcached会划分出一个新的page并分配给需要的slab区域。 page一旦被分配在重启前不会被回收或者重新分配 , 以解决内存碎片问题 。 slab的内存分配具体过程如下: Memcached在启动时通过 -m参数 指定最大使用内存,但是这个不会一启动就占用完,而是逐步分配给各slab的。如果一个新的数据要被存放,首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请,slab申请内存时以page为单位,无论大小为多少,都会有1M大小的page被分配给该slab(该page不会被回收或者重新分配,永远都属于该slab)。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,再从这个chunk数组中选择一个用于存储数据。若没有空闲的page的时候,则会对该slab进行LRU

Memcache 内存分配策略和性能(使用)状态检查

醉酒当歌 提交于 2020-04-10 10:52:40
前言: 一直在使用Memcache,但是对其内部的问题,如它内存是怎么样被使用的,使用一段时间后想看看一些状态怎么样?一直都不清楚,查了又忘记,现在整理出该篇文章,方便自己查阅。本文不涉及安装、操作。有兴趣的同学可以查看之前写的 文章 和Google。 1:参数 memcached -h memcached 1.4.14-p <num> TCP端口,默认为11211,可以不设置-U <num> UDP端口,默认为11211,0为关闭-s <file> UNIX socket-a <mask> access mask for UNIX socket, in octal (default: 0700)-l <addr> 监听的 IP 地址,本机可以不设置此参数-d 以守护程序(daemon)方式运行-u 指定用户,如果当前为 root ,需要使用此参数指定用户-m <num> 最大内存使用,单位MB。默认64MB-M 禁止LRU策略,内存耗尽时返回错误,而不是删除项-c <num> 最大同时连接数,默认是1024-v verbose (print errors/warnings while in event loop)-vv very verbose (also print client commands/reponses)-vvv extremely verbose (also