Play! Framework 框架之自定义缓存

最近在产品研发中希望能引入Membase NoSQL缓存系统,可惜Play!默认支持Memcached,另外可从官网下载Mongo数据库的Module,也能让Play!支持Mongo数据。

在一番搜索之后,发现Play!不支持Membase,这就必须要求我们只能够自己实现Cache。

可惜官网给的编写Module的例子太过简单,昨天发现了《Play Framework Cookbook》这本书,网上有PDF版本,里面介绍了一个实现自我实现Cache的示例,下面给出一个简单的说明,具体详细的实现会在我完成基于Membase的开发后,再详细介绍。

《Play Framework Cookbook》一书中使用的缓存系统是hazelcast。
1、从[url]http://www.hazelcast.com[/url]下载hazelcast的zip压缩包;
2、解压后,进入hazelcast的bin目录,执行run.sh(如果是Windows用户,看看有没有run.bat可执行);
3、将hazelcast-XX.jar,hazelcast-client-XX.jar复制到Play的module项目的lib目录中;
4、建立文件:conf/dependencies.yml,内容为:

self: play -> hazelcast 0.1
require:
- play
- com.hazelcast -> hazelcast-client 1.9.3.1:
transitive: false
- com.hazelcast -> hazelcast 1.9.3.1:
transitive: false


5、建立play.modules.hazelcast.HazelcastPlugin类:

public class HazelcastPlugin extends PlayPlugin {
public void onApplicationStart() {
Boolean isEnabled = new Boolean(Play.configuration.
getProperty("hazelcast.enabled"));
if (isEnabled) {
Logger.info("Setting cache to hazelcast implementation");
Cache.forcedCacheImpl = HazelCastCacheImpl.getInstance();
Cache.init();
}
}
}


6、建立play.modules.hazelcast.HazelCastCacheImpl类:

public class HazelCastCacheImpl implements CacheImpl {
private HazelcastClient client;
private static HazelCastCacheImpl instance;
public static HazelCastCacheImpl getInstance() {
if (instance == null) {
instance = new HazelCastCacheImpl();
}
return instance;
}
private HazelCastCacheImpl() {
String groupName = Play.configuration.getProperty("hazelcast.
groupname", "dev");
String groupPass = Play.configuration.getProperty("hazelcast.
grouppass", "dev-pass");
String[] addresses = Play.configuration.getProperty("hazelcast.
addresses", "127.0.0.1:5701").replaceAll(" ", "").split(",");
client = HazelcastClient.newHazelcastClient(groupName,
groupPass, addresses);
}

private IMap getMap() {
return client.getMap("default");
}

@Override
public void add(String key, Object value, int expiration) {
if (!getMap().containsKey(key)) {
getMap().put(key, value, expiration, TimeUnit.SECONDS);
}
}

@Override
public boolean safeAdd(String key, Object value, int expiration) {
getMap().putIfAbsent(key, value, expiration, TimeUnit.SECONDS);
return getMap().get(key).equals(value);
}
@Override
public void set(String key, Object value, int expiration) {
getMap().put(key, value, expiration, TimeUnit.SECONDS);
}
@Override
public boolean safeSet(String key, Object value, int expiration) {
try {
set(key, value, expiration);
return true;
} catch (Exception e) {}
return false;
}

@Override
public void replace(String key, Object value, int expiration) {
if (getMap().containsKey(key)) {
getMap().replace(key, value);
}
}
@Override
public boolean safeReplace(String key, Object value, int
expiration) {
if (getMap().containsKey(key)) {
getMap().replace(key, value);
return true;
}
return false;
}

@Override
public Object get(String key) {
return getMap().get(key);
}
@Override
public Map<String, Object> get(String[] keys) {
Map<String, Object> map = new HashMap(keys.len
for (String key : keys) {
map.put(key, getMap().get(key));
}
return map;
}
@Override
public long incr(String key, int by) {
if (getMap().containsKey(key)) {
getMap().lock(key);
Object obj = getMap().get(key);
if (obj instanceof Long) {
Long number = (Long) obj;
number += by;
getMap().put(key, number);
}
getMap().unlock(key);
return (Long) getMap().get(key);
}
return 0;
}
@Override
public long decr(String key, int by) {
return incr(key, -by);
}

@Override
public void clear() {
getMap().clear();
}

@Override
public void delete(String key) {
getMap().remove(key);
}
@Override
public boolean safeDelete(String key) {
if (getMap().containsKey(key)) {
getMap().remove(key);
return true;
}
return false;
}
@Override
public void stop() {
client.shutdown();
}
}


7、在conf/application.conf中添加配置:

hazelcast.enabled=true
hazelcast.groupname=dev
hazelcast.grouppass=dev-pass
hazelcast.addresses=127.0.0.1:5701


以上仅供参考,如果希望获取更详细的内容,可以阅读《Play Framework Cookbook》一书。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值