[JShop]开源电子商务系统jshop的系统缓存实现

前言

jeeshop中通过SystemManager管理了大量的缓存数据,来提升系统的性能,但这些缓存数据全部都是存放于内存中的,无法满足特定场景的数据更新(如集群环境)。JShop对jeeshop的缓存机制进行了扩展,提供CacheProvider来辅助SystemManager管理这些缓存数据,通过CacheProvider,可以把缓存存放在内存,ehcache,redis,memcached等各种不同的容器中,从而实现高度可定制的缓存管理机制。

CacheProvider

JShop中提供了三种不同类型的CacheProvider,分别为SimpleCacheProvider,EhcacheCacheProviderRedisCacheProvider, 分别使用内存,ehcache和redis来管理缓存数据. 开发者可以方便地定制自己的CacheProvider,来实现对缓存的管理。

CacheProvider接口定义

public interface CacheProvider {
    /**
     * 放入cache中
     * @param key
     * @param cacheObject
     */
    public void put(String key, Serializable cacheObject);

    /**
     * 获取放在cache中的内容
     * @param key
     * @return
     */
    public Serializable get(String key);

    /**
     * 清除cache中对应的值
     * @param key
     */
    public void remove(String key);

    /**
     * 清除所有的cache
     */
    public void clear();
}

CacheProvider与SystemManager配置

Jshop的缓存机制配置位于spring/applicationContext-cache.xml, 缓存配置示例如下:

    <bean id="systemManager" class="net.jeeshop.core.front.SystemManager">
        <property name="cacheProvider" ref="ehcacheCacheProvider"/>
    </bean>

    <bean id="ehcacheCacheProvider" class="net.jeeshop.core.cache.EhcacheCacheProvider">
        <property name="configLocation" value="classpath:ehcache.xml"></property>
        <property name="cacheName" value="eternalCache"/>
    </bean>

SimpleCacheProvider

SimpleCacheProvider内部通过Map来将所有缓存数据存放在内存中,所以相对简单,并会占用较多的内存资源,可以在一般的小型应用中使用,它的使用不需要其他的配置信息,只需要在配置文件中注入到systemManager即可,如:

    <bean id="systemManager" class="net.jeeshop.core.front.SystemManager">
        <property name="cacheProvider" ref="simpleCacheProvider"/>
    </bean>

    <!-- cache provider -->
    <bean id="simpleCacheProvider" class="net.jeeshop.core.cache.SimpleCacheProvider"/>

EhcacheCacheProvider

EhcacheCacheProvider通过ehcache管理缓存数据,使用它需要提供两个属性: configLocation: ehcache配置文件路径 cacheName : 所用的Cache名称(这里需要配置cache为永不过期,即eternal=true) 示例:

    <bean id="ehcacheCacheProvider" class="net.jeeshop.core.cache.EhcacheCacheProvider">
        <property name="configLocation" value="classpath:ehcache.xml"></property>
        <property name="cacheName" value="eternalCache"/>
    </bean>

RedisCacheProvider

EhcacheCacheProvider通过redis管理缓存数据,使用它需要提供Redis相关的配置信息,如数据源,连接池等。 相关的配置位于conf.properties,如下:

##redis配置##
redis.ip=localhost
redis.port=6379
redis.password=
redis.pool.maxIdle=200
redis.pool.testOnBorrow=true

完整的spring配置信息如下:

    <bean id="redisCacheProvider" class="net.jeeshop.core.cache.RedisCacheProvider">
        <property name="redisTemplate" ref="redisTemplate"/>
    </bean>

    <bean id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.ip}"/>
        <property name="port" value="${redis.port}"/>
        <property name="password" value="${redis.password}"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
    </bean>
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--<property name="maxActive" value="${redis.pool.maxActive}"/>-->
        <property name="maxIdle" value="${redis.pool.maxIdle}"/>
        <!--<property name="maxWait" value="${redis.pool.maxWait}"/>-->
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
    </bean>

猜你喜欢

转载自dinguangx.iteye.com/blog/2214133