zoukankan      html  css  js  c++  java
  • Spring Boot—18Redis

    pom.xml

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.9</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- 因为采用了Redis连接池,所以要引用commons-pool2 -->
    <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.5.0</version> </dependency>

    application.properties

    #
    server.address=0.0.0.0
    server.port=8080
    server.servlet.context-path=/test
    server.session.timeout=300
    server.error.path=/error
    #
    server.tomcat.accesslog.enabled=true
    server.tomcat.accesslog.buffered=true
    server.tomcat.accesslog.directory=D:/Project/JavaWeb/SpringBoot/04JPASpringBoot/logs
    #
    spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
    spring.jackson.time-zone=Asia/Shanghai
    #
    spring.thymeleaf.cache=true
    spring.thymeleaf.enabled=true
    
    file.upload.path=D:/Project/JavaWeb/SpringBoot/04JPASpringBoot/fileUpLoad
    
    spring.servlet.multipart.enabled=true
    spring.servlet.multipart.file-size-threshold=0
    spring.servlet.multipart.location=D:/Project/JavaWeb/SpringBoot/04JPASpringBoot/temp
    spring.servlet.multipart.max-file-size=10MB
    spring.servlet.multipart.max-request-size=10MB
    spring.servlet.multipart.resolve-lazily=false
    
    
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    spring.datasource.druid.one.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false
    spring.datasource.druid.one.username=root
    spring.datasource.druid.one.password=gis
    spring.datasource.druid.one.driver-class-name=com.mysql.cj.jdbc.Driver
    
    ##Druid
    spring.datasource.druid.one.initial-size=2
    spring.datasource.druid.one.max-active=5
    spring.datasource.druid.one.min-idle=1
    spring.datasource.druid.one.max-wait=60000
    spring.datasource.druid.one.pool-prepared-statements=true
    spring.datasource.druid.one.max-pool-prepared-statement-per-connection-size=20
    spring.datasource.druid.one.validation-query=SELECT 1 FROM DUAL
    spring.datasource.druid.one.validation-query-timeout=60000
    spring.datasource.druid.one.test-on-borrow=false
    spring.datasource.druid.one.test-on-return=false
    spring.datasource.druid.one.test-while-idle=true
    spring.datasource.druid.one.time-between-eviction-runs-millis=60000
    spring.datasource.druid.one.min-evictable-idle-time-millis=100000
    #spring.datasource.druid.one.max-evictable-idle-time-millis=
    spring.datasource.druid.one.filters=stat,wall,log
    spring.datasource.druid.one.logSlowSql=true
    
    #
    # debug=true # Enable debug logs.
    # trace=true # Enable trace logs.
    
    spring.redis.host=127.0.0.1
    spring.redis.password=gis
    spring.redis.port=6379
    spring.redis.pool.max-active=8
    spring.redis.jedis.pool.max-active=8
    spring.redis.jedis.pool.max-idle=8
    spring.redis.jedis.pool.max-wait=-1ms
    spring.redis.jedis.pool.min-idle=0
    spring.redis.lettuce.pool.max-active=8
    spring.redis.lettuce.pool.max-idle=8
    spring.redis.lettuce.pool.max-wait=-1ms
    spring.redis.lettuce.pool.min-idle=0
    spring.redis.lettuce.shutdown-timeout=100ms
    spring.redis.ssl=false
    spring.redis.timeout=5000
    
    redis.message.topic=spring.news.*

    启动类

    package com.smartmap.sample.test;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import com.smartmap.sample.test.conf.DataSourceConfiguration;
    
    @EnableTransactionManagement
    @SpringBootApplication
    public class TestRedisApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(TestRedisApplication.class, args);
    
        }
    
    }

    注册Redis消息监听

    package com.smartmap.sample.test.conf;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.beans.factory.annotation.Value;
    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.StringRedisTemplate;
    import org.springframework.data.redis.listener.PatternTopic;
    import org.springframework.data.redis.listener.RedisMessageListenerContainer;
    
    import com.smartmap.sample.test.message.RedisMessageListener;
    
    @Configuration
    public class RedisChannelListenerConfiguration {
        Log log = LogFactory.getLog(RedisChannelListenerConfiguration.class);
        
        @Value("${redis.message.topic}")
        private String topic;
        
        /**
         * 注册Redis事件监听
         * publish spring.news.user bobobo
         * 
         * @param connectionFactory
         * @param listenerAdapter
         * @return
         */
        @Bean
        RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
                RedisMessageListener listenerAdapter) {
            RedisMessageListenerContainer container = new RedisMessageListenerContainer();
            container.setConnectionFactory(connectionFactory);
            container.addMessageListener(listenerAdapter, new PatternTopic(topic));
            log.info("------------> " + topic);
            return container;
        }
    
        @Bean
        StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
            return new StringRedisTemplate(connectionFactory);
        }
    }

    Redis消息处理类

    package com.smartmap.sample.test.message;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Service;
    
    @Service
    public class RedisMessageListener implements MessageListener {
        final Log log = LogFactory.getLog(RedisMessageListener.class);
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        public void setRedisTemplate(StringRedisTemplate stringRedisTemplate) {
            this.stringRedisTemplate = stringRedisTemplate;
        }
    
        @Override
        public void onMessage(Message message, byte[] pattern) {
            byte[] bodyByte = message.getBody();
            byte[] channelByte = message.getChannel();
            String content = (String) stringRedisTemplate.getValueSerializer().deserialize(bodyByte);
            String topic = (String) stringRedisTemplate.getStringSerializer().deserialize(channelByte);
            log.info(topic + "    " + content);
        }
    }

    Redis配置类

    package com.smartmap.sample.test.conf;
    
    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.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.RedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    @Configuration
    public class RedisConfiguration {
    
        @Bean("stringJsonRedisTemplate")
        public RedisTemplate<Object, Object> stringJsonRedisTemplate(RedisConnectionFactory redisConnectionFactory,
                ObjectMapper mapper) {
            RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
            template.setConnectionFactory(redisConnectionFactory);
            template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer(mapper));
            RedisSerializer<String> stringSerializer = new StringRedisSerializer();
            template.setKeySerializer(stringSerializer);
            template.setHashKeySerializer(stringSerializer);
            return template;
        }
    }

    JSON转换配置类

    package com.smartmap.sample.test.conf;
    
    import java.text.SimpleDateFormat;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    @Configuration
    public class JacksonConfiguration {
        @Bean
        public ObjectMapper getObjectMapper() {
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));        
            return objectMapper;
        }
    }

    实体类 User

    package com.smartmap.sample.test.entity;
    
    import java.util.Date;
    
    import com.fasterxml.jackson.annotation.JsonBackReference;
    
    
    public class User {
    
        private Long id;
        
        private String name;
        
        @JsonBackReference // 防止相互引用,出现无限引用递归    
        private Department department;
        
        private Date createTime;
    
        public User() {
        }
    
        public User(Long id, String name, Department department, Date createTime) {
            super();
            this.id = id;
            this.name = name;
            this.department = department;
            this.createTime = createTime;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Department getDepartment() {
            return department;
        }
    
        public void setDepartment(Department department) {
            this.department = department;
        }
    
        public Long getDepartmentId() {
            return this.department == null ? null : this.department.getId();
        }
    
        public void setDepartmentId(Long departmentId) {
            if (this.department != null) {
                this.department.setId(departmentId);
            }
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
    }

    实体类Department

    package com.smartmap.sample.test.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    import com.fasterxml.jackson.annotation.JsonManagedReference;
    
    
    public class Department {
        
        private Long id;
            
        private String name;
        
        @JsonManagedReference  // 防止相互引用,出现无限引用递归    
        private Set<User> users = new HashSet<User>();
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Set<User> getUsers() {
            return users;
        }
    
        public void setUsers(Set<User> users) {
            this.users = users;
        }    
    }

    DAO类

    package com.smartmap.sample.test.dao.impl;
    
    import java.io.UnsupportedEncodingException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.dao.DataAccessException;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.core.RedisCallback;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Repository;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.smartmap.sample.test.dao.UserDao;
    import com.smartmap.sample.test.entity.User;
    
    @Repository
    public class UserDaoImpl implements UserDao {
        final Log log = LogFactory.getLog(UserDaoImpl.class);
    
        @Autowired
        private ObjectMapper objectMapper;
    
        @Autowired
        @Qualifier("stringJsonRedisTemplate")
        private RedisTemplate<Object, Object> redisTemplate;
    
        public Long addRootUser(User user) {
            String key = "info:root:user";
            redisTemplate.opsForValue().set(key, user);
    
            Object obj = redisTemplate.opsForValue().get(key);
    // 因为返回来的是HashMap对象,需要将其转化为实体对象 User userResult
    = objectMapper.convertValue(obj, User.class); // User userResult = (User) redisTemplate.opsForValue().get(key); if (userResult != null) { return 1L; } return 0L; } public User getRootUser() { String key = "info:root:user"; Object obj = redisTemplate.opsForValue().get(key);
    // 因为返回来的是HashMap对象,需要将其转化为实体对象 User userResult
    = objectMapper.convertValue(obj, User.class); return userResult; } public Long addUser(User user) { String key = "info:users"; Long count = redisTemplate.opsForList().leftPush(key, user); return count; } public List<User> getUsers() { String key = "info:users"; List<Object> objectList = (List<Object>) (redisTemplate.opsForList().range(key, 0, -1));
    // 因为返回来的是HashMap对象,需要将其转化为实体对象 List
    <User> userList = new ArrayList<User>();
    // 此处用到了Java的Lambda表达式进行转化 objectList.forEach((k) -> { userList.add(objectMapper.convertValue(k, User.class)); });
    return userList; } public Long removeUser(Long userId) { String key = "info:users"; User user = (User) redisTemplate.opsForList().leftPop(key); return user != null ? 1L : 0L; }
    // 调用Redis原始的API来进行操作
    public String connectionSet(final String key, final String value) { Object obj = redisTemplate.execute(new RedisCallback<Object>() { public Object doInRedis(RedisConnection connection) throws DataAccessException { String message = "fail"; try { Boolean isSuccess = connection.set(key.getBytes("UTF-8"), value.getBytes("UTF-8")); if (isSuccess) { message = "success"; } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return message; } }); if (obj != null) { return "success"; } else { return "fail"; } } }

    Service类

    package com.smartmap.sample.test.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.smartmap.sample.test.dao.UserDao;
    import com.smartmap.sample.test.entity.User;
    import com.smartmap.sample.test.service.UserService;
    
    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
        @Autowired
        UserDao userDao;
    
        public Long addRootUser(User user) {        
            return userDao.addRootUser(user);
        }
        
        public User getRootUser() {        
            return userDao.getRootUser();
        }
        
        public Long addUser(User user) {        
            return userDao.addUser(user);
        }
    
        public List<User> getAllUsers() {            
            return userDao.getUsers();
        }
        
            
        public Long delete(Long userId) {        
            return userDao.removeUser(userId);        
        }
    
        public String generateSave(String key, String value) {
            return userDao.connectionSet(key, value);
        }
    }

    Controller类

    package com.smartmap.sample.test.controller.rest;
    
    import java.util.List;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.DeleteMapping;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.PutMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import com.smartmap.sample.test.entity.User;
    import com.smartmap.sample.test.service.UserService;
    
    @RestController
    @RequestMapping("/api/v1.1/system/user")
    public class UserRestController {
        private final Log logger = LogFactory.getLog(UserRestController.class);
    
        @Autowired
        UserService userService;
    
        /**
         * 查询所有用户
         *
         * curl -XGET 'http://127.0.0.1:8080/test/api/v1.1/system/user/'
         * 
         * @return
         */
        @GetMapping("/")
        public List<User> getAllUsers() {
            return userService.getAllUsers();
        }
    
        /**
         * 添加用户
         * 
         * curl -XPOST 'http://127.0.0.1:8080/test/api/v1.1/system/user/'
         * -H'Content-type:application/json;charset=UTF-8' -d ' { "name":"123",
         * "createTime":"2017-01-01 00:00:00", "departmentId":"9" }'
         * 
         * @param user
         * @return
         */
        @PostMapping("/")
        public Long addUse(@RequestBody User user) {
            System.out.println(user.getName());
            return userService.addUser(user);
        }
        
        /**
         * 添加用户
         * 
         * curl -XPOST 'http://127.0.0.1:8080/test/api/v1.1/system/user/root'
         * -H'Content-type:application/json;charset=UTF-8' -d ' { "name":"123",
         * "createTime":"2017-01-01 00:00:00", "departmentId":"9" }'
         * 
         * @param user
         * @return
         */
        @PostMapping("/root")
        public Long addRootUse(@RequestBody User user) {
            System.out.println(user.getName());
            return userService.addRootUser(user);
        }
        
        /**
         * 查询所有用户
         *
         * curl -XGET 'http://127.0.0.1:8080/test/api/v1.1/system/user/root'
         * 
         * @return
         */
        @GetMapping("/root")
        public User getRootUser() {
            return userService.getRootUser();
        }
        
    
        /**
         * 删除用户
         * 
         * curl -XDELETE 'http://127.0.0.1:8080/test/api/v1.1/system/user/123'
         * 
         * @param userId
         * @return
         */
        @DeleteMapping("/{userId}")
        public String deleteUser(@PathVariable("userId") Long userId) {
            Long count = userService.delete(userId);
            if (count > 0) {
                return "{success:true, message:'delete success'}";
            } else {
                return "{success:false, message:'delete fail'}";
            }
        }
    
        /**
         * 添加用户
         * 
         * curl -XPOST 'http://127.0.0.1:8080/test/api/v1.1/system/user/generate'
         * -H'application/x-www-form-urlencoded;charset=UTF-8' -d 'key=key1&value=value1'
         * 
         * @param user
         * @return
         */
        @PostMapping("/generate")
        public String generateSave(@RequestParam("key") String key, @RequestParam("value") String value) {
            String result = userService.generateSave(key, value);
            return result;
        }
            
    }

    完!

  • 相关阅读:
    2020-03-23
    2020-03-22
    2020-03-21
    2020-03-20
    2020-03-19
    2020-03-18
    2020-03-17
    单元测试-java
    2020-03-16
    C语言拯救计划Day3-1之求一批整数中出现最多的个位数字
  • 原文地址:https://www.cnblogs.com/gispathfinder/p/8966428.html
Copyright © 2011-2022 走看看