Spring MVC 结合 Jedis Cluster

来源:互联网 发布:路由器突然没有网络 编辑:程序博客网 时间:2024/05/22 17:28

配置服务器端集群参考:Redis Cluster实践

实现代码

Maven

    <!-- redis -->    <dependency>        <groupId>org.springframework.data</groupId>        <artifactId>spring-data-redis</artifactId>        <version>1.7.2.RELEASE</version>    </dependency>    <dependency>        <groupId>redis.clients</groupId>        <artifactId>jedis</artifactId>        <version>2.9.0</version>    </dependency>    <dependency>        <groupId>commons-pool</groupId>        <artifactId>commons-pool</artifactId>        <version>1.6</version>    </dependency>    <!-- fastjson -->    <dependency>        <groupId>com.alibaba</groupId>        <artifactId>fastjson</artifactId>        <version>1.2.7</version>    </dependency>

配置host信息(master)

host.properties:

    address1=127.0.0.1:7000    address2=127.0.0.1:7001    address3=127.0.0.1:7002

利用FactoryBean代理JedisCluster(FactoryBean理解).

public class JedisClusterFactory implements FactoryBean<JedisCluster>, InitializingBean {    private Resource addressConfig;    private String addressKeyPrefix ;    private JedisCluster jedisCluster;    private Integer timeout;    private Integer maxRedirections;    private GenericObjectPoolConfig genericObjectPoolConfig;    private Pattern pattern = Pattern.compile("^.+[:]\\d{1,5}\\s*$");    @Override    public void afterPropertiesSet() throws Exception {        Set<HostAndPort> haps = this.parseHostAndPort();        jedisCluster = new JedisCluster(haps, timeout, maxRedirections,genericObjectPoolConfig);    }    @Override    public JedisCluster getObject() throws Exception {        return jedisCluster;    }    @Override    public Class<? extends JedisCluster> getObjectType() {        return (this.jedisCluster != null ? this.jedisCluster.getClass() : JedisCluster.class);    }    @Override    public boolean isSingleton() {        return true;    }    private Set<HostAndPort> parseHostAndPort() throws Exception {        try {            Properties prop = new Properties();            prop.load(this.addressConfig.getInputStream());            Set<HostAndPort> haps = new HashSet<HostAndPort>();            for (Object key : prop.keySet()) {                if (!((String) key).startsWith(addressKeyPrefix)) {                    continue;                }                String val = (String) prop.get(key);                boolean isIpPort = pattern.matcher(val).matches();                if (!isIpPort) {                    throw new IllegalArgumentException("ip 或 port 不合法");                }                String[] ipAndPort = val.split(":");                HostAndPort hap = new HostAndPort(ipAndPort[0], Integer.parseInt(ipAndPort[1]));                haps.add(hap);            }            return haps;        } catch (IllegalArgumentException ex) {            throw ex;        } catch (Exception ex) {            throw new Exception("解析 jedis 配置文件失败", ex);        }    }    public void setAddressConfig(Resource addressConfig) {        this.addressConfig = addressConfig;    }    public void setTimeout(int timeout) {        this.timeout = timeout;    }    public void setMaxRedirections(int maxRedirections) {        this.maxRedirections = maxRedirections;    }    public void setAddressKeyPrefix(String addressKeyPrefix) {        this.addressKeyPrefix = addressKeyPrefix;    }    public void setGenericObjectPoolConfig(GenericObjectPoolConfig genericObjectPoolConfig) {        this.genericObjectPoolConfig = genericObjectPoolConfig;    }}

Spring MVC 配置文件

<bean name="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig" >            <property name="maxWaitMillis" value="-1" />            <property name="maxTotal" value="1000" />            <property name="minIdle" value="8" />               <property name="maxIdle" value="100" /></bean><bean id="jedisCluster" class="com.redis.cluster.JedisClusterFactory">        <property name="addressConfig">            <value>/WEB-INF/properties/host.properties</value>        </property>        <property name="addressKeyPrefix" value="address" />        <property name="timeout" value="300000" />        <property name="maxRedirections" value="6" />        <property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" /></bean>

Redis Service

刷新最新的10条news, 如果缓存中存在,从缓存中读取,不存在,则从数据库中查询,并添加到缓存中(更新news省略)。

@Autowiredprivate JedisCluster jedisCluster ;public List<News> getTopNews() {        Long number=jedisCluster.scard("TopNews");        List<News> newsset=new ArrayList<News>();        if(number==10)        {            Set<String> set=jedisCluster.smembers("TopNews");            for(String str : set)            {                newsset.add(JSON.parseObject(str, News.class)); //读取缓存的json字符串转换为对象            }        }        else        {            newsset=getNewsFromDb();        }        return newsset;    }    public List<News> getNewsFromDb() {        List<News> res=newsService.getLatestNews(); //newsService操作news数据库的服务,省略。        List<News> reslist=new ArrayList<News>();        for(String str : jedisCluster.smembers("TopNews"))        {            jedisCluster.srem("TopNews", str);        }        for(News news:res)        {            reslist.add(news);            jedisCluster.sadd("TopNews", JSON.toJSONString(news)); //对象转换为json字符串,保存到缓存        }        return reslist;    }
0 0
原创粉丝点击