之前练习做过一个网上商城,采用SSM框架实现。该项目有一个商品排行榜模块没有实现,决定采用springboot+dubbo+redis实现该模块。
1.新建springboot项目。
本项目的springboot版本号为:
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
引入dubbo及redis起始依赖。
com.alibaba.boot
dubbo-spring-boot-starter
0.2.0
org.springframework.boot
spring-boot-starter-data-redis
2.application.properties中配置如下信息
dubbo.application.name = baba-product-rank
dubbo.registry.address=127.0.0.1:2181 #zookeeper地址及端口号
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
#配置redis服务器
spring.redis.host=192.168.1.109 #redis服务器地址
spring.redis.port=6379
3.创建ProductRank类,并实现序列化
importjava.io.Serializable;public class ProductRank implementsSerializable {privateString productId;privateString productName;privateString price;privateString imgUrl;publicString getProductId() {returnproductId;
}public voidsetProductId(String productId) {this.productId =productId;
}publicString getProductName() {returnproductName;
}public voidsetProductName(String productName) {this.productName =productName;
}publicString getPrice() {returnprice;
}public voidsetPrice(String price) {this.price =price;
}publicString getImgUrl() {returnimgUrl;
}public voidsetImgUrl(String imgUrl) {this.imgUrl =imgUrl;
}
}
4.新建service接口,创建该service与ProductRank类时应注意类路径与之前项目路径一致(dubbo引用服务时要求)。
importcn.itcast.core.bean.ProductRank;importjava.util.List;importjava.util.Set;public interfaceProductRankService {//若没有该数据记录则添加该数据以及score 若有则直接给score加count
public void zSetAdd(ProductRank productRank, doublecount);
//获取(end-begin)个记录的排名public ListgetSetRank(Long begin, Long end);
}
5.创建redisconfg类,用来向容器中注入redisTemplate以及zSetOperations。
importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.ZSetOperations;importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom.fasterxml.jackson.databind.ObjectMapper;
@Configurationpublic classRedisConfig {
@Bean
@SuppressWarnings("all")public RedisTemplateredisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer= new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om= newObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer= newStringRedisSerializer();//key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);//hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);//value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);//hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();returntemplate;
}
@Beanpublic ZSetOperations zSetOperations(RedisTemplateredisTemplate) {returnredisTemplate.opsForZSet();
}
}
6.创建serviceimpl实现类。
importcn.itcast.core.bean.ProductRank;importcom.alibaba.dubbo.config.annotation.Service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.core.ZSetOperations;importorg.springframework.stereotype.Component;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importjava.util.Set;
@Service //暴露服务
@Componentpublic class ProductRankServiceImpl implementsProductRankService{
@AutowiredprivateRedisTemplate redisTemplate;
@Autowiredprivate ZSetOperationszSetOperations;
@Overridepublic void zSetAdd(ProductRank productRank,doublecount) {
String sortSetName= "product:rank";
zSetOperations.incrementScore(sortSetName,productRank,count);
}
@Overridepublic ListgetSetRank(Long begin, Long end) {
List list = new ArrayList<>();
String sortSetName= "product:rank";
Set set=zSetOperations.reverseRange(sortSetName,begin,end);
Iterator it=set.iterator();while(it.hasNext()){
ProductRank p=(ProductRank)it.next();
list.add(p);
}returnlist;
}
}
7.起始类上添加@EnableDubbo注解
@EnableDubbo
@SpringBootApplicationpublic classBabaProductRankApplication {public static voidmain(String[] args) {
SpringApplication.run(BabaProductRankApplication.class, args);
}
}
8.在网上商城项目中引入dubbo依赖
com.alibaba
dubbo
2.6.2
org.apache.curator
curator-framework
2.12.0
9.在与新建springboot项目中相同路径下复制service接口类与ProductRank类。
如图所示。
10.创建consumer.xml配置文件,引用服务。
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
11.使用注解注入,并调用,向redis中插入数据。
使用redis-manager软件,查看向redis中添加的数据,如图。
12.调用redis中的数据并显示在页面上。
在jsp页面上显示:
结果如下图。