spring boot整合memcache

1.导入memcached客户端jar包

<dependency>
    <groupId>com.whalin</groupId>
    <artifactId>Memcached-Java-Client</artifactId>
    <version>3.0.2</version>
</dependency>

 

2.在application.yml设置memcache连接池配置属性值

memcache:
  servers: 127.0.0.1:11211
  failover: true
  initConn: 100
  minConn: 20
  maxConn: 1000
  maintSleep: 50
  nagel: false
  socketTO: 3000
  aliveCheck: true

 

3.设置项目启动读取application.yml中memcache属性值

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "memcache")
public class SockIOPoolConfig {

    private String[] servers;

    private Integer[] weights;

    private int initConn;

    private int minConn;

    private int maxConn;

    private long maintSleep;

    private boolean nagle;

    private int socketTO;

    public String[] getServers() {
        return servers;
    }

    public void setServers(String[] servers) {
        this.servers = servers;
    }

    public Integer[] getWeights() {
        return weights;
    }

    public void setWeights(Integer[] weights) {
        this.weights = weights;
    }

    public int getInitConn() {
        return initConn;
    }

    public void setInitConn(int initConn) {
        this.initConn = initConn;
    }

    public int getMinConn() {
        return minConn;
    }

    public void setMinConn(int minConn) {
        this.minConn = minConn;
    }

    public int getMaxConn() {
        return maxConn;
    }

    public void setMaxConn(int maxConn) {
        this.maxConn = maxConn;
    }

    public long getMaintSleep() {
        return maintSleep;
    }

    public void setMaintSleep(long maintSleep) {
        this.maintSleep = maintSleep;
    }

    public boolean isNagle() {
        return nagle;
    }

    public void setNagle(boolean nagle) {
        this.nagle = nagle;
    }

    public int getSocketTO() {
        return socketTO;
    }

    public void setSocketTO(int socketTO) {
        this.socketTO = socketTO;
    }

 

4.初始化memcache客户端

import com.idelan.iot.client.Memcache;
import com.whalin.MemCached.MemCachedClient;
import com.whalin.MemCached.SockIOPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MemcacheConfig {

   @Autowired
   private SockIOPoolConfig sockIOPoolConfig;

    @Bean
    public SockIOPool sockIOPool(){

        //获取连接池的实例
        SockIOPool pool = SockIOPool.getInstance();
        //服务器列表及其权重
        String[] servers = sockIOPoolConfig.getServers();
        Integer[] weights = sockIOPoolConfig.getWeights();
        //设置服务器信息
        pool.setServers(servers);
        pool.setWeights(weights);
        //设置初始连接数、最小连接数、最大连接数、最大处理时间
        pool.setInitConn(sockIOPoolConfig.getInitConn());
        pool.setMinConn(sockIOPoolConfig.getMinConn());
        pool.setMaxConn(sockIOPoolConfig.getMaxConn());
        //设置连接池守护线程的睡眠时间
        pool.setMaintSleep(sockIOPoolConfig.getMaintSleep());
        //设置TCP参数,连接超时
        pool.setNagle(sockIOPoolConfig.isNagle());
        pool.setSocketConnectTO(sockIOPoolConfig.getSocketTO());
        //初始化并启动连接池
        pool.initialize();
        return pool;
    }

    @Bean
    public Memcache memCachedClient(){
        return new Memcache(new MemCachedClient());
    }

 

5.编写Memcache类,实现memcache基本操作

import com.whalin.MemCached.MemCachedClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

public class Memcache {

    private final static Logger logger = LoggerFactory.getLogger(Memcache.class);

    private MemCachedClient memCachedClient;

    public Memcache(MemCachedClient memCachedClient) {
        this.memCachedClient = memCachedClient;
    }

    /**
     * 将netty客户端信息存入memcached
     * @param obj
     * @return
     */
    public boolean addChannel(String key, Object obj) {
        try {
            if (obj == null) {
                return false;
            }
            return memCachedClient.set(key, obj);
        } catch (Exception e) {
            logger.error("netty客户端插入memcache出错", e);
            return false;
        }
    }

    /**
     * 将netty客户端信息从memcached中移除
     * @param key
     * @return
     */
    public boolean removeChannel(String key) {
        try {
            if (StringUtils.isEmpty(key)) {
                return false;
            }

            return memCachedClient.delete(key);
        } catch (Exception e) {
            logger.error("netty客户端移除memcache出错", e);
            return false;
        }
    }

    /**
     * 从memcache中获取netty客户端
     * @param key
     * @return
     */
    public Object getChannel(String key) {
        try {
            if (StringUtils.isEmpty(key)) {
                return null;
            }
            return memCachedClient.get(key);
        } catch (Exception e) {
            logger.error("从memcache中获取客户端出错", e);
            return null;
        }
    }

    /**
     * 检测memcache中设备是否登录过
     * @param key
     * @return
     */
    public boolean exist(String key) {
        try {
            if (StringUtils.isEmpty(key)) {
                return false;
            }

            return memCachedClient.keyExists(key);
        } catch (Exception e) {
            logger.error("检测memcache中是否存在某个设备出错", e);
            return false;
        }
    }

 

6.方法调用

@Autowired
private Memcache memcache;

通过@Autowired注入Memcache类来调用memcach方法

posted @ 2018-08-31 10:41  谋知  阅读(335)  评论(0编辑  收藏  举报