欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SSM秒杀系统(九)

程序员文章站 2022-04-22 08:18:07
...

该部分引入了redis缓存。

为什么要使用redis缓存,我们不是已经添加了ehcache缓存吗?

首先redis缓存相比于ehcache具有一定优势:

  • 集群环境下,那么每台服务器的ehcache是不同步的,这样会出问题的,ehcache只适合单机环境
  • redis是设置单独的缓存服务器,所有集群服务器统一访问redis,不会出现缓存不同步的情况,也就是redis缓存是共享的
  • 并且redis的效率更高

由于不想删除ehcache缓存,我直接在ehcache上添加了一层redis缓存,最终为redis+ehcache,当然这样并不如直接使用redis效率高

十三、redis缓存

在linux中安装redis

1.redis命令

cd redis-3.2.11/src  //进入到redis目录
./redis-server	//启动redis
./redis-cli shutdown //关闭redis
./redis-cli		//启动客户端

2.redis配置
我们需要配置redis.conf文件
因为redis默认只能本地访问,访问的地址为127.0.0.1,所以我们需要将绑定的地址注释,并且将保护模式关闭

3.redis缓存的实现步骤:

  • 缓存是在service层进行的,在web层调用的
  • 我们只需要将原来没有缓存的serviceimpl修改成含有缓存的serviceimpl就行了
  • 我们在web层中调用的service如果是含有缓存的service方法就会先查询缓存里是否包含该数据,如果redis缓存包含该数据,就直接返回;如果redis不包含该缓存,就去cache缓存查询,如果cache不包含,才从数据库查询。

13.2 实现过程

1.配置pom引入redis和spring和dubbo相关包

2.实现要使用redis服务的service接口和接口的实现类

  • 该接口实现类下面需要自动注入RedisUtil ,获取redis容器
public class MsproductRedisServiceImpl implements MsproductRedisService{
	
	@Autowired
	private MsproductCacheService msproductCacheService;
	
	@Autowired
	private RedisUtil redisUtil;
	
	/**
	 * 根据秒杀商品id查询秒杀商品
	 * @param msproductinfo
	 */
	public Msproductinfo querymsproductByid(int id){
		Msproductinfo msproductinfo = null;
		Object value = redisUtil.get("product:"+id);
		if(value == null){
			msproductinfo = msproductCacheService.querymsproductByid(id);
			redisUtil.set("product:"+id, msproductinfo);
		}else{
			System.out.println("come into  redis --  querymsproductByid");
			msproductinfo = (Msproductinfo)value;
		}
		return msproductinfo;
	}
}

3.配置redis项目,包括redis配置和dubbo配置
redis配置:
application-context-redis.xml

    <!-- 加载配置文件 -->  
    <context:property-placeholder location="classpath:*.properties" />  
    <!-- redis连接池配置-->    
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >    
        <!--最大空闲数-->    
        <property name="maxIdle" value="${redis.maxIdle}" />    
        <!--连接池的最大数据库连接数  -->  
        <property name="maxTotal" value="${redis.maxTotal}" />  
        <!--最大建立连接等待时间-->    
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />    
        <!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->  
        <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />   
        <!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->  
        <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />   
        <!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->  
        <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />   
        <!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->    
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />    
        <!--在空闲时检查有效性, 默认false  -->  
        <property name="testWhileIdle" value="${redis.testWhileIdle}" />    
    </bean >  
      
     
      
    <!--redis连接工厂 -->  
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">   
        <property name="poolConfig" ref="jedisPoolConfig"></property>   
        <!--IP地址 -->  
        <property name="hostName" value="${redis.hostName}"></property>   
        <!--端口号  -->  
        <property name="port" value="${redis.port}"></property>   
        <!--如果Redis设置有密码  -->  
        <property name="password" value="${redis.password}" />  
        <!--客户端超时时间单位是毫秒  -->  
        <property name="timeout" value="${redis.timeout}"></property>   
    </bean>
    <!--redis操作模版,使用该对象可以操作redis  -->  
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >    
        <property name="connectionFactory" ref="jedisConnectionFactory" />    
        <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->    
        <property name="keySerializer" >    
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />    
        </property>    
        <property name="valueSerializer" >    
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />    
        </property>    
        <property name="hashKeySerializer">    
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>    
        </property>    
        <property name="hashValueSerializer">    
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>    
        </property>    
        <!--开启事务  -->  
        <property name="enableTransactionSupport" value="true"></property>  
    </bean >    
      
    <!--自定义redis工具类,在需要缓存的地方注入此类  -->  
    <bean id="redisUtil" class="com.youfan.redis.RedisUtil">  
        <property name="redisTemplate" ref="redisTemplate" />  
    </bean>   
</beans>

redis.properties

  • 配置redis服务器地址和端口
  • 缓存容量
redis.hostName=121.199.28.205
redis.port=6379
redis.password=  
redis.timeout=10000
  
redis.maxIdle=300
#redis.maxActive=600   
redis.maxTotal=1000
redis.maxWaitMillis=1000
 
redis.minEvictableIdleTimeMillis=300000
redis.numTestsPerEvictionRun=1024
redis.timeBetweenEvictionRunsMillis=30000 
redis.testOnBorrow=true
redis.testWhileIdle=true

配置dubbo,给web层提供服务:

 	<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol> 
    <dubbo:application name="YF_MS_REDIS"/>
	
	<dubbo:registry address="zookeeper://121.199.28.205:2181" />
	
	 <dubbo:service interface="com.youfan.service.redis.MsproductDetailRedisService" ref="msproductDetailRedisServiceImpl"/>
    <bean id="msproductDetailRedisServiceImpl" class="com.youfan.redis.MsproductDetailRedisServiceImpl"/>
    
    <dubbo:service interface="com.youfan.service.redis.MsproductRedisService" ref="msproductRedisServiceImpl"/>
    <bean id="msproductRedisServiceImpl" class="com.youfan.redis.MsproductRedisServiceImpl"/>
    
    
     <dubbo:reference id="msproductDetailCacheService" interface="com.youfan.service.cache.MsproductDetailCacheService"/>
     <dubbo:reference id="msproductCacheService" interface="com.youfan.service.cache.MsproductCacheService"/>
        
</beans>

4.配置web层,让controller方法调用redis接口的方法。
最终我们查询商品信息和详情的方式:

redis - > cache -> 数据库

  • 我们先调用redis方法,去redis里查看是否右我们需要的数据
  • 如果redis没有需要的缓存,我们去cache查找
  • 如果cache也没有需要的缓存我们就从数据库查询
相关标签: SSM秒杀系统