spring+memcache实践实例

配置文件:

<bean id="memcachedPool" class="com.danga.MemCached.SockIOPool"
		factory-method="getInstance" init-method="initialize" destroy-method="shutDown">
		<constructor-arg>
			<value>neeaMemcachedPool</value>
		</constructor-arg>
		<property name="servers">
			<list>
				<value>127.0.0.1:11211</value>
			</list>
		</property>
		<property name="initConn">
			<value>20</value>
		</property>
		<property name="minConn">
			<value>10</value>
		</property>
		<property name="maxConn">
			<value>50</value>
		</property>
		<property name="maintSleep">
			<value>30</value>
		</property>
		<property name="nagle">
			<value>false</value>
		</property>
		<property name="socketTO">
			<value>3000</value>
		</property>
	</bean>

	<bean id="memcachedClient" class="com.danga.MemCached.MemCachedClient">
		<constructor-arg>
			<value>neeaMemcachedPool</value>
		</constructor-arg>
		<property name="primitiveAsString">
			<value>true</value>
		</property>
		<property name="defaultEncoding">
			<value>utf-8</value>
		</property>
		<property name="compressEnable">
			<value>true</value>
		</property>
		<property name="compressThreshold">
			<value>4096</value>
		</property>
	</bean>

服务接口:

public interface MemcachedService {
    
    public MemCachedClient getMemCachedClient();
    
    public void setMemCachedClient(MemCachedClient memCachedClient);
    
    public boolean removeCached(String key);
    
    public void addCached(String key, Object value);
    
    public void addCached(String key, Object value, Date exTime);
    
    /**
     * 放入缓存
     * 
     * @param key
     * @param value
     */
    public void setCached(String key, Object value);
    
    /**
     * 放入缓存并且指定缓存时间
     * 
     * @param key
     * @param value
     * @param time
     */
    // public void setCached(String key, Object value, int time) {
    // memCachedClient.set(key, value, time);
    // }
    
    public void setCached(String key, Object value, Date time);
    
    /**
     * 取缓存
     * 
     * @param key
     * @return
     */
    public Object getCached(String key);
    
    /**
     * 清空缓存 慎用
     */
    public void clearCached();
    
    @SuppressWarnings("rawtypes")
    public Set filterCachedKey(String keyStart);
}
接口实现:

@Service("memcachedService")
public class MemcachedServiceImpl implements MemcachedService, Serializable {
    
    private static final long serialVersionUID = 3637897902641513553L;
    
    @Resource
    MemCachedClient memCachedClient;
    
    private static final Log log = LogFactory.getLog(MemcachedServiceImpl.class);
    
    @Override
    public MemCachedClient getMemCachedClient() {
        return memCachedClient;
    }
    
    public void setMemCachedClient(MemCachedClient memCachedClient) {
        
        this.memCachedClient = memCachedClient;
        
        // 序列化
        if (this.memCachedClient != null) {
            this.memCachedClient.setPrimitiveAsString(true);
        }
        
        log.debug(memCachedClient);
    }
    
    public boolean removeCached(String key) {
        log.debug("移出 key:" + key + " 的缓存");
        return memCachedClient.delete(key);
    }
    
    public void addCached(String key, Object value) {
        log.debug("存入key:" + key + "的缓存 ");
        memCachedClient.add(key, value, Integer.MAX_VALUE);
    }
    
    public void addCached(String key, Object value, Date exTime) {
        try {
            log.debug("存入key:" + key + "的缓存,过期时间为" + DateUtil.getFormatDate(exTime, "yyyy-MM-dd HH:mm:ss"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        memCachedClient.add(key, value, exTime);
    }
    
    /**
     * 放入缓存
     * 
     * @param key
     * @param value
     */
    public void setCached(String key, Object value) {
        log.debug("存入key:" + key + "的缓存 ");
        memCachedClient.set(key, value, Integer.MAX_VALUE);
    }
    
    /**
     * 放入缓存并且指定缓存时间
     * 
     * @param key
     * @param value
     * @param time
     */
    public void setCached(String key, Object value, int time) {
        memCachedClient.set(key, value, time);
    }
    
    // /**
    // * 放入缓存并且指定缓存时间
    // *
    // * @param key
    // * @param value
    // * @param time 有效期,单位为 毫秒
    // */
    // public void setCached(String key, Object value, int time) {
    // memCachedClient.set(key, value, new Date(time));
    // }
    
    public void setCached(String key, Object value, Date time) {
        try {
            log.debug("存入key:" + key + "的缓存,过期时间为" + DateUtil.getFormatDate(time, "yyyy-MM-dd HH:mm:ss"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        memCachedClient.set(key, value, time);
    }
    
    /**
     * 取缓存
     * 
     * @param key
     * @return
     */
    public Object getCached(String key) {
        log.debug(">>>>>>>>>>> [ from cached ]  取出key:" + key + "的缓存 ");
        return memCachedClient.get(key);
    }
    
    /**
     * 清空缓存 慎用
     */
    public void clearCached() {
        memCachedClient.flushAll();
    }
    
    /**
     * 
     * 从memcached 中检索以指定key为开头的一组key值
     */
    @SuppressWarnings("rawtypes")
    public Set filterCachedKey(String keyStart) {
        Set<String> keys = new HashSet<String>();
        try {
            int limit = 0;
            
            Map<String, Integer> dumps = new HashMap<String, Integer>();
            
            Map slabs = memCachedClient.statsItems();
            if (slabs != null && slabs.keySet() != null) {
                Iterator itemsItr = slabs.keySet().iterator();
                while (itemsItr.hasNext()) {
                    String server = itemsItr.next().toString();
                    Map itemNames = (Map)slabs.get(server);
                    Iterator itemNameItr = itemNames.keySet().iterator();
                    while (itemNameItr.hasNext()) {
                        String itemName = itemNameItr.next().toString();
                        // itemAtt[0]=itemname
                        // itemAtt[1]=number
                        // itemAtt[2]=field
                        String[] itemAtt = itemName.split(":");
                        
                        if (itemAtt[2].startsWith("number"))
                            dumps.put(itemAtt[1], Integer.parseInt(itemAtt[1]));
                        
                    }
                }
                if (!dumps.values().isEmpty()) {
                    Iterator<Integer> dumpIter = dumps.values().iterator();
                    while (dumpIter.hasNext()) {
                        int dump = dumpIter.next();
                        
                        Map cacheDump = memCachedClient.statsCacheDump(dump, limit);
                        Iterator entryIter = cacheDump.values().iterator();
                        while (entryIter.hasNext()) {
                            Map items = (Map)entryIter.next();
                            Iterator ks = items.keySet().iterator();
                            while (ks.hasNext()) {
                                String k = (String)ks.next();
                                if (k.startsWith(keyStart) && this.memCachedClient.keyExists(k)) {
                                    keys.add(k);
                                }
                            }
                        }
                    }
                }
                
            }
        } catch (Exception ex) {
            log.debug(ex.toString());
        }
        return keys;
        
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值