当前位置: 首页 > 软件库 > 程序开发 > 缓存系统 >

xcache

分布式缓存组件
授权协议 Apache
开发语言 Java
所属分类 程序开发、 缓存系统
软件类型 开源软件
地区 国产
投 递 者 劳和雅
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

项目介绍

微服务时代,我们一般会用分布式缓存在提高系统的并发能力。 例如使用memcached、redis等比较知名的。但是很多时候, 作为普通业务程序员,他们可能在写业务的时候,并不想关心底层到底用的是memcached还是redis。 而且常用的缓存策略最好也是能够封装在缓存组件里面,供业务程序员使用。 这就是我封装这个组件的初衷。后面会慢慢支持各种实现,供使用者实现。

软件架构

组件分两个模块:

  1. client模块,对底层使用哪种缓存框架进行屏蔽封装。例如,目前支持memcached的spy客户端和xmemcached客户端。

  2. cache模块,在client的基础上加了一些缓存策略,例如:同步设置缓存策略、异步设置缓存策略(防缓存击穿和缩短RT时间)等

其中特别说明cache模块的两种策略:同步设置策略、异步设置策略
(1)同步设置策略
比较常见的做法,当get缓存时,如果缓存不存在或者缓存过期,那么就回源到DB获取数据,并 设置缓存,最后返回数据,这些步骤都在主线程中操作完成,简单明了,但有个缺点,存在缓存 击穿风险,当缓存过期时,由于要同时查询DB并设置缓存,RT会较长。
(2)异步设置策略
当get缓存时,如果缓存不存在,那按同步策略走,当缓存存在但是过期时,主线程先返回过期缓存 数据,再另起线程,查询DB,更新缓存,这中间会判断是否有同key的缓存正在设置,保证同一时间 不会出现多请求同key重复设置。这种方案,单机避免了缓存击穿风险,当缓存过期,RT也短,缺点 就是会有额外的线程池耗资源,还有就是缓存过期时,那一瞬间返回的时过期的数据。

版本说明

  1. V1.0支持memcached客户端的实现(spy、xmemcached都支持)

Maven支持

<dependency>
    <groupId>com.xuanner</groupId>
    <artifactId>xcache-core</artifactId>
    <version>1.0</version>
</dependency>

使用说明

  1. client模块的API使用:

/**
 * 获取spy客户端
 *
 * @return
 */
public static CacheClient getSpyClient() {
    SpyClientConfig config = new SpyClientConfig();
    config.setHost("xxx");
    config.setPort(11211);
    config.setUsername("xxx");
    config.setPassword("xxx");
    return new CacheClientBuilder().config(config).build();
}

/**
 * 获取xmemcached客户端
 *
 * @return
 */
public static CacheClient getXmemcacheClient() {
    XMemcachedClientConfig config = new XMemcachedClientConfig();
    config.setHost("xxx");
    config.setPort(11211);
    config.setUsername("xxx");
    config.setPassword("xxx");
    return new CacheClientBuilder().config(config).build();
}

public class ClientTest {

    private CacheClient cacheClient;

    @Before
    public void setup() {
        cacheClient = getSpyClient();
    }

    @Test
    public void test() {
        //删除
        cacheClient.delete("testKey");
        //设置
        cacheClient.put("testKey", "testValue", 2000, TimeUnit.MILLISECONDS);
        //获取
        String testValue = (String) cacheClient.get("testKey");
    }

}
  1. cache模块的API使用:

/**
 * 缓存的全局配置,一般一个应用一个配置,可以用全局版本号控制全缓存失效
 *
 * @return
 */
public static GlobalCacheConfig getGlobalCacheConfig() {
    GlobalCacheConfig globalCacheConfig = new GlobalCacheConfig();
    globalCacheConfig.setAppName("xuannerApp");
    globalCacheConfig.setAppCacheVersion(1);
    return globalCacheConfig;
}

/**
 * 缓存的模块配置,表示需要缓存的一类数据,例如一个电商有商品数据,类目数据等,可以用模块的版本控制本模块的缓存失效
 *
 * @return
 */
public static ModuleCacheConfig getModuleCacheConfig() {
    ModuleCacheConfig moduleCacheConfig = new ModuleCacheConfig();
    moduleCacheConfig.setCacheName("itemData");
    moduleCacheConfig.setCacheVersion(1);
    moduleCacheConfig.setExpTime(2000);//超时时间
    return moduleCacheConfig;
}

/**
 * 当缓存不存在或者过期时,需要回源到DB查询时的查询接口
 *
 * @return
 */
public static CacheLoader getCacheLoader() {
    return new CacheLoader() {

        @Override
        public Map loadData(Collection keys) {
            System.out.println("多个loader...");
            Map key2DataMap = new HashMap<>();
            keys.forEach(key -> key2DataMap.put(key, key + "_data"));
            return null;
        }

        @Override
        public String loadData(String key) {
            System.out.println("单个loader...");
            return key + "_data";
        }
    };
}

/**
 * 构建一个缓存
 *
 * @param strategy
 * @return
 */
public static Cache getCache(String strategy) {
    return new CacheBuilder().setCacheClient(getSpyClient()).setCacheLoader(
            getCacheLoader()).setGlobalCacheConfig(getGlobalCacheConfig()).setModuleCacheConfig(
            getModuleCacheConfig()).build(strategy);
}

public class CacehTest {

    private Cache cache;

    @Before
    public void setup() {
        //ASYNC表示异步设置缓存策略,SIMPLE表示同步设置缓存策略
        cache = getCache(CacheBuilder.ASYNC);
    }

    @Test
    public void test() {
        //删除缓存
        cache.delete("testKey");
        
        //获取缓存,当缓存不存在,会触发CacheLoader接口获取数据,并自动设置缓存,返回结果
        cache.get("testKey");
        
        //设置缓存,会触发CacheLoader接口获取数据,并自动设置缓存
        cache.set("testKey");
    }
}

联系方式

  1. 姓名:徐安

  2. 邮箱:javaandswing@163.com

  3. QQ:349309307

  4. 个人博客:xuanner.com

  • 编译安装xcache3.2.0时在make这一步报错: AUTOCHECK missing : "arg_flags" "cache_size" AUTOCHECK INFO: xc_constinfo_t: processor looks good AUTOCHECK INFO: xc_op_array_info_detail_t: processor looks good AUTOCHECK

  • 记录一下xcache导致的php-fpm 502问题 发布时间:2020-05-26 20:01:38 来源:51CTO 阅读:568 作者:270192891 现象是,只要用PHP cli模式跑脚本,网站立马就502。 查看错误日志,看到的是“child 31457 exited on signal 7 (SIGBUS) after 0.384581 seconds from start” 打开

  • 转为php服务的缓存配置 xcache配置

  • 先阐明一下我自己服务器的环境:yum 安装的 php 5.3.3;CentOS6.5 64位系统。 1、下载并解压XCache 3.2.0 wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz tar -zxvf xcache-3.2.0.tar.gz cd xcache-3.2.0 2、phpize安装 如果

  • 一,安装前准备 cd /usr/local/src wget http://cn2.php.net/distributions/php-5.4.7.tar.gz yum -yinstallgcc automake autoconf libtoolmake yum -yinstallgcc gcc-c++ glibc yum -yinstalllibmcrypt-devel mhash-devel

  • 相关参数: php安装目录:/usr/local/php php.ini配置文件路径:/usr/local/php/etc/php.ini Nginx?装目录:/usr/local/nginx Nginx网站根目录:/usr/local/nginx/html 操作步骤 1、安装xcache #cd /usr/local/src #进入软件包存放目录 #wget http://xcache.ligh

  • 操作系统:centos5.3  apache2.2.6  mysql5.0.18 php5.2.5  xcache2.0.0 1,进入xcache目录,使用phpize扩展php模块(/usr/local/src/xcache-2.0.0): phpize clean && phpize (提示正在生成configure...) 2,通过./configure --help查询自己需要安装xcac

  • [xcache-common] ;; install as zend extension (recommended), normally “$extension_dir/xcache.so” zend_extension = /路径/xcache.so ;; or install as extension, make sure your extension_dir setting is corre

  • ***********安装xcache,为php加速******************* unzip -o PHPMyAdmin-4.0.5-all-languages.zip mv PHPMyAdmin-4.0.5-all-languages /usr/local/apache/htdocs/pma 1,压力测试: ulimit -n 3000 ab -c 100 -n 2000 http:/

  • Zend Opcache与XCache之间共存与效率问题 我的博客之前安装了Zend Opcache,有博友询问过Zend Opcache与XCache在php.ini中应该谁在前面,担心两者之间是否有效率或者共存上的问题。所以简单说了下XCache Zend Guard Loader Zend OPcache在php.i我的博客之前安装了Zend Opcache,有博友询问过Zend Opcac

 相关资料
  • Web 应用程序可能需要为成百上千甚至更多的用户同时提供服务。如果你没有采取必要的措施,在这种负载下,你的网站可能会崩溃或变得没有响应。 假设在主页显示最后 10 条新闻,并且平均每分钟有上千名用户访问此页面。你可能为每个用户通过查询数据库来显示页面视图信息: SELECT TOP 10 Title, NewsDate, Subject, Body FROM News ORDER BY NewsD

  • 问题内容: 我正在寻找Java分布式缓存解决方案。我们希望功能喜欢: 我们已经分析了Terracotta这样的框架,它似乎是缓存框架中我们想要的一切……但是,似乎需要一个中央缓存节点,这成为我们的单点故障。 除了推出我们自己的解决方案之外,还有其他想法吗? 问题答案: 我建议使用JBossCache或EhCache(使用分布式缓存侦听器)。我都用过,我都喜欢,它们都适合您的要求。

  • 我正在使用ehcache(2.10.1)和terracotta(开源4.3.1)实现分布式缓存。我在单台机器上尝试了两个JVM实例和一个terracotta服务器,代码按预期工作,没有错误。 现在,我尝试运行相同的terracotta服务器,但在虚拟机上使用客户端。在虚拟机上运行客户端时,会收到以下消息和错误: 使用的 tc-config.xml 文件: 使用的 ehcache.xml 文件: 在

  • [命名空间: Serenity.Caching, 程序集: Serenity.Caching.Couchbase] Redis 是另一种内存数据库,由于其优秀的性能和可靠性, StackOverflow 也在使用它,他们所有的 WEB 服务只用了一个 Redis 数据库。 你可以从 Serenity.Caching.Redis 的 NuGet 程序包获取该服务类型的 Serenity 实现。 它可

  • [命名空间: Serenity.Caching, 程序集: Serenity.Caching.Couchbase] Couchbase 是一个分布式数据库,有像 Memcached 的访问接口。 可以从 NuGet 程序包 Serenity.Caching.Couchbase 获取 Serenity 对此服务类型的实现。 一旦你使用服务定位器注册它: Dependency.Resolve<IDep

  • [命名空间: Serenity.Abstractions, 程序集: Serenity.Core] 如果你现在不需要分布式缓存,但希望现在编写的代码在将来可以与分布式缓存一起工作,你可以使用 DistributedCacheEmulator 类。 DistributedCacheEmulator 也对单元测试和部署环境非常有用(因此,开发人员不需要访问分布式缓存系统而不会影响彼此的工作)。 Dis

  • 现在假设我们有一个社交网站,有数以百万的用户简介,一些著名用户的简介页面每分钟有数百或数千人访问。 要生成一个用户简介,需要多个 SQL 查询(朋友、相册名称及照片总数、简介信息、最后状态等)。 只要用户没有更新个人资料,在个人资料页显示的信息几乎是静态的。因此,个人资料页的快照可以缓存 5 分钟或 1 小时等。 但这或许还不够。我们正在谈论数以百万的简介和用户。用户不会只查看一些简介页。我们需要

  • [命名空间: Serenity.Abstractions, 程序集: Serenity.Core] 所有 NoSQL 服务器类型提供了一个类似的接口,像”使用该键存储此值”、”给我该键对应的值”等。 Serenity 通过一个没有依赖特定 NoSQL 数据库类型的通用接口提供分布式缓存的支持: public interface IDistributedCache { long Increm