zoukankan      html  css  js  c++  java
  • redis实现商品销量排行榜

    之前练习做过一个网上商城,采用SSM框架实现。该项目有一个商品排行榜模块没有实现,决定采用springboot+dubbo+redis实现该模块。

    1.新建springboot项目。

      本项目的springboot版本号为: 

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>

      引入dubbo及redis起始依赖。

           <!--引入dubbo-stater-->
            <dependency>
                <groupId>com.alibaba.boot</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>0.2.0</version>
            </dependency>
    
            <!--添加redis起始依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

    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类,并实现序列化

    import java.io.Serializable;
    
    public class ProductRank implements Serializable {
        private String productId;
        private String productName;
        private String price;
        private String imgUrl;
    
        public String getProductId() {
            return productId;
        }
    
        public void setProductId(String productId) {
            this.productId = productId;
        }
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    
        public String getPrice() {
            return price;
        }
    
        public void setPrice(String price) {
            this.price = price;
        }
    
        public String getImgUrl() {
            return imgUrl;
        }
    
        public void setImgUrl(String imgUrl) {
            this.imgUrl = imgUrl;
        }
    }

    4.新建service接口,创建该service与ProductRank类时应注意类路径与之前项目路径一致(dubbo引用服务时要求)。

    import cn.itcast.core.bean.ProductRank;
    
    import java.util.List;
    import java.util.Set;
    
    public interface ProductRankService {
        // 若没有该数据记录则添加该数据以及score 若有则直接给score加count
        public void zSetAdd(ProductRank productRank, double count);
      //获取(end-begin)个记录的排名
        public List<Object> getSetRank(Long begin, Long end);
    }

    5.创建redisconfg类,用来向容器中注入redisTemplate以及zSetOperations。

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ZSetOperations;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.ObjectMapper;
    @Configuration
    public class RedisConfig {
    
        @Bean
        @SuppressWarnings("all")
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
            template.setConnectionFactory(factory);
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
            // key采用String的序列化方式
            template.setKeySerializer(stringRedisSerializer);
            // hash的key也采用String的序列化方式
            template.setHashKeySerializer(stringRedisSerializer);
            // value序列化方式采用jackson
            template.setValueSerializer(jackson2JsonRedisSerializer);
            // hash的value序列化方式采用jackson
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            template.afterPropertiesSet();
            return template;
    
        }
    
        @Bean
        public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForZSet();
        }
    }

    6.创建serviceimpl实现类。

    import cn.itcast.core.bean.ProductRank;
    import com.alibaba.dubbo.config.annotation.Service;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ZSetOperations;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    @Service  //暴露服务
    @Component
    public class ProductRankServiceImpl implements  ProductRankService{
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Autowired
        private ZSetOperations<String,Object> zSetOperations;
        @Override
        public void zSetAdd(ProductRank productRank,double count) {
            String sortSetName = "product:rank";
            zSetOperations.incrementScore(sortSetName,productRank,count);
        }
    
        @Override
        public List<Object> getSetRank(Long begin, Long end) {
            List<Object> list = new ArrayList<>();
            String sortSetName = "product:rank";
            Set<Object> set= zSetOperations.reverseRange(sortSetName,begin,end);
            Iterator it = set.iterator();
            while(it.hasNext()){
                ProductRank p = (ProductRank)it.next();
                list.add(p);
            }
            return list;
        }
    }

     7.起始类上添加@EnableDubbo注解

    @EnableDubbo
    @SpringBootApplication
    public class BabaProductRankApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BabaProductRankApplication.class, args);
        }
    
    }

    8.在网上商城项目中引入dubbo依赖

                    <!-- 添加dubbo组件 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>

    9.在与新建springboot项目中相同路径下复制service接口类与ProductRank类。

                                                          

    如图所示。

    10.创建consumer.xml配置文件,引用服务。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            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">
        <context:component-scan base-package="cn.itcast.core.alipay"></context:component-scan> 
        <dubbo:application name="babasport"></dubbo:application>
        
        <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
        
        <!-- timeout="0" 默认是1000ms-->
        <!-- retries="":重试次数,不包含第一次调用,0代表不重试-->
        <!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 -->
        <dubbo:reference interface="cn.itcast.core.alipay.AlipayService" id="alipayService" timeout="300000000" retries="3" generic="false" check="false">
        </dubbo:reference>
        <dubbo:reference interface="cn.itcast.core.service.ProductRankService" id="productRankService" generic="fasle" check="false">
        </dubbo:reference>    
    </beans>

     11.使用注解注入,并调用,向redis中插入数据。

        

     使用redis-manager软件,查看向redis中添加的数据,如图。

     12.调用redis中的数据并显示在页面上。

    在jsp页面上显示:

    结果如下图。

     参考:博客地址

  • 相关阅读:
    学习日记13、ajax同时提交from表单和多个参数
    学习日记12、list集合中根据某个字段进行去重复操作
    学习笔记11 EF查询相当于sql 中的 where in
    学习日记10、easyui编辑器combobox绑定数据的两种方式
    学习日记9、easyui控件两次请求服务器端问题
    学习日记8、根据身份证号获取生日和性别
    学习日记7、mvc +easyui datagrid excel上传
    学习日记6、easyui datagrid 新增一行,编辑行,结束编辑和删除行操作记录
    学习日记5、easyui datetimebox 和combobox设置默认值
    mac下设置redis开机自启
  • 原文地址:https://www.cnblogs.com/menbo/p/11095631.html
Copyright © 2011-2022 走看看