微服务时代,我们一般会用分布式缓存在提高系统的并发能力。 例如使用memcached、redis等比较知名的。但是很多时候, 作为普通业务程序员,他们可能在写业务的时候,并不想关心底层到底用的是memcached还是redis。 而且常用的缓存策略最好也是能够封装在缓存组件里面,供业务程序员使用。 这就是我封装这个组件的初衷。后面会慢慢支持各种实现,供使用者实现。
组件分两个模块:
client模块,对底层使用哪种缓存框架进行屏蔽封装。例如,目前支持memcached的spy客户端和xmemcached客户端。
cache模块,在client的基础上加了一些缓存策略,例如:同步设置缓存策略、异步设置缓存策略(防缓存击穿和缩短RT时间)等
其中特别说明cache模块的两种策略:同步设置策略、异步设置策略
(1)同步设置策略
比较常见的做法,当get缓存时,如果缓存不存在或者缓存过期,那么就回源到DB获取数据,并 设置缓存,最后返回数据,这些步骤都在主线程中操作完成,简单明了,但有个缺点,存在缓存 击穿风险,当缓存过期时,由于要同时查询DB并设置缓存,RT会较长。
(2)异步设置策略
当get缓存时,如果缓存不存在,那按同步策略走,当缓存存在但是过期时,主线程先返回过期缓存 数据,再另起线程,查询DB,更新缓存,这中间会判断是否有同key的缓存正在设置,保证同一时间 不会出现多请求同key重复设置。这种方案,单机避免了缓存击穿风险,当缓存过期,RT也短,缺点 就是会有额外的线程池耗资源,还有就是缓存过期时,那一瞬间返回的时过期的数据。
V1.0支持memcached客户端的实现(spy、xmemcached都支持)
<dependency> <groupId>com.xuanner</groupId> <artifactId>xcache-core</artifactId> <version>1.0</version> </dependency>
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"); } }
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"); } }
姓名:徐安
QQ:349309307
个人博客: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