精华内容
下载资源
问答
  • Nginx搭建图片服务器(静态资源缓存服务器).zip
  • redis缓存服务器

    2018-12-28 10:38:58
    redis缓存服务器
  • 配置本地缓存服务器(一)

    千次阅读 2018-11-10 11:17:48
    绝大多数系统管理员都遇到过开发部门抱怨软件包下载慢,严重影响工作效率的问题。解决问题的根本方法是建立本地镜像或缓存,对绝大多数企业来说,建立本地缓存是最好的方法。

    配置本地缓存服务器(一)

    绝大多数系统管理员都遇到过开发部门抱怨软件包下载慢,严重影响工作效率的问题。对此问题,系统管理员也很无奈,无论接入带宽是10M、100M还是1G光纤,都不能解决这个问题。原因是很多时候下载慢并不是因为接入带宽不够,而是因为去源库的路上要翻越千山万水,克服重重困难,才能取到我们需要的真经。尽管分布在各地的各种镜像,缓解了部分问题,真正能解决问题的方式是建立本地镜像或缓存。

    解决这个问题在最好办法是在本地建立镜像,但这种做法并不现实,资源要求太大,系统维护要求太高。我们采用了本地缓存方法来解决这个问题,原因是这种方式能解决绝大部分的问题,又没有大的资源和维护要求,完全能满足企业开发部门的需求。

    本文将介绍如何使用多种缓存软件组合为完整的缓存服务器,满足企业软件开发部分的需求。

    我们使用的免费缓存软件分别为:

    Nexus Repository Manager 3 OSS:用于缓存 Bower、Docker、Git LFS、Maven、npm、NuGet、PyPI和Ruby Gems。

    Apt-cacher-ng:该软件开发的目的是用于缓存Debian系的APT包,但实际上也能用于缓存YUM、RPM、BSD等的软件库。

    SQUID:可缓存任意想缓存的内容,但配置复杂。我们将用它缓存其他软件库,如CPAN、CRAN、PECL等等。

    下面我们将分别介绍它们的安装、配置和使用。




    基于Nexus Repository Manager 3 OSS的缓存服务

    这是由Sonatype公司开发的一款软件库管理软件,我们只介绍使用其缓存功能。我们可以从其下载页面获取该软件。


    安装Nexus Repository Manager 3 OSS

    安装Oracle Java 8
    注意:NXRM 3 OSS 和 OpenJDK 有兼容性问题,所以安装Oracle的Java。

    添加Oracle Java APT库

    	add-apt-repository ppa:webupd8team/java
    

    更新APT

    	apt update
    

    安装Java

    	apt install oracle-java8-installer
    

    检查已安装的Java

    	root@appcache:~# java -version
    	java version "1.8.0_191"
    	Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
    	Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
    	root@appcache:~# 
    

    将Nexus Repository 解压、安装到 /opt下

    	tar xvzf nexus-3.14.0-04-unix.tar.gz -C /opt
    

    链接 /opt/nexus-3.14.0-04 到 /opt/nexus

    	ln -s /opt/nexus-3.14.0-04 /opt/nexus
    

    设置 Nexus Repository 启停
    在链接 /opt/nexus/bin/nexus 到 /etc/init.d/nexus

    	ln -s /opt/nexus/bin/nexus /etc/init.d/nexus
    

    设置自动启动和自动停止

    update-rc.d nexus defaults
    

    启动Nexus命令:service nexus start
    停止Nexus命令:service nexus stop
    重启Nexus命令:service nexus restart
    显示Nexus状态:service nexus status
    重新加载配置文件: /etc/init.d/nexus reload

    Nexus Repository Manager已安装完成。重启系统,Nexus Repository Manager 将随系统自动启动。


    设置Nexus Repository Manager 3 OSS

    本文只介绍和缓存相关的内容。
    在这里插入图片描述
    这是管理员登陆后的界面,管理员默认登陆为admin:admin123。

    点击上方工具条中的齿轮图标进入管理页面。
    在这里插入图片描述
    NXRM OOS是一个功能非常丰富的Repository管理系统,本文只涉及其中的一小部分:Repository缓存。
    就是Repository部分,我们也只关心Repositories部分,其他三部分采用默认设置。

    点击【Repositories】
    在这里插入图片描述
    可以看到这儿有三个Repositories已经建立,分别为maven-central、maven-imagej和maven-public。下面我们将分别介绍这三个库。


    maven-central缓存库
    在这里插入图片描述
    这个库是用于缓存Maven的Central Repositoray,下面是一些参数介绍。

    • Name:必须在NXRM OSS中是唯一的,这里用的是maven-central
    • Type:这是缓存Central库,所以是proxy
    • URL:URL能操作到这个缓存库,这个链接是系统自动产生的。
    • Remote Repository:这是我们要缓存的库,这里是Central库,URL是https://repo1.maven.org/maven2/
    • Maximum Metadata Age:我们把数字从一天延长为一个月,目的是减少检查meta数据的频率,降低因获取metadata失败造成的build失败几率。
      在建立缓存库是,真正需要输入的只用NameRemote Repository。其他的采用默认值即可,默认值能满足绝大多数的需求。

    maven-imagej缓存库
    这个库是用于缓存ImageJ的Maven Repository。其他的设置和maven-central完全一样,除了NameRemote Repository
    Name:maven-imagej
    Remote Repository:http://maven.imagej.net/content/groups/public

    maven-public缓存库

    这个库和上面二个完全不一样,不是一个缓存库,它的作用是把该系统上的其他maven库集合成一个Maven总库,其他maven库中的artifacts都可以通过它来获取,它就是您的本地Central库。当增加新的Maven库时,开发者的本地Maven配置并不需要修改,这给开发人员提供了很大方便。

    在这里插入图片描述
    maven-public包含前面介绍的二个缓存库,maven-public查找排在最上面的库,如没找到需要的artifact,再从排在它下面的库中找。以此类推,直到找到或找完所有的成员库。

    maven-public库的URL可点击它所对应的【Copy】键获取。
    在这里插入图片描述

    配置NXRM OSS就是这么方便,这是我们选用它来做 Bower、Docker、Git LFS、Maven、npm、NuGet、PyPI和Ruby Gems 的缓存服务器的一个重要原因。


    使用Nexus Repository Manager 3 OSS

    首先需要设置本地的Maven的配置,新建立的maven-public库将成为配置文件中的唯一Maven库。
    $HOMEDIR/.m2/settings.xml

    <settings>
      <mirrors>
        <mirror>
          <!--This sends everything else to /public -->
          <id>lswin</id>
          <mirrorOf>*</mirrorOf>
          <url>http://appcache.lswin.cn:8081/repository/maven-public/</url>
        </mirror>
      </mirrors>
      <profiles>
        <profile>
          <id>lswin</id>
          <!--Enable snapshots for the built in central repo to direct -->
          <!--all requests to nexus via the mirror -->
          <repositories>
            <repository>
              <id>central</id>
              <url>http://central</url>
              <releases><enabled>true</enabled></releases>
              <snapshots><enabled>true</enabled></snapshots>
            </repository>
          </repositories>
          <pluginRepositories>
            <pluginRepository>
              <id>central</id>
              <url>http://central</url>
              <releases><enabled>true</enabled></releases>
              <snapshots><enabled>true</enabled></snapshots>
            </pluginRepository>
          </pluginRepositories>
        </profile>
      </profiles>
      <activeProfiles>
        <!--make the profile active all the time -->
        <activeProfile>lswin</activeProfile>
      </activeProfiles>
    </settings>
    

    现在让我们运行一个简单的项目,看看我们的配置是否按我们的要求工作。
    首先建立pom.xml文件,然后执行mvn package给项目打包。

    <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>cn.lswin</groupId>
      <artifactId>nexus-proxy-test</artifactId>
      <version>1.0-SNAPSHOT</version>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.10</version>
        </dependency>
        <dependency>
          <groupId>org.hamcrest</groupId>
          <artifactId>hamcrest-library</artifactId>
          <version>1.2.1</version>
        </dependency>
        <dependency>
          <groupId>net.imagej</groupId>
          <artifactId>imagej-ui-swing</artifactId>
          <version>0.21.4</version>
        </dependency>
      </dependencies>
    </project>
    

    这是一个空项目,我们只定了三个dependencies,分别是junit(版本4.10)、hamcrest-library(版本:1.2.1)和imagej-ui-swing(版本:0.21.4)。junit和hamcrest-library这二个版本都已经在Maven Central Repository中,imagej-ui-swing(版本:0.21.4)还没提交到Central Library,只能在ImageJ的Maven Repository中找到,这是为测试我们的缓存服务而特意安排的。

    运行数次mvn package后,完成了打包。
    在这里插入图片描述

    Mavan项目使用外部Maven库时,遇到下图所示的问题非常普遍:
    在这里插入图片描述
    如遇到下载pom文件出错,在再执行时可加上 -U标志,否则的活有可能立刻再次出错,原因是缓存会把没有资源的文件暂时屏蔽。-U 标志会忽略暂时标志,强制在指定的外部Maven库搜索资源。

    让我们检查我们的缓存库资源,是否从不同的Maven库上缓存了资源。
    在这里插入图片描述
    在这里插入图片描述
    很显然,我们成功地从不同的Maven库缓存了不同的资源。

    到此为止我们的Maven缓存服务器已经可以投入生产了。

    Bower、Docker、npm、NuGet、PyPI和Ruby Gems在此不做介绍,它们的配置方式和配置Maven缓存非常类似,可参照实施。

    注意,Git LFS并不是缓存,是用于支持Git LFS(Large File Storage),Git服务器上只需要存放一个文件指针,指向这个文件即可,无需将大文件上传到Git服务器。

    因为Nexus Repository Manager采用了特殊机制(下载-存储-提供服务),它可以缓存采用TLS/SSL加密传输的存储仓库内容。而其他缓存采用了下载/服务/缓存同时进行的技术,无法对采用TLS/SSL加密传输进行缓存。我们的建议是能采用NXRM OSS的,就用它进行缓存。




    基于APT-CACHER-NG的缓存服务

    该软件开发的目的是用于缓存Debian系的APT包,安装配置非常简单。

    安装 APT-CACHER-NG

    在Ubuntu上直接使用apt install apt-cacher-ng即可。

    root@appcache:~# apt install apt-cacher-ng
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Suggested packages:
      doc-base avahi-daemon
    The following NEW packages will be installed:
      apt-cacher-ng
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    Need to get 486 kB of archives.
    After this operation, 1,435 kB of additional disk space will be used.
    Get:1 http://us.archive.ubuntu.com/ubuntu bionic/universe amd64 apt-cacher-ng amd64 3.1-1build1 [486 kB]
    Fetched 486 kB in 4s (136 kB/s)       
    Preconfiguring packages ...
    Selecting previously unselected package apt-cacher-ng.
    (Reading database ... 102870 files and directories currently installed.)
    Preparing to unpack .../apt-cacher-ng_3.1-1build1_amd64.deb ...
    Unpacking apt-cacher-ng (3.1-1build1) ...
    Processing triggers for ureadahead (0.100.0-20) ...
    Processing triggers for systemd (237-3ubuntu10.3) ...
    Processing triggers for man-db (2.8.3-2) ...
    Setting up apt-cacher-ng (3.1-1build1) ...
    Created symlink /etc/systemd/system/multi-user.target.wants/apt-cacher-ng.service → /lib/systemd/system/apt-cacher-ng.service.
    Processing triggers for systemd (237-3ubuntu10.3) ...
    Processing triggers for ureadahead (0.100.0-20) ...
    root@appcache:~# 
    

    配置APT-CACHER-NG

    APT-CACHER-NG安装完后无需修改就能提供一般的缓存服务,但为了更好地适应生产环境,我们还是要对默认配置做少量修改。
    缓存过期设置(ExThreshold):默认值是4(4天)。在实际使用中,建议将它设为365(一年),甚至更大。现在磁盘价格不高,并且我们希望这个缓存保留尽可能长的时间。
    您可能需要配置CApath和CAfile二个参数,如果您准备做APT-SSL缓存。

    配置APT使用 APT-CACHER-NG

    建立/etc/apt/apt.conf.d/00aptproxy文件,将下列内容加入给文件:
    vi /etc/apt/apt.conf.d/00aptproxy

    Acquire::http::Proxy "http://appcache.lswin.cn:3142";
    

    任何欲使用该缓存的都需要有此配置文件。

    其他配置无需任何修改,所有APT相关配置继续有效。如需修改APT配置,只需要按正常情况修改即可,这个缓存是完全透明的。这也是我们为什么选用APT-CACHER-NG做这类库的缓存服务器而不使用NXRM OSS的原因。

    配置Centos使用 APT-CACHER-NG

    APT-CACHER-NG可直接支持YUM缓存,只需要在/etc/yum.conf加上缓存代理配置即可。

    proxy=http://[192.168.220.20]:3142
    

    该配置中必须使用IP地址,不得使用FQDN。
    在这里插入图片描述
    第一次使用并安装gcc-C++,下载速度是8.1MB/s。

    在这里插入图片描述
    在另一台Centos安装gcc-C++,下载速度是67MB/s。

    这证明APT-CACHER-NG也可用于缓存YUM库。

    检查 APT-CACHER-NG的缓存

    在这里插入图片描述
    我们可以确认,APT-CACHER-NG不但能缓存APT的debian类型库,也能缓存Redhat类型的库。

    检查 APT-CACHER-NG的缓存

    有时会因为下载出错或其他原因,可能发生Hash Mismatch错误,如下:
    在这里插入图片描述
    如发生这种情况,我们可以用如下URL纠正错误:
    http://appcache.lswin.cn:3142/acng-report.html?abortOnErrors=aOe&byPath=bP&byChecksum=bS&truncNow=tN&incomAsDamaged=iad&purgeNow=pN&doExpire=Start+Scan+and%2For+Expiration&calcSize=cs&asNeeded=an#bottom

    我们也可以将下列内容加入/etc/cron.daily/apt-cacher-ng中,这条内容必须在所有可执行语句前。

    export ACNGREQ="?abortOnErrors=aOe&byPath=bP&byChecksum=bS&truncNow=tN&incomAsDamaged=iad&purgeNow=pN&doExpire=Start+Scan+and%2For+Expiration&calcSize=cs&asNeeded=an"
    
    

    这样,缓存每天会被检查清理一次。

    APT-CACHER-NG最大的不足是不能缓存使用TLS/SSL加密传输的任何文件,在使用APT仓库源的时候,尽量选用不使用TLS/SSL的仓库。是否有必要使用TLS/SSL加密传输,在Debian社区有过讨论,在可预见的将来,DEB官方库会一直使用不加密传输,数据完整性经由校验码保证。




    SQUID缓存服务器

    最后我们介绍用SQUID为其他软件包下载做缓存。

    编译SQUID3

    APT库中已编译的SQUID包没有SSL支持,而支持缓存HTTPS必须有SSL支持,所以我们必须自己编译SQUID。

    获取SQUID3源码包,并修改编译选项

    修改/etc/apt/source.list,允许从库中获取源码包。

    deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted
    

    更新库数据,获取源码包并修改编译rules文件

    # 更新库数据
    root@appcache:~# apt update
    # 建立工作目录
    root@appcache:~# mkdir squid3
    # 进入工作目录
    root@appcache:~# cd squid3
    #获取SQUID3源码包
    root@appcache:~/squid3# apt source squid3
    # 进入源码目录
    root@appcache:~/squid3# cd squid3-3.5.27
    #修改编译rules文件 squid3-3.5.27/debian/rules,添加SSL支持
    # from diff debian/rules debian/rules.old
    53,56c53
    < 		--with-default-user=proxy \
    < 		--with-openssl \
    < 		--enable-ssl \
    < 		-enable-ssl-crtd
    ---
    > 		--with-default-user=proxy
    
    

    安装编译SQUID所需要的包

    root@appcache:~# apt install build-essential sharutils ccze libzip-dev libssl1.0-dev
    root@appcache:~# apt install libldap2-dev libpam0g-dev libdb-dev cdbs libsasl2-dev debhelper libcppunit-dev libkrb5-dev comerr-dev libcap2-dev libecap3-dev libexpat1-dev libxml2-dev libltdl-dev pkg-config libnetfilter-conntrack-dev nettle-dev libgnutls28-dev dh-apparmor dh-autoreconf
    

    安装SQUID

    # 编译并生成 .deb 包
    root@appcache:~/squid3/squid3-3.5.27# dpkg-buildpackage -rfakeroot -b
    

    编译完成后,一系列 .deb 会在 ~/squid3目录下生成。
    回到~/squid3目录,安装新生成的SQUID3.

    # 首先安装支持包
    root@appcache:~/squid3# apt install squid-langpack libdbi-perl ssl-cert
    # 然后安装新生成的 .deb包
    root@appcache:~/squid3# dpkg -i squid-common_3.5.27-1ubuntu1.1_all.deb squid_3.5.27-1ubuntu1.1_amd64.deb
    # 再安装新生成的功能包
    root@appcache:~/squid3# dpkg -i squidclient_3.5.27-1ubuntu1.1_amd64.deb squid-dbg_3.5.27-1ubuntu1.1_amd64.deb squid-purge_3.5.27-1ubuntu1.1_amd64.deb squid3_3.5.27-1ubuntu1.1_all.deb
    # 安装 APACHE2,因为SQUID-CGI需要
    root@appcache:~/squid3# apt install apache2
    # 最后安装 squid-cgi包
    root@appcache:~/squid3# dpkg -i squid-cgi_3.5.27-1ubuntu1.1_amd64.deb
    # 停止 squid
    root@appcache:~/squid3# service squid stop
    # 初始化 /var/lib/ssl_db
    root@appcache:~/squid3# /usr/lib/squid/ssl_crtd -c -s /var/lib/ssl_db
    # 修改 /var/lib/ssl_db属性
    root@appcache:~/squid3# chown -R proxy. /var/lib/ssl_db
    # 启动 SQUID
    root@appcache:~/squid3# service squid start
    # 检查 SQUID3 状态
    root@appcache:~/squid3# service squid status
    
    

    我们应该能看到SQUID已经正常运行。

    root@appcache:/var/lib/ssl_db# service squid status
    ● squid.service - LSB: Squid HTTP Proxy version 3.x
       Loaded: loaded (/etc/init.d/squid; generated)
       Active: active (running) since Mon 2018-10-22 22:41:50 CST; 53s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 1982 ExecStop=/etc/init.d/squid stop (code=exited, status=0/SUCCESS)
      Process: 2044 ExecStart=/etc/init.d/squid start (code=exited, status=0/SUCCESS)
        Tasks: 10 (limit: 4633)
       CGroup: /system.slice/squid.service
               ├─2094 /usr/sbin/squid -YC -f /etc/squid/squid.conf
               ├─2096 (squid-1) -YC -f /etc/squid/squid.conf
               ├─2097 (ssl_crtd) -s /var/lib/ssl_db -M 4MB
               ├─2098 (ssl_crtd) -s /var/lib/ssl_db -M 4MB
               ├─2099 (ssl_crtd) -s /var/lib/ssl_db -M 4MB
               ├─2100 (ssl_crtd) -s /var/lib/ssl_db -M 4MB
               ├─2101 (ssl_crtd) -s /var/lib/ssl_db -M 4MB
               ├─2102 (logfile-daemon) /var/log/squid/access.log
               ├─2103 (unlinkd)
               └─2104 (pinger)
    
    Oct 22 22:41:50 appcache systemd[1]: Starting LSB: Squid HTTP Proxy version 3.x...
    Oct 22 22:41:50 appcache squid[2044]:  * Starting Squid HTTP Proxy squid
    Oct 22 22:41:50 appcache squid[2094]: Squid Parent: will start 1 kids
    Oct 22 22:41:50 appcache squid[2094]: Squid Parent: (squid-1) process 2096 started
    Oct 22 22:41:50 appcache squid[2044]:    ...done.
    Oct 22 22:41:50 appcache systemd[1]: Started LSB: Squid HTTP Proxy version 3.x.
    
    

    配置SQUID
    目标:
    一、只代理HTTP、HTTPS和FTP
    二、HTP、HTTPS和FTP使用单一端口:3128
    三、只代理白名单中的URL
    四、专用代理缓存服务,采用explicit模式

    只需要代理HTTP、HTTPS和FTP,ACL部分的配置为:

    # 
    acl SSL_ports port 443
    acl Safe_ports port 80          # http
    acl Safe_ports port 21          # ftp
    acl Safe_ports port 443         # https
    acl CONNECT method CONNECT
    
    # 拒绝非Safe_ports
    http_access deny !Safe_ports
    
    # CONNECT方法只允许在SSL_ports
    http_access deny CONNECT !SSL_ports
    
    # 只允许本地访问cachemgr
    http_access allow localhost manager
    
    #
    # 允许规则在conf.d下
    # 只加载*.conf文件,白名单列表也在该目录下,以 .list 结尾
    include /etc/squid/conf.d/*.conf
    
    # 拒绝所有请求
    http_access deny all
    

    HTP、HTTPS和FTP使用单一端口:3128,缓存部分配置

    我们将采用SSL-BUMP方式配置普通缓存代理。

    http_port 3128 ssl-bump cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.pem generate-host-certificates=on
    
    ssl_bump bump all
    
    # 为保证下载站点的可靠性,拒绝所有安全证书有问题的站点
    sslproxy_cert_error deny all
    
    # SQUID有可能使用内存缓存内容,为提高缓存能力,将cache_mem设为1G,代价是硬件资源要求高
    cache_mem 1024 MB
    
    # 为提高缓存能力有效节省带宽,将maximum_object_size设为2G,代价是硬件资源要求高
    maximum_object_size 2024 MB
    
    # 缓存文件系统配置,优化大文件缓存,代价是硬件资源要求高
    cache_dir aufs /var/spool/squid 2048 16 256
    
    #
    # refresh_pattern定义
    #
    refresh_pattern ^ftp:                        1440    20%     10080
    refresh_pattern -i (/cgi-bin/|\?)            0       0%      0
    refresh_pattern .                            0       20%     4320
    refresh_pattern -i .(deb|rpm)$               10080   90%     43200 override-expire ignore-reload ignore-no-store ignore-must-revalidate ignore-private
    refresh_pattern -i .(exe|bin|sh|php)$        10080   90%     43200 override-expire ignore-reload ignore-no-store ignore-must-revalidate ignore-private
    refresh_pattern -i .(bz2|gz|tar|tgz|xgz)$    10080   90%     43200 override-expire ignore-reload ignore-no-store ignore-must-revalidate ignore-private
    refresh_pattern -i .(zip|rar|ram)$           10080   90%     43200 override-expire ignore-reload ignore-no-store ignore-must-revalidate ignore-private
    refresh_pattern -i .(ppt|doc|pdf)$           10080   90%     43200 override-expire ignore-reload ignore-no-store ignore-must-revalidate ignore-private
    refresh_pattern -i .(png|jpg|bmp|tiff)$      10080   90%     43200 override-expire ignore-reload ignore-no-store ignore-must-revalidate ignore-private
    # 如需要缓存其他类型文件,在此加入
    
    ## 避免proxy-chaining
    always_direct allow all
    
    

    squid.conf文件已配置完成,其他一些非相关配置保持默认即可。


    配置允许代理缓存站点
    因为TLS/SSL的特性,从TLS/SSL站点获取的内容不能被SQUID缓存。对HTTPS站点,SQUID只做了代理;对HTTP站点,SQUID同时完成代理和缓存。

    我们对HTTP/FTP和HTTPS站点进行独立ACL配置,每组配置有二个文件,分别是(allowed_http_site.conf、allowed_http_sites.list)和(allowed_https_sites.conf、allowed_https_sites.list)。.conf文件是ACL配置,.list是允许站点的regex描述列表。

    # 允许HTTP/FTP站点控制文件 allowed_http_sites.conf
    #
    # 从 /etc/squid/conf.d/allowed_http_sites.list 读取站点列表
    acl allowed_http_urls url_regex -i "/etc/squid/conf.d/allowed_http_sites.list"
    # 该列表站点只允许从非 SSL_ports 通过
    http_access allow !SSL_ports allowed_http_urls
    
    # 允许HTTP/FTP站点描述文件 allowed_http_sites.list
    #
    # 允许通过的URL为:www.sina.com/* 或 sina.com/*
    # 允许通过的协议为:ftp和http
    ^((ftp|http):\/\/)?(www\.)sina\.com.*$
    # 允许通过的URL为:baidu.com/* 或 (大、小写英文字符任意组合).baidu.com/*
    # 允许通过的协议为:ftp和http
    ^((ftp|http):\/\/)?(([a-zA-Z]+)\.)?baidu\.com.*$
    

    # 允许HTTPS站点控制文件 allowed_https_sites.conf
    #
    # 从 /etc/squid/conf.d/allowed_https_sites.list 读取站点列表
    acl allowed_https_sites ssl::server_name_regex -i "/etc/squid/conf.d/allowed_https_sites.list"
    # 该列表站点只允许从 SSL_ports 通过
    http_access allow SSL_ports allowed_https_sites
    
    # 允许HTTPS站点描述文件 allowed_https_sites.list
    #
    # 允许通过的URL为:www.sina.com/* 或 sina.com/*
    # 允许通过的协议为:https
    ^(https:\/\/)?(www\.)sina\.com$
    # 允许通过的URL为:baidu.com/* 或 (大、小写英文字符任意组合).baidu.com/*
    # 允许通过的协议为:https
    ^(https:\/\/)?(([a-zA-Z]+)\.)?baidu\.com$
    

    在HTTPS下,SQUID无法正确有效地获取URL,只能在服务器名上做控制。

    本地缓存服务器已全部配置完成,下面简单介绍一下常用开发软件的配置。




    常用开发软件系统的配置

    Maven

    配置文件:$HOME/.m2/settings.xml

    <settings>
            <mirrors>
                    <mirror>
                            <!--This sends everything else to /public -->
                            <!-- 系统ID,任意 -->
                            <id>lswin</id>
                            <mirrorOf>*</mirrorOf>
                            <!-- NXRM 3 OSS 缓存服务URL -->
                            <url>http://appcache.lswin.cn:8081/repository/maven-public/</url>
                    </mirror>
            </mirrors>
            <profiles>
                    <profile>
                            <id>lswin</id>
                            <!--Enable snapshots for the built in central repo to direct -->
                            <!--all requests to nexus via the mirror -->
                            <repositories>
                                    <repository>
                                            <id>central</id>
                                            <url>http://central</url>
                                            <releases><enabled>true</enabled></releases>
                                            <snapshots><enabled>true</enabled></snapshots>
                                    </repository>
                            </repositories>
                            <pluginRepositories>
                                    <pluginRepository>
                                            <id>central</id>
                                            <url>http://central</url>
                                            <releases><enabled>true</enabled></releases>
                                            <snapshots><enabled>true</enabled></snapshots>
                                    </pluginRepository>
                            </pluginRepositories>
                    </profile>
            </profiles>
            <activeProfiles>
                    <!--make the profile active all the time -->
                    <activeProfile>lswin</activeProfile>
            </activeProfiles>
    </settings>
    

    Python PIP

    配置文件:$HOME/.pip/pip.conf

    [global]
    index-url = http://appcache.lswin.cn:8081/repository/pypi-public/simple/
    
    [install]
    trusted-host = appcache.lswin.cn
    

    APT

    配置文件:/etc/apt/apt.conf.d/00aptproxy

    Acquire::http::Proxy "http://appcache.lswin.cn:3142";
    

    git

    配置文件:$HOME/.gitconfig

    [http]
            proxy = http://appcache.lswin.cn:3128
    [https]
            proxy = http://appcache.lswin.cn:3128
    

    wget

    配置文件:$HOME/.wgetrc

    https_proxy = http://appcache.lswin.cn:3128/
    http_proxy = http://appcache.lswin.cn:3128/
    ftp_proxy = http://appcache.lswin.cn:3128
    
    

    curl

    配置文件:$HOME/.curlrc

    proxy=http://appcache.lswin.cn:3128
    

    注意:一定不要使用全局PROXY设置!




    总结:能使用 Nexus Repository Manager 3 OSS 的,就不用 APT-CACHER-NG 和 SQUID;能使用 APT-CACHER-NG 的,就不用SQUID;最后的选择是SQUID。

    展开全文
  • 缓存服务器Cache Server 6.0发布

    千次阅读 2018-12-11 16:43:48
    无论是在个人的本地电脑,还是在团队的局域网专有服务器上,缓存服务器都能通过优化资源导入过程让使用Unity开发的速度变得更快。远程缓存服务器Cache Server 6.0版本现已发布,缓存服务器的质量和性能获得大幅提高...

    无论是在个人的本地电脑,还是在团队的局域网专有服务器上,缓存服务器都能通过优化资源导入过程让使用Unity开发的速度变得更快。远程缓存服务器Cache Server 6.0版本现已发布,缓存服务器的质量和性能获得大幅提高。

    这次的改进十分庞大,下面将由Asset Bundles研发主管Stephen Palmer为大家介绍详情。

    访问GitHub下载Cache Server 6.0:
    https://github.com/Unity-Technologies/unity-cache-server

     

    缓存服务器解决了哪些问题?
    在使用Unity编辑器时,每次增加或修改项目中的资源时,都必须进行一次导入过程。当参与Unity的开发团队逐渐壮大时,这样会产生二个问题:

    • 项目中会有更多资源。
    • 资源会更频繁地被修改。



    由于Unity编辑器需要不断计算并导入项目变更,你和团队成员会浪费大量宝贵的开发时间。对于多平台的项目而言,这个问题还会更为复杂。因为在切换目标平台时,所有项目中依赖平台的资源,例如纹理、音频都会重新进行转换,这个过程在大型项目中甚至会耗费多达几个小时。

    为了加快这个过程的完成速度,资源缓存服务器可以部署在本地系统供个人使用,也可以部署在局域网或广域网环境下,方便团队合作完成项目。Unity编辑器会使用资源缓存服务来储存和恢复多个平台的资源形式,同时分摊整个团队中的资源导入成本。

    缓存服务器的目标
    我们从不少开发者处得知,在使用缓存服务器时,他们遇到了诸如性能低下等问题。很明显,缓存服务器的架构已受制于其最初的设计,需要进行特别处理使其能符合当前Unity架构和质量标准。

    在本文中,将讲述我们通过性能检测、障碍识别和目标修复来为我们的开发人员尽快提供改进结果。

    性能测试

    因为Unity内部没有专门创作游戏的大型团队,我们不得不模拟真实世界的场景,从而快速识别仅在大型项目才遇到的性能问题。

    我们的测试环境包括:

    • 一个用Python编写的综合测试客户端,用于模拟超大流量,它的PUT/GET大小和并发连接数都是可配置的。
    • 在多个Mac OS和Windows下测试Unity编辑器,使用Python客户端和Unity编辑器客户端来模拟载入过程。
    • 一系列演示项目,特别是《Adam》内部和外部环境项目以及在我们支持库中的大型客户项目。



    我们对连接缓存服务器的单个Unity编辑器进行了测试,服务器和编辑器运行在同一系统上,也在千兆以太局域网上将缓存服务器作为托管服务器运行并测试。

    在托管服务器上,我们测试了以下几种情况:

    • 二个通过以太网连接的Unity编辑器客户端。
    • 二个通过Wi-Fi连接的Unity编辑器客户端。
    • 由Python综合脚本客户端和Unity编辑器客户端组成的大量客户端(不少于12个客户端)。



    性能测试结果
    测试的结果十分明显。连接到本地服务器的单个Unity编辑器客户端没有发现问题,总体性能不错。在广域网上连接的二个客户端也表现得很好。

    问题就发生在使用Wi-Fi连接的客户端,它们在大型综合测试时几乎无法使用。服务器查询、客户端断开连接等一些失败情况会更为频繁而快速地出现。我们需要弄清楚这些问题产生的原因。

    代码测试结果
    缓存服务器是一个Node.JS服务器应用,它对于I/O为中心的应用来说是个具有高度可扩展性的平台,它比我们在这所测试的多个并发客户端要好。所以问题出现在哪呢?

    比较明显的几个问题:

    • 代码缺乏自动测试套件。没有测试组件的话,要想在安全地对其更改以便进行性能改进测试,这几乎是不可能的事。而且,还有一些隐藏错误导致了一些已发现的问题。
    • 大量I/O同步文件调用。首先Node.JS是单线程的。其次,虽然Node.JS的文件系统支持同步和异步方式,我们原来主要采用的是同步操作。因此,调用或是进行CPU密集型任务会很快降低整个服务器的性能。
    • 在整个缓存大小超过限制时,服务器释放空间的方法十分消耗资源,并且会触发对整个目录的遍历,使所有新文件都被写入缓存中。
    • 管理协议处理和文件系统缓存的代码互相交织,使得在对特定目标进行优化时,很难隔离其它系统。



    性能改进实验
    在对特定问题进行处理前,我们对一些优化策略进行了预估。然后做了一些快速实现来评估它们所产生的影响。
     

    • 更新优化:我们制作了一个快速方法,用来尽可能多地移除同步调用,然后改进了一些库的用法。
    • 集群:我们实现了Node.js的集群,它将服务器分成可配置数量的离散进程。
    • 缓冲:我们试着通过缓冲套接字的写入来消除从服务器上传客户端时的套接字延迟。
    • 缓存到缓存”:我们实现了一个内存缓存,里面包含小型的(大小可配置,但目标小于64KB)缓存对象,从而减小了文件系统I/O。



    这些测试的结果和观测如下:

    • 更新优化和集群:在大量测试负载下,测试结果显示了更高的稳定性。它不会崩溃或是冻结,也没有与连接超时的服务器断开连接。
    • 缓冲:这个方法的结果比较复杂。综合测试表现出了一定的改善效果,但是实际的客户端测试则不一定。在Cache Server 6.0中,我们充分利用了Node.JS流架构来确保客户端和服务器之间的数据流尽可能高效。
    • “缓存到缓存”:这项优化在综合测试中效果拔群,但在实际的客户端测试中略有逊色。这种差异是因为一些综合测试使用了小型的标准资源,这类资源很适合这项优化策略。而实际客户端则更多地会有一些未排序资源大小,所以造成了二个结果的差异。



    第一阶段更新 : Cache Server 5.4
    基于这些实验,我们决定分二个阶段进行改进。在第一阶段,我们会先处理比较简单的问题,并对代码进行修改以方便以后的改进。
     

    • 为了提高错误修复的部署速度、使其拥有更快的发布周期和直接的社区贡献,我们将这部分开发移至GitHub上,代码在Apache 2.0协议下开源。
    • 我们实施了一套完整的测试套件,它能测试出一些重要的错误。
    • 增加了Node.JS集群支持,所有文件I/O操作都会与主要工作部分相隔离。在高负载情况下,这会大幅提升稳定性和性能。
    • 为了方便进行维护,我们重构了代码,将代码中的协议和文件系统功能分离开。



    在最初的性能调查完成后,仅过了2周,缓存服务器Cache Server 5.4便于去年九月发布。而且,在此过程中发现的错误修复会被回退到Unity 2017.2时发布的缓存服务器版本。自从Cache Server 5.4版发布后,我们收到了大量来自开发者的积极反馈,他们在此之前都遇到了缓存服务器的问题。

    第二阶段更新 :Cache Server 6.0
    自从Cache Server 5.4发布以来,我们一直在从头开始重建缓存服务器,为了可维护性和未来改进打下更好的基础。我们还希望对最为苛刻的企业环境提供高端解决方案,这些企业环境当前正部署和维护他们自行定制的缓存服务器解决方案。

    Cache Server 6.0有更高的可靠性和性能,还有一些新功能,包括:

    • 除了标准文件系统后端缓存模块外,还增加了高性能内存(RAM)缓存模块。
    • 事务镜像功能,用于自动同步对一个或多个下属缓存服务器的更改。
    • 一个项目导入工具,可以用于从已有完全导入的Unity项目中快速获取缓存服务器。



    小结
    缓存服务器Cache Server 6.0就介绍到这里,希望它能够帮助到Unity的开发人员提高使用Unity进行开发的工作效率,赶紧下载进行使用吧! 更多Unity的新功能介绍,尽在 Unity中文官方论坛(UnityChina.com) !
     

    展开全文
  • DNS高速缓存服务器的配置

    千次阅读 2018-11-05 22:24:29
    若网络中存在缓存机制,当客户端第一次访问目的主机时,会将目的主机的域名和ip缓存下来,当第二次访问该目的主机时,就不需要再次通过域名服务器来获得目的主机的域名和ip的对应关系,这极大的...

                                                   DNS高速缓存服务

    一、 DNS高速缓存的概念:

           DNS高速缓存服务的出现是为了提高客户端访问的效率。 若网络中存在缓存机制,当客户端第一次访问目的主机时,会将目的主机的域名和ip缓存下来,当第二次访问该目的主机时,就不需要再次通过域名服务器来获得目的主机的域名和ip的对应关系,这极大的提高了访问目标主机时的响应时间。

           为了避免缓存服务器中数据的有效性,通常缓存服务器对其数据设有过期期限,期限到后要重新更新数据。

    二、 DNS服务器的分类

    • 权威名称服务器:

    权威服务器又包括:Master(主要名称服务器);Slave(备份服务器),Slave通过区域传送从 Master 服务器获得区域数据的副本。

    • 非权威域名服务器

    即DNS高速缓存服务器,仅用于查找 , 对于非重要数据之外的任何内容都不具有权威性。

    三、配置DNS高速缓存服务器

            实验环境:一台linux系统的主机(作为dns高速缓存服务器的路由器,同时用作测试机),两台虚拟机(一台用作dns高速缓存服务器,一台用作测试机),一部手机(用来给dns高速缓存服务器提供网络)

            实验步骤:第一步,让dns高速缓存服务器能够访问ip为 114.114.114.114这个域名服务器。  第二步,下载dns服务的软件。 第三步,配置DNS高速缓存服务器。最后一步进行测试。

            实验目的:缩短客户端请求的响应时间。

            实验准备:我们让 server这台虚拟机作为 dns服务器,并在该虚拟机上配置好本地yum源; desktop作为测试机;真机作为路由器,且真机需要与两台虚拟机有桥接网络的关系。

    ##第一步:让dns服务器能够访问114.114.114.114:

         首先将真机的NAT路由策略开启:

         然后给dns高速缓存服务器配置ip,要和真机的ip在同一个网段,并且指定真机的ip为自己的网关。

    最后打开手机热点,用本机连接上手机的热点:

         现在测试看能否ping 通 114.114.114.114 :

       上图说明我们的虚拟机现在已经可以通过网络去访问 114.114.114.114 这台域名服务器了。

    ### 第二步,下载dns服务对应的软件:

          这步的前提是我们已经搭建好本地yum源了。

           若我们不知道要下载什么软件,可以用命令 yum search dns 搜索:

         我们在这里使用上图阴影部分所指示的软件。

         下面将该软件下载下来:

         接下来我们开启该服务,该软件对应的服务的名字为 named 。

         但重启的时候遇到一点麻烦,服务卡住起不开:

          这时我们可以在shell中随即敲击键盘的字母形成密钥。

         这时再查看named服务的状态就开启了:

           到这里dns对应的服务软件就下载好了。

    ### 第三步: 配置named服务:

         首先,关闭dns高速缓存服务器的防火墙。

         接着打开named服务的配置文件,named的配置文件在文件  /etc/named.conf 中:

    进入该配置文件要配置四处:

    第一处,更改  listen-on port 53 { 127.0.0.0; };  为   listen-on  port  53  { any; };

    第二处,修改  allow-query     { localhost; };    为     allow-query     { any; };

    第三处,添加 forwarders      { 114.114.114.114; };

    第四处,修改  dnssec-validation   yes;  为   dnssec-validation   no;

    最后重启该服务, systemctl  restart  named。

    到这里服务就算配置成功了。

    ### 开始测试

         我们配置desktop这台测试机访问的域名服务器 为 ip是113的 dns高速缓存器:

         我们也配置真机这个测试机 访问的域名服务器 为  ip是113的那台dns高速缓存器

             我们用dig 命令来进行测试:

            先用desktop 这台测试机  dig   www.baidu.com,下图的NOERROR表示服务的状态是正常的:

         第一次用时情况如下:

         因为第一次要去114.114.114.114这台域名服务器去获得解析数据,所以耗时较多。

        这时百度的域名信息已经缓存到dns高速缓存服务器中了。

         再使用真机去dig 百度:

          再看用时,只有1ms,如下图:

            实验结果证明 dns高速缓存实验确实能够最大程度的降低客户端请求响应的时间。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 采用redis作为独立缓存服务器(一)

    千次阅读 2018-02-03 00:54:45
    -- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 --> </bean> <!-- 单机版Redis集成 End --> Mybatis为了方便我们扩展缓存定义了一个Cache接口,看看...

    读者注意:接上篇,请先阅读上篇。

    一  环境

           基础环境:jdk1.7+spring3.2.9+mybatis3.2.2+redis3.2.8+mysql5.6

          引入额外的依赖

    <dependency>
        	<groupId>org.springframework.data</groupId>
        	<artifactId>spring-data-redis</artifactId>
        	<version>1.3.1.RELEASE</version>
    	</dependency>
    	<dependency>
    	    <groupId>redis.clients</groupId>
    	    <artifactId>jedis</artifactId>
    	    <version>2.4.1</version>
    	</dependency>
    maven会自动添加上如下依赖包:

    spring-data-redis-1.3.1.RELEASE.jar

    jedis-2.4.1.jar

    commons-pool2-2.0.jar

    附加工具及验证工具:

    centos6.5  64位   +     SecureCRT6.7  +  RedisDesktopManager0.8.8

    二    服务器架构



    三  关键代码

    =======================redis参数配置=====================================

    #*****************jedis连接参数设置*********************
    #redis服务器ip
    redis.ip=169.254.130.122
    #redis服务器端口号
    redis.port=6379
    #redis访问密码
    redis.passWord=test123
    #与服务器建立连接的超时时间
    redis.timeout=3000
    #************************jedis池参数设置*******************
    #jedis的最大活跃连接数
    jedis.pool.maxActive=50
    #jedis最大空闲连接数
    jedis.pool.maxIdle=10
    #jedis池没有连接对象返回时,等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。
    #如果超过等待时间,则直接抛出JedisConnectionException
    jedis.pool.maxWait=1500
    #从池中获取连接的时候,是否进行有效检查
    jedis.pool.testOnBorrow=true
    #归还连接的时候,是否进行有效检查
    jedis.pool.testOnReturn=true
    


    ======================spring配置=========================

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
    	xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:aop="http://www.springframework.org/schema/aop"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:cache="http://www.springframework.org/schema/cache"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans
    	 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    	 http://www.springframework.org/schema/aop 
    	 http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    	 http://www.springframework.org/schema/tx
    	 http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    	 http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.2.xsd
    	 http://www.springframework.org/schema/cache
         http://www.springframework.org/schema/cache/spring-cache-3.2.xsd">
    	 
    	<import resource="classpath:configs/spring/applicationContext-*.xml"/>
    	
    	<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    		<property name="locations">
    			<list>
    				<value>classpath:configs/druidConfig.properties</value>
    				<value>classpath:configs/redis.properties</value>
    			</list>
    		</property>
    	</bean>
    	<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    		<property name="driverClassName" value="${driverClassName}" />
    		<property name="url" value="${url}" />
    		<property name="username" value="${username}" />
    		<property name="password" value="${password}" />
    		<property name="filters" value="${filters}" />
    		<property name="initialSize" value="${initialSize}" />
    		<property name="maxActive" value="${maxActive}" />
    		<property name="minIdle" value="${minIdle}" />
    		<property name="maxWait" value="${maxWait}" />
    		<property name="validationQuery" value="${validationQuery}" />
    		<property name="testWhileIdle" value="${testWhileIdle}" />
    		<property name="testOnBorrow" value="${testOnBorrow}" />
    		<property name="testOnReturn" value="${testOnReturn}" />
    		<property name="maxPoolPreparedStatementPerConnectionSize" value="${maxPoolPreparedStatementPerConnectionSize}" />
    		<property name="removeAbandoned" value="${removeAbandoned}" />
    		<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
    		<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
    		<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
    	</bean>
    	<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="druidDataSource"></property>
    		<property name="configLocation">
    			<value>classpath:configs/mybatis-config.xml</value>
    		</property>
    		<property name="mapperLocations">
    			<list>
    				<value>classpath:com/wx/entitys/*.xml</value>
    			</list>
    		</property>
    	</bean>
    	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    		<constructor-arg name="sqlSessionFactory" ref="sessionFactory"></constructor-arg>
    	</bean>
    	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="druidDataSource"></property>
    	</bean>
    	<tx:advice id="txAdvise" transaction-manager="txManager">
    		<tx:attributes>
    			<tx:method name="find*" read-only="true"/>
    			<tx:method name="search*" read-only="true"/>
    			<tx:method name="query*" read-only="true"/>
    			<tx:method name="get*" read-only="true"/>
    			<tx:method name="add*" propagation="REQUIRED"/>
    			<tx:method name="save*" propagation="REQUIRED"/>
    			<tx:method name="do*" propagation="REQUIRED"/>
    			<tx:method name="update*" propagation="REQUIRED"/>
    			<tx:method name="del*" propagation="REQUIRED"/>
    		</tx:attributes>
    	</tx:advice>
    	<aop:config>
    		<aop:pointcut expression="execution(* com.wx.service.*.*(..))" id="myCut"/>
    		<aop:advisor advice-ref="txAdvise" pointcut-ref="myCut"/>
    	</aop:config>
    	 
        <!-- 配置redis 单机版 start-->
        <!-- redis数据源 -->
        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
            <!-- 最大空闲数 -->
            <property name="maxIdle" value="${jedis.pool.maxIdle}" />  
            <!-- 最大活跃数 -->
            <property name="maxTotal" value="${jedis.pool.maxActive}" />  
            <!-- 最大等待时间 -->
            <property name="maxWaitMillis" value="${jedis.pool.maxWait}" />  
            <!-- 返回连接时,检测连接是否成功 -->
            <property name="testOnBorrow" value="${jedis.pool.testOnBorrow}" />  
        </bean>
        
        <!-- Spring-redis连接池管理工厂 -->
        <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <!-- IP地址 -->
            <property name="hostName" value="${redis.ip}" />
            <!-- 端口号 -->
            <property name="port" value="${redis.port}" />
            <!-- 密码 -->
            <property name="password" value="${redis.passWord}"/>
            <!-- 超时时间 -->
            <property name="timeout" value="${redis.timeout}" />
            <property name="poolConfig" ref="poolConfig" />
        </bean> 
        
        <!-- 使用中间类解决RedisCache.jedisConnectionFactory的静态注入,从而使MyBatis实现第三方缓存 -->
        <bean id="redisCacheTransfer" class="com.wx.utils.RedisCacheTransfer">
            <property name="jedisConnectionFactory" ref="jedisConnectionFactory"/>
        </bean> 
        <!-- 单机版Redis集成 End -->
       
    </beans>

    Mybatis为了方便我们扩展缓存定义了一个Cache接口,看看ehcache-mybatis的源码就明白了。我们要使用自己的cache同样的实现Cache接口即可。

    package com.wx.utils;
    
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    import org.apache.ibatis.cache.Cache;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
    import org.springframework.data.redis.serializer.RedisSerializer;
    
    public class RedisCache implements Cache {
    
        private static JedisConnectionFactory jedisConnectionFactory;
                                              
        private final String id;
        
        private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        
        public RedisCache(final String id){
            if (id == null) {
                throw new IllegalArgumentException("cache instances require an ID");
            }
            this.id = id;
        }
        
        
        /**
         * 缓存的清除策略,只要有增删改操作,那么就会自动调用它 ,如果不需要,请注释掉
         */
        public void clear() {
        	RedisConnection connection = null;
            try {
            	connection=jedisConnectionFactory.getConnection();
                connection.flushDb();
                connection.flushAll();
                System.out.println("缓存被清空了....");
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if (connection != null) {
                    connection.close();
                }
            }
            
        }
    
        @Override
        public String getId() {
            return this.id;
        }
    
        @Override
        public Object getObject(Object key) {
            System.out.println("--------------------------------get_key==>"+key+"<==");
            Object result = null;
            //JedisConnection connection = null;
            RedisConnection connection = null;
            try {
                connection = jedisConnectionFactory.getConnection();
                RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
                result = serializer.deserialize(connection.get(serializer.serialize(key)));
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if (connection != null) {
                    connection.close();
                }
            }
            
            return result;
        }
    
        @Override
        public ReadWriteLock getReadWriteLock() {
            return this.readWriteLock;
        }
    
        @Override
        public int getSize() {
            int result = 0;
            //JedisConnection connection = null;
            RedisConnection connection = null;
            try {
                connection = jedisConnectionFactory.getConnection();
                result = Integer.valueOf(connection.dbSize().toString());
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if (connection != null) {
                    connection.close();
                }
            }
            return result;
        }
    
        @Override
        public void putObject(Object key, Object value) {
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>put_key===>"+key+"<===");
              
            //JedisConnection connection = null;
            RedisConnection connection = null;
            try {
                connection = jedisConnectionFactory.getConnection();
                RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
                System.out.println("**"+serializer.serialize(key));
                connection.set(serializer.serialize(key), serializer.serialize(value));
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if (connection != null) {
                    connection.close();
                }
            }
            
        }
    
        @Override
        public Object removeObject(Object key) {
            //JedisConnection connection = null;
        	RedisConnection connection=null;
            Object result = null;
            try {
            	System.out.println("===>"+key+"一个缓存被删除了");
                connection = jedisConnectionFactory.getConnection();
                RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer();
                result = connection.expireAt(serializer.serialize(key), 0);
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if (connection != null) {
                    connection.close();
                }
            }
            return result;
        }
    
        public static void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
            RedisCache.jedisConnectionFactory = jedisConnectionFactory;
        }
    }
    ========================

    package com.wx.utils;
    
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    
    //该类用于JedisConnectionFactory对象的注入
    public class RedisCacheTransfer {
    	 public void setJedisConnectionFactory(JedisConnectionFactory jedisConnectionFactory) {
    	       RedisCache.setJedisConnectionFactory(jedisConnectionFactory);
    	 }
    }
    


    ===============================

    在看ehcache-mybatis的源码 它真正使用cache的方式是通过集成org.apache.ibatis.cache.decorators.LoggingCache 这个类实现的,所以我们也继承

    package com.wx.utils;
    
    import org.apache.ibatis.cache.decorators.LoggingCache;
    
    public class LoggingRedisCache extends LoggingCache{
    	public LoggingRedisCache(String id) {  
            super(new RedisCache(id));  
    	} 
    }
    

    在mapper.xml中添加如下cache标签

    <!-- 支持缓存配置 -->
    	<cache type="com.wx.utils.LoggingRedisCache" />

    在mybatis核心配置文件中启用缓存功能

    <!-- 配置mybatis的缓存,延迟加载等相关属性 -->
        <settings>
            <!-- 是否开启全局缓存 -->
            <setting name="cacheEnabled" value="true"/>
            <!-- 查询时,关闭关联对象即时加载以提高性能 -->
            <setting name="lazyLoadingEnabled" value="false"/>
            <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
            <setting name="aggressiveLazyLoading" value="true"/>
            <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->  
        	<setting name="defaultExecutorType" value="REUSE" />
        	<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
            <setting name="multipleResultSetsEnabled" value="true"/>
        </settings>

    四   验证

    应用程序运行前,缓存服务器里面没有任何缓存,如图


    进行登录操作,并进入综合查询页码


    这中间会经历4个sql语句

    select * from users where userName=? and passWord=?

    SELECT s.stuId,s.stuName,s.gender,s.age,s.address,d.departName  FROM student s inner join department d   on s.deptidd=d.deptid   where 1=1 
       ORDER BY AGE DESC
       LIMIT ?,?

    SELECT count(*)   FROM student s inner join department d   on s.deptidd=d.deptid   where 1=1

    select departName from department

    然后我们可以看到缓存服务器上就会有对应的4个键值对

    直接从linux服务器上看


    从运行结果上看,先从缓存取,没取到从数据库取,然后存入缓存


    从redis图形管理界面也可以看出


    往后翻,发现一个sql一个key


    再次运行同样的sql,发现只从缓存取数据了,而没必要从数据库取数据了


    证明独立缓存集成配置成功!!!

    这里有个问题,如果进行增删改操作,会默认删除所有的缓存,而不是按照mapper的命名空间刷新缓存,如果有读者解决了这个问题请留言告诉我,感激不尽!!!

    该缓存解决方案并不能实现对缓存的精确控制!

    比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,
    但是要求用户每次都能查询最新的商品信息,此时就无法实现当一个商品变化时
    只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,
    当一个商品信息变化会将所有商品信息的缓存数据全部清空。
    解决此类问题需要在业务层根据需求对数据有针对性缓存。

    请读者继续阅读我的后面的博文,会提供相应解决方案!!!





















    展开全文
  • cdn之高速缓存服务器的搭建和配置

    万次阅读 2018-02-11 16:46:33
    一、cdn 1.名词解释 ...通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信...
  • 案例:Nginx作为Web缓存服务器应用

    千次阅读 2017-08-17 11:00:56
    从0.7.48版本开始,nginx支持类似Squid的缓存功能。nginx的Web缓存服务主要由proxy_cache相关...此外,也可以使用第三方模块ngx_slowfs_cache来实现缓存服务器配置。 首先是安装,安装过程基本上和安装nginx无区别,
  • redis作为缓存服务器

    千次阅读 2016-09-19 08:40:38
    Redis最常见的使用场景是作为缓存服务器进行数据缓存,而缓存数据的一大特性是数据具有时效性,在数据加载到Redis中进行缓存开始,隔一定时间后或者根据某个特定策略此数据就会过期失效,然后被删除。在Redis中有...
  • 是监听的服务器IP地址,如果有多个地址的话,指定下服务器的IP监听地址。  -p 是设置Memcache监听的端口,我这里设置了11211,最好是1024以上的端口,我们这里统一使用11211  -c 选项是最大运行的并发连接数...
  • 阿里云缓存服务器里面的一个坑

    千次阅读 2016-05-20 16:52:57
    公司的服务器是放在了阿里云上面的,阿里云有个十分给力的路由缓存功能,就是通过各种cache头去访问服务器的时候,阿里云会把这个结果保存到缓存服务器中,后面再次访问就不会经过我们自己的服务器,直接走缓存 ...
  • dns缓存服务器设置缓存时间

    千次阅读 2020-09-11 11:11:35
    options { listen-on port 53 { 12.0.0.125; }; listen-on-v6 port 53 { ::1; }; directory “/var/named”; dump-file “/var/named/data/cache_dump.db”;...statistics-file “/var/named/data/named_stats.txt”;...
  • Linux的本地DNS缓存服务器

    千次阅读 2014-08-12 14:09:06
    Linux的本地DNS缓存服务器 域名系统服务器的软件,在PC上,可以翻译的网站名称进入真正的IP地址上运行。在不同的话,如果你样的互联网地址到你的网页浏览器,你的互联网服务提供商的DNS服务器会考虑它的信息,并寻求...
  • 缓存服务器设计与实现(六)

    千次阅读 2016-01-05 15:40:07
    本文讲缓存中的内容管理--文件的删除。
  • nginx图片缓存服务器配置实战

    千次阅读 2013-06-25 17:03:46
    假定服务器主目录为nginx的默认目录:/usr/local/nginx-0.8.32/html/ 图片存放目录为:/usr/local/nginx-0.8.32/html/SD/images 图片缓存目录为:/usr/local/nginx-0.8.32/html/SD/images_cache 图片临时目录为:...
  • Memcached 与Redis缓存服务器介绍

    千次阅读 2017-03-15 19:00:30
    Memcached缓存简单介绍:memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。 Redis缓存简单介绍:是一个key-value...
  • 代理缓存服务器知识点整理

    千次阅读 2014-09-26 22:19:57
    【代理缓存服务器知识点整理】 一、http相关 1、正常http请求跟代理http请求的区别 常规的http请求头部:GET /index.html HTTP/1.1 Host:www.xuxiong.com 代理的http请求头部:GET ...
  • 玩玩儿nginx:缓存服务器

    千次阅读 2014-04-05 14:49:51
    我将演示如何使用nginx搭建一个缓存服务器,将该网站的jpg图片缓存到本地的nginx上。 安装nginx与常用命令 mac上安装nginx: brew install nginx nginx也可以安装在windows上。 配置nginx...
  • OpenWrt之dnsmasq工具(DHCP、TFTP、DNS缓存服务器) 介绍 智能路由器服务于家庭和小型企业网络,当多个人同时上网时,客户机经常进行DNS查询,大多查询会是重复的域名,如果有一个 DNS缓存代理 服务于局域网,这样将...
  • Web缓存/代理服务器技术

    千次阅读 2019-07-04 19:14:39
    对于计算机专业的学生,对缓存一词并不陌生。它在计算机当中应用的十分广泛,今天我们在Web服务器的学习中,也遇到了这一技术。我们来详细的学习一下。 1、功能 在不访问服务器的前提下满足客户端的HTTP请求。 2...
  • 缓存服务器设计与实现(五)

    千次阅读 2014-10-10 17:59:57
    上次讲到lru与缓存重建,这次主要讲一下关于过期处理的一些主要问题。在讨论这个问题之前,有个相关的问题需要大家有所了解。就是对于一个缓存如期只来说,什么东西应该缓存,什么不应该缓存。这是一个比较复杂的...
  • 缓存服务器设计与实现(四)

    千次阅读 2013-02-19 17:41:16
    这里我们聚焦一个问题,就是缓存满的情况。一般的cache都会配置容量,无论是内存缓存还是磁盘缓存,都不能无节制的去使用他们。这里以磁盘缓存为例,如果配置的限额已用完,该如何处理呢?  对于nginx,...
  • 继DNS服务器做缓存服务器

    千次阅读 2018-12-27 12:44:26
    缓存服务器是提高DNS 解析的过程。我来看看缓存服务器怎么部署。 如果不会部署DNS主服务器,请查看https://blog.csdn.net/qq_38993101/article/details/85236714 我的前一篇文章。 DNS缓存服务器(Caching DNS ...
  • 反向代理的概念(关于代理服务器分类更多详情,...务器的内容缓存器。 反向代理服务器是针对 WEB 服务器设置的,后台 WEB 服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台 WEB 服务器
  • 客户端缓存服务器缓存处理

    千次阅读 2016-03-26 00:15:27
    客户端缓存服务器缓存处理 一、概述   缓存的思想可以应用在软件分层的各个层面。它是一种内部机制,对外界而言,是不可感知的。   数据库本身有缓存,持久层也可以缓存。(比如:hibernate,还分1级和2级缓存...
  • Linux中怎么搭建DNS服务器 一、认识DNS: 首先我们要了解一下什么是域名,当我们在没有DNS域名解析服务器去访问某台服务器的时候,我们只能基于IP去访问,但由于IP难记且不方便。我们需要一种来取代它,就是域名,...
  • 服务器缓存(Cache)

    万次阅读 2018-06-21 12:09:14
    服务器缓存工作原理大纲如下:缓存模式 缓存淘汰 缓存击穿 缓存穿透 缓存雪崩缓存模式比较常见的模式有分为两大类: Cache-aside 以及 Cache-as-SoR。其中 Cache-as-SoR(System of Record, 即直接存储数据的DB) 又...
  • 当Android遇见HTTP缓存代理服务器

    千次阅读 2016-07-27 11:54:27
    对于用户数特别巨大的手机客户端来说,一些变化不大的静态页面和json数据没有必要每次打开都请求一遍网络,既增加了服务器压力,占用网络带宽,增加用户等待时间,也耗费了用户的网络流量,尤其在现在手机客户端用户...
  • squid高速缓存服务器的的介绍和配置

    千次阅读 2017-08-19 12:03:27
    Squid cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享...
  • 服务器缓存技术

    千次阅读 2016-08-22 15:26:31
    上图主要介绍了三种服务器,也是比较常用的服务器,下面就介绍这三种服务器缓存配置。 apache是作为正向代理服务器缓存,nginx和squid主要作为反向代理服务器缓存. 服务器缓存工作原理 上面是一个简单的流程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 925,941
精华内容 370,376
关键字:

缓存服务器