Spring Boot—18Redis

Posted ParamousGIS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
<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);
        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);
        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));
        List<User> userList = new ArrayList<User>();
        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;
    }

    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;
    }
        
}


完!













以上是关于Spring Boot—18Redis的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot引入Lombok

Spring Boot—15SpringJPA

Spring Boot—14JdbcTemplate

Spring Boot—19Cache

Spring Boot—21Actuator--监控

Spring Boot学习笔记——Spring Boot与Redis的集成