精华内容
下载资源
问答
  • 服务器内存缓存清理

    千次阅读 2020-04-27 10:45:26
    1、内存查看 free -h #以GB为单位展示当前系统内存数据 ...2、直接清除缓存 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches #说明 #ec...

    1、内存查看

    free -h   #以GB为单位展示当前系统内存数据
    free -m   #以MB为单位展示当前系统内存数据
    

    2、直接清除缓存

    echo 1 > /proc/sys/vm/drop_caches   
    echo 2 > /proc/sys/vm/drop_caches   
    echo 3 > /proc/sys/vm/drop_caches   
    #说明
    #echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache,当前产链服务器缓存主要在这里。
    #echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
    #echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的缓存对象。
    

    3、脚本清除

    (1)root账号登陆服务器
    (2)新建文件夹 /opt/clean和/opt/clean/logs
    (3)新建freemem.sh脚本
    (4)给freemem.sh脚本赋权777

    3.1、脚本内容

    #! /bin/sh  
    used=`free -m | awk 'NR==2' | awk '{print $3}'`  
    free=`free -m | awk 'NR==2' | awk '{print $4}'`  
    echo "===========================" >> /opt/clean/logs/mem.log  
    date >> /opt/clean/logs/mem.log  
    echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /opt/clean/logs/mem.log  
    if [ $free -le 4000 ] ; then  
                sync && echo 1 > /proc/sys/vm/drop_caches  
                used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`  
                free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`  
                echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /opt/clean/logs/mem.log  
                echo "OK" >> /opt/clean/logs/mem.log  
    else  
                echo "Not required" >> /opt/clean/logs/mem.log  
    fi  
    exit 1  
    

    3.2、设置脚本定时执行

    (1)使用crontab -e命令编辑crontab,文末添加

    0 6 * * * /opt/clean/freemem.sh
    # (0 6 * * * )为cron表达式,可根据实际需求自行调整时间
    

    (2)重启crond服务

    	/sbin/service crond restart
    
    展开全文
  • 缓存策略有很多种 1.登录时初始化,离线时清理,读写分离 (写 包含了立刻回写 OR 定时回写) 2.读写分离,用时cache,LRU等算法来置换   TODO    转载于:...

    缓存策略有很多种

    1.登录时初始化,离线时清理,读写分离 (写 包含了立刻回写 OR 定时回写)

    2.读写分离,用时cache,LRU等算法来置换

     

    TODO 

     

    转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/2245387

    展开全文
  • 分布式单服务器实例内存缓存

    千次阅读 2016-05-27 22:03:41
    把一些被大量访问的,变化频次很低的,占用内存不多的内容预先加载到服务器实例的内存中来加快服务器的响应速度!

    概述

    对于一个后台er来说,我们总是在不断的尝试和努力提高自己产品的响应速度,或者是减小资源的大小、或者是消灭多余的请求、或者提高响应的速度。

    对于后台最有效的首先就是调整响应的逻辑、逻辑与数据库的交互、数据库的设计,这是基础,是最重要的。

    要提高响应速度,还有一个更重要的利器就是缓存。关于应用层面的缓存在我看来应该是有2种:一种就是整个应用所有服务器实例公用的集中式缓存(一般来说是分布式缓存服务,redis、memecached、hbase等),适用于数据规模或者潜在规模比较大的数据;第二种是单服务器实例的,这里还可以分成2种,懒加载的和预加载的。

    关于单机的缓存

    懒加载的也就是大家常见的缓存方式:访问时如果缓存中没有,那么从数据存储位置加载,并放入缓存;访问时如果缓存命中,那么直接从缓存读取。并且可以通过指定缓存数据的刷新时间,让缓存一定时间后自动失效,失效的目的就是为了保持数据的新鲜。

    缓存数据更新有主动和被动两种方式,主动就是制定有效期,到期缓存数据自动清除,接口被再次访问时,从数据存储位置加载;被动更新是指通过接口调用、消息通知等方式触发缓存数据的清除或者重新加载。

    预加载的方式,就是服务器启动时即加载数据到缓存空间。由于这里说的预加载是指服务器实例级别的,所以考虑到服务器的内存不是用来做大量存储的,以及加载过多数据会导致服务启动时间过长的问题,这种方式不适合缓存过大规模的数据,它的规模在生产中要有一定的克制。

    关于预加载的方式

    目前为止缓存框架都是懒加载的方式,对于预加载的缓存一般来说都是需要后台er自己按照业务需要进行实现的。

    功能上要包含:加载、读取、更新3要素。

    这种方式一般多用于元数据信息缓存,我们用到的焦点图、元数据相关的列表,比如城市、城区、妆型列表。

    代码实现

    1.代码使用统一的DataStorage存储任何类型的内存对象,提供泛型和非泛型方式的get方法。泛型类型的方法用于减少suppressWarning的数量,和调用处的优雅。

    2.数据重新加载实现定时任务和消息的通知的方式。示例中消息通知采用redis的sub/pub消息机制。

    3.示例同时是一个很好的springMVC+redis+maven(包含profile)的模板,方便在该基础上快速的搭建起更大的工程。

    4.其中的测试直接用springMVC的controller给出的链接方式,
    便于直接在浏览器进行getData和reload,查看更新的效果。

    代码已经放在了github上:https://github.com/ZhangShufan15/server-instance-memory-data-cache

    补充(20160908):redis的pubsub功能,可能在网络抖动情况下,sub服务器收不到某一次的pub消息,也就是会存在消息丢失。所以,设计中的定时自刷新是十分必要的,算是一种保护机制。

    展开全文
  • 背景缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁。但是由于受限于硬盘IO的性能或者远程网络等...

    背景

    缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁。但是由于受限于硬盘IO的性能或者远程网络等原因获取可能非常的费时。会导致我们的程序非常缓慢,这在某些业务上是不能忍的!而缓存正是解决这类问题的神器!

    1bfcfc0852f43c18fdcc6358c3c85c7f.png

    缓存在很多系统和架构中都用广泛的应用,例如:
    • CPU缓存

    • 操作系统缓存

    • HTTP缓存

    • 数据库缓存

    • 静态文件缓存

    • 本地缓存

    • 分布式缓存

    可以说在计算机和网络领域,缓存是无处不在的。可以这么说,只要有硬件性能不对等,涉及到网络传输的地方都会有缓存的身影。缓存总体可分为两种 集中式缓存 和 分布式缓存。“集中式缓存"与"分布式缓存"的区别其实就在于“集中”与"非集中"的概念,其对象可能是服务器、内存条、硬盘等。比如:
    1.服务器版本:
    • 缓存集中在一台服务器上,为集中式缓存。

    • 缓存分散在不同的服务器上,为分布式缓存。

    2.内存条版本:
    • 缓存集中在一台服务器的一条内存条上,为集中式缓存。

    • 缓存分散在一台服务器的不同内存条上,为分布式缓存。

    3.硬盘版本:
    • 缓存集中在一台服务器的一个硬盘上,为集中式缓存。

    • 缓存分散在一台服务器的不同硬盘上,为分布式缓存。

    正文

    Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。guava cache 加载缓存主要有两种方式:
    1. cacheLoader

    2. callable callback

    • cacheLoader

    创建自己的CacheLoader通常只需要简单地实现Vload(K key) throws Exception方法.cacheLoader方式实现实例:
    LoadingCache cache = CacheBuilder.newBuilder()       .build(           new CacheLoader() {             public Value load(Key key) throws AnyException {               return createValue(key);             }           });           ...try {  return cache.get(key);} catch (ExecutionException e) {  throw new OtherException(e.getCause());
    从LoadingCache查询的正规方式是使用get(K)方法。这个方法要么返回已经缓存的值,要么使用CacheLoader向缓存原子地加载新值(通过load(Stringkey)方法加载)。由于CacheLoader可能抛出异常,LoadingCache.get(K)也声明抛出ExecutionException异常。如果你定义的CacheLoader没有声明任何检查型异常,则可以通过getUnchecked(K)查找缓存;但必须注意,一旦CacheLoader声明了检查型异常,就不可以调用getUnchecked(K)。
    • Callable

    这种方式不需要在创建的时候指定load方法,但是需要在get的时候实现一个Callable匿名内部类。Callable方式实现实例:
    Cache cache = CacheBuilder.newBuilder()    .build(); // look Ma, no CacheLoader...try {  // If the key wasn't in the "easy to compute" group, we need to  // do things the hard way.  cache.get(key, new Callable() {    @Override    public Value call() throws AnyException {      return doThingsTheHardWay(key);    }  });} catch (ExecutionException e) {  throw new OtherException(e.getCause());
    而如果加上现在java8里面的Lambda表达式会看起来舒服很多
     try {      cache.get(key,()->{        return null;      });catch (ExecutionException e) {      e.printStackTrace();}  
    所有类型的Guava Cache,不管有没有自动加载功能,都支持get(K, Callable)方法。这个方法返回缓存中相应的值,或者用给定的Callable运算并把结果加入到缓存中。在整个加载方法完成前,缓存项相关的可观察状态都不会更改。这个方法简便地实现了模式"如果有缓存则返回;否则运算、缓存、然后返回"。当然除了上面那种被动的加载,它还提供了主动加载的方法cache.put(key, value),这会直接覆盖掉给定键之前映射的值。使用Cache.asMap()视图提供的任何方法也能修改缓存。但请注意,asMap视图的任何方法都不能保证缓存项被原子地加载到缓存中。进一步说,asMap视图的原子运算在Guava Cache的原子加载范畴之外,所以相比于Cache.asMap().putIfAbsent(K,V),Cache.get(K,Callable)应该总是优先使用。
    • 缓存回收

    上面有提到 Guava Cache与ConcurrentMap 不一样的地方在于 guava cache可以自动回收元素,这在某种情况下可以更好优化资源被浪费的情况。
    • 基于容量的回收
    当缓存设置CacheBuilder.maximumSize(size)。这个size是指具体缓存项目的数量而不是内存的大小。而且并不是说数量大于size才会回收,而是接近size就回收。
    • 定时回收
    • expireAfterAccess(long,     TimeUnit):

      缓存项在给定时间内没有被读/写访问,则回收。

      请注意这种缓存的回收顺序和基于大小回收一样。

    • expireAfterWrite(long,     TimeUnit):

      缓存项在给定时间内没有被写访问(创建或覆盖),则回 收。

      如果认为缓存数据总是在固定时候后变得陈旧不可用,这种回收方式是可取的。

    guava cache 还提供一个Ticker方法来设置缓存失效的具体时间精度为纳秒级。
    • 基于引用的回收

    通过使用弱引用的键、或弱引用的值、或软引用的值,Guava Cache可以把缓存设置为允许垃圾回收:
    • CacheBuilder.weakKeys():

      使用弱引用存储键。

      当键没有其它(强或软)引用时,缓存项可以被垃圾回收。

      因为垃圾回收仅依赖恒等式(==),使用弱引用键的缓存用==而不是equals比较键。

    • CacheBuilder.weakValues():

      使用弱引用存储值。

      当值没有其它(强或软)引用时,缓存项可以被垃圾回收。

      因为垃圾回收仅依赖恒等式(==),使用弱引用值的缓存用==而不是equals比较值。

    • CacheBuilder.softValues():

      使用软引用存储值。

      软引用只有在响应内存需要时,才按照全局最近最少使用的顺序回收。

      考虑到使用软引用的性能影响,我们通常建议使用更有性能预测性的缓存大小限定(见上文,基于容量回收)。

      使用软引用值的缓存同样用==而不是equals比较值。

    • 显式清除

    任何时候,你都可以显式地清除缓存项,而不是等到它被回收:
    • 个别清除:

      Cache.invalidate(key)

    • 批量清除:

      Cache.invalidateAll(keys)

    • 清除所有缓存项:Cache.invalidateAll()

    这里说一个小技巧,由于guava cache是存在就取不存在就加载的机制,我们可以对缓存数据有修改的地方显示的把它清除掉,然后再有任务去取的时候就会去数据源重新加载,这样就可以最大程度上保证获取缓存的数据跟数据源是一致的。
    • 移除监听器

    不要被名字所迷惑,这里指的是移除缓存的时候所触发的监听器。请注意,RemovalListener抛出的任何异常都会在记录到日志后被丢弃[swallowed]。
    LoadingCache cache = CacheBuilder      .newBuilder()      .removalListener(new RemovalListener(){         @Override        public void onRemoval(RemovalNotification notification) {          System.out.println(notification.getKey()+"被移除");        }      })
    Lambda的写法:
      LoadingCache cache = CacheBuilder       .newBuilder()       .removalListener((notification)->{         System.out.println(notification.getKey()+"已移除");       })
    警告:默认情况下,监听器方法是在移除缓存时同步调用的。因为缓存的维护和请求响应通常是同时进行的,代价高昂的监听器方法在同步模式下会拖慢正常的缓存请求。在这种情况下,你可以使用RemovalListeners.asynchronous(RemovalListener, Executor)把监听器装饰为异步操作。这里提一下guava cache的自动回收,并不是缓存项过期起马上清理掉,而是在读或写的时候做少量的维护工作,这样做的原因在于:如果要自动地持续清理缓存,就必须有一个线程,这个线程会和用户操作竞争共享锁。此外,某些环境下线程创建可能受限制,这样CacheBuilder就不可用了。相反,我们把选择权交到你手里。如果你的缓存是高吞吐的,那就无需担心缓存的维护和清理等工作。如果你的缓存只会偶尔有写操作,而你又不想清理工作阻碍了读操作,那么可以创建自己的维护线程,以固定的时间间隔调用Cache.cleanUp()。ScheduledExecutorService可以帮助你很好地实现这样的定时调度。
    • 刷新

    guava cache 除了回收还提供一种刷新机制LoadingCache.refresh(K),他们的的区别在于,guava cache 在刷新时,其他线程可以继续获取它的旧值。这在某些情况是非常友好的。而回收的话就必须等新值加载完成以后才能继续读取。而且刷新是可以异步进行的。

    如果刷新过程抛出异常,缓存将保留旧值,而异常会在记录到日志后被丢弃[swallowed]。

    重载CacheLoader.reload(K, V)可以扩展刷新时的行为,这个方法允许开发者在计算新值时使用旧的值。

      //有些键不需要刷新,并且我们希望刷新是异步完成的LoadingCache graphs = CacheBuilder.newBuilder()      .maximumSize(1000)      .refreshAfterWrite(1, TimeUnit.MINUTES)      .build(          new CacheLoader() {            public Graph load(Key key) { // no checked exception              return getValue(key);            }            public ListenableFuturereload(final Key key, Value value) {              if (neverNeedsRefresh(key)) {                return Futures.immediateFuture(value);              } else {                // asynchronous!                ListenableFutureTask task = ListenableFutureTask.create(new Callable() {                  public Graph call() {                    return getValue(key);                  }                });                executor.execute(task);                return task;              }            }          });
    CacheBuilder.refreshAfterWrite(long, TimeUnit)可以为缓存增加自动定时刷新功能。和expireAfterWrite相反,refreshAfterWrite通过定时刷新可以让缓存项保持可用,但请注意:缓存项只有在被检索时才会真正刷新(如果CacheLoader.refresh实现为异步,那么检索不会被刷新拖慢)。因此,如果你在缓存上同时声明expireAfterWrite和refreshAfterWrite,缓存并不会因为刷新盲目地定时重置,如果缓存项没有被检索,那刷新就不会真的发生,缓存项在过期时间后也变得可以回收。
    • asMap视图

    asMap视图提供了缓存的ConcurrentMap形式,但asMap视图与缓存的交互需要注意:
    • cache.asMap()包含当前所有加载到缓存的项。

      因此相应地,cache.asMap().keySet()包含当前所有已加载键;

    • asMap().get(key)实质上等同于cache.getIfPresent(key),而且不会引起缓存项的加载。

      这和Map的语义约定一致。

    • 所有读写操作都会重置相关缓存项的访问时间,包括Cache.asMap().get(Object)方法和Cache.asMap().put(K, V)方法,但不包括Cache.asMap().containsKey(Object)方法,也不包括在Cache.asMap()的集合视图上的操作。

      比如,遍历Cache.asMap().entrySet()不会重置缓存项的读取时间。

    • 统计

    guava cache为我们实现统计功能,这在其它缓存工具里面还是很少有的。
    • CacheBuilder.recordStats()用来开启Guava Cache的统计功能。

      统计打开后, Cache.stats()方法会返回CacheStats对象以提供如下统计信息:

    • hitRate():

      缓存命中率;

    • averageLoadPenalty():

      加载新值的平均时间,单位为纳秒;

    • evictionCount():缓存项被回收的总数,不包括显式清除。
      此外,还有其他很多统计信息。这些统计信息对于调整缓存设置是至关重要的,在性能要求高的应用中我们建议密切关注这些数据, 这里我们就不一一介绍了。

    最后

    缓存虽然是个好东西,但是一定不能滥用,一定要根据自己系统的需求来妥善抉择。

    当然 guava除了cache这块还有很多其它非常有用的工具。

    展开全文
  • SpaceAPI缓存 –用node.js编写的,用于所有已知SpaceAPI端点的内存缓存服务器
  • memached分布式内存缓存服务器

    千次阅读 2016-05-09 00:20:09
    一:memached简介在许多高并发的应用中,把业务数据保持久化 ( 保存到数据库,磁盘文件或其它 ) 后,应用从持久化设备中读取数据并在浏览器中...这时候应用就需要一种缓存机制来提高并发读取速度的性能 , memcached 能
  • 内存缓存

    千次阅读 2019-03-20 10:21:30
    内存缓存 什么时候用 愿意消耗一些内存空间来提升速度 预料某些数据会被查询多次以上 缓存中存放的数据不会超过内存容量(应用程序的本地缓存,不会把数据存储到文件或服务器上) 可用方式 Google Guava Cache ...
  • 1.缓存为什么要存在应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的。如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候缓存就可以大展...
  • 缓存体系 为了提交服务器的性能和减小对数据库的压力,缓存在宝贝项目中应用较多,基本上很少有直接对数据库...其特点是缓存键值中有_1234(userid)的字样(memcache服务器是一种高效的分布式内存缓存服务器,可以方便
  • 分布式内存缓存服务器 。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。 通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 ...
  • Memcached:高性能的分布式内存缓存服务器 特征:  u协议简单:  n基于文本行的协议  u基于libevent的事件处理:  n程序库,能实现连接数的增加,O(1)性能  u内置内存存储方式  n数据存储在内存,重启数据消失...
  • php内存缓存实现方法

    2021-01-21 16:05:55
    memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度,memcached 使用了“Key=>Value”方式组织数据,可以允许不同主机上的多个用户同时访问这个缓存系统,...
  • iOS 内存缓存和磁盘缓存

    千次阅读 2017-02-26 12:48:59
    在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力。 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存容量大速度慢可持久化。
  • 对页面进行压缩处理; 服务器内存缓存. 1.对页面进行压缩处理 [root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf http { ... gzip on;//开启压缩 gzip_min_length 1000; //小文件不压缩...
  • free -h 查看内存缓存 watch free -h 实时查看内存缓存 发现不跑程序的时候,占用达到了71g 2.清理碎片 最开始认为可能是系统之前运行程序留下的缓存文件,所以使用清理缓存的方法。 sudo -s # 进入到管理员...
  • 这篇文章主要介绍了PHP内存缓存Memcached类,以实例形式分析了PHP内存缓存Memcached的实现方法,是php操作memcached的典型应用,非常具有实用价值,需要的朋友可以参考下本文实例讲述了PHP内存缓存Memcached类。...
  • libmemcached 是一个 C/C++ 语言用来链接到 memcached 缓存服务器的客户端开发包 Linux下安装memcached Posted on 2010-10-11 09:45 柯枫 阅读(636) 评论(0) 编辑 收藏 引用 所属分类: Memcached
  • ios 内存缓存

    千次阅读 2013-06-19 17:15:01
    使用缓存的目的是为了使用的应用...内存缓存我们可以使用sdk中的NSURLCache类。NSURLRequest需要一个缓存参数来说明它请求的url何如缓存数据的,我们先看下它的CachePolicy类型。 1、NSURLRequestUseProtocolCachePo
  • 查看内存容量 #free -m #free -g 查看 内存频率 dmidecode | grep -A16 'Memory Device$' | grep Speed IB卡速率 dmidecode -s system-serial-number 参考文章...
  • 在内存告警中,经常会遇到系统OOM,登陆服务器查看大部分...所以需要一个工具能帮助我去查看下当前系统环境下内存缓存的使用情况,最好能做个排序,从而一目了然知道缓存文件大户。答案是 hcache - a tool fork f...
  • /** * Created by hatmore on 13-12-11. ...//缓存模块 var fs = require('fs'); var cache = {}; module.exports= function cacheAndDelive(f,cb) { if(!cache[f]){ fs.readFile(f,function(err,data){
  • iOS开发之缓存(一):内存缓存 这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存内容。 使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行。有...
  • NSURLCache 内存缓存

    2016-02-18 19:02:26
    在 iOS 应用程序开发中,为了减少于服务端的交互次数减少网络加载频率.加快用户响应速度,一般都会在 iOS 设备中添加一个缓存机制....内存缓存我们可以使用 SDK中的NSURLCache 类.NSURLRequest 需要一个缓存参数来说
  • NSURLCache内存缓存

    2016-01-23 23:54:18
    在IOS应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在IOS设备中加一个缓存的机制。使用缓存的目的是为了使用的应用程序能更快速的... 内存缓存我们可以使用sdk中的NSURLCache类。NSURLRe
  • 如果没有内存缓存,则向分布式缓存Redis服务器请求数据。如果Redis中存在缓存,则将Redis中的缓存写入内存缓存,并向客户端返回缓存数据。如果Redis中也没有数据,那么只能查询数据库了。查询完数据,需要把此次查询...
  • iOS 内存缓存

    千次阅读 2014-05-15 17:22:21
    前面一片文章介绍了如何上传和下载文件,这篇文章将介绍一下如何在iOS设备中进行缓存。 这篇文章将只介绍一下将内容缓存到内存中,下一篇文章就介绍一下在iOS磁盘上缓存...内存缓存我们可以使用sdk中的NSURLCache类
  • Java中缓存之内存缓存

    千次阅读 2017-04-18 07:57:21
    Java中缓存之内存缓存 1.缓存为什么要存在  应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的。如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,598
精华内容 3,439
关键字:

服务器内存缓存