java 获取当前 堆内存使用情况_客户端


高性能架构

从底层原理到实战

  • 分布式机构思维
  • Redis高性能缓存数据库
  • ActiveMq消息中间件
  • RabbitMq消息中间件
  • Zookeeper分布式环境指挥官
  • MongoDB进阶实战
  • Memcached进阶实战
  • Kafka百万级吞实战
  • Mysql高性能存储实战
  • 高并发场景分布式解决方案实战
  • FastDFS分布式文件存储实战
  • Nginx高并发分流进阶实战
  • 高性能缓存开发实战


java 获取当前 堆内存使用情况_客户端_02


Memcached


java 获取当前 堆内存使用情况_java 获取当前 堆内存使用情况_03


1、memcached是怎么工作的?

Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多对的哈希表。通过key,可以存储或查询任意的数据。

客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。

举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C: Client 1想把数据”barbaz”以key “foo”存储。Client 1首先参考节点列表(A, B, C),计算key “foo”的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key “foo”把数据”barbaz”存储进去。 Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。 于是,经过相同的哈希计算(阶段一),Client 2计算出key “foo”在memcached B上,然后它直接请求memcached B,得到数据”barbaz”。

各种客户端在memcached中数据的存储形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的。

最后,从实现的角度看,memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。

可以参考A Story of Caching,这篇文章简单解释了客户端与memcached是如何交互的。

2、memcached最大的优势是什么?

请仔细阅读上面的问题(即memcached是如何工作的)。Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台 memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。

基于memcached的基本原则,可以相当轻松地构建出不同类型的缓存架构。除了这篇FAQ,在其他地方很容易找到详细资料的。

看看下面的几个问题吧,它们在memcached、服务器的local cache和MySQL的query cache之间做了比较。这几个问题会让您有更全面的认识。

3、memcached和MySQL的query cache相比,有什么优缺点?

4、memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?

5、memcached的cache机制是怎样的?

6、memcached如何实现冗余机制?

7、memcached如何处理容错的?

8、如何将memcached中item批量导入导出?

9、我需要把memcached中的item批量导出导入,怎么办?

10、memcached是如何做身份验证的?

11、memcached的多线程是什么?如何使用它们?

12、memcached能接受的key的最大长度是多少?

13、memcached对item的过期时间有什么限制?

14、memcached最大能存储多大的单个item?

15、为什么单个item的大小被限制在1M byte之内?


Redis


java 获取当前 堆内存使用情况_Redis_04


redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?

区别:

1.mc可缓存图片和视频。rd支持除k/v更多的数据结构;

2.rd可以使用虚拟内存,rd可持久化和aof灾难恢复,rd通过主从支持数据备份;

3.rd可以做消息队列。

原因:mc多线程模型引入了缓存一致性和锁,加锁带来了性能损耗。

redis主从复制如何实现的?redis的集群模式如何实现?redis的key是如何寻址的?

主从复制实现:主节点将自己内存中的数据做一份快照,将快照发给从节点,从节点将数据恢复到内存中。之后再每次增加新数据的时候,主节点以类似于mysql的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行重放。

分片方式:

-客户端分片

-基于代理的分片

●Twemproxy

●codis

-路由查询分片

●Redis-cluster(本身提供了自动将数据分散到Redis Cluster不同节点的能力,整个数据集合的某个数据子集存储在哪个节点对于用户来说是透明的)

redis-cluster分片原理:Cluster中有一个16384长度的槽(虚拟槽),编号分别为0-16383。每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,可以由用户指定,也可以在初始化的时候自动生成,只有Master才拥有槽的所有权。Master节点维护着一个16384/8字节的位序列,Master节点用bit来标识对于某个槽自己是否拥有。比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。这种结构很容易添加或者删除节点。比如如果我想新添加个节点D, 我需要从节点A、B、 C中得部分槽到D上。

  1. 使用redis如何设计分布式锁?说一下实现思路?使用zk可以吗?如何实现?这两种有什么区别?
  2. 知道redis的持久化吗?底层如何实现的?有什么优点缺点?
  3. redis过期策略都有哪些?LRU算法知道吗?写一下java代码实现?
  4. 缓存穿透、缓存击穿、缓存雪崩解决方案?
  5. 什么是Redis?
  6. Redis相比memcached有哪些优势?
  7. Redis支持哪几种数据类型?
  8. Redis主要消耗什么物理资源?
  9. Redis的全称是什么?
  10. Redis有哪几种数据淘汰策略?
  11. Redis集群方案应该怎么做?都有哪些方案?
  12. Redis有哪些适合的场景?
  13. Redis支持的Java客户端都有哪些?官方推荐用哪个?
  14. Redis回收进程如何工作的?
  15. 你知道有哪些Redis分区实现方案?

java 获取当前 堆内存使用情况_Redis_05