zoukankan      html  css  js  c++  java
  • SpringBoot整合Redis使用Restful风格实现CRUD功能

    第一步:导入依赖

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <fastjson>1.2.41</fastjson>
        <springboot>1.5.15.RELEASE</springboot>
      </properties>
    
      <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${springboot}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
                <version>${springboot}</version>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>${springboot}</version>
                <scope>test</scope>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>${springboot}</version>
            </dependency>
      
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson}</version>
            </dependency>
      
      </dependencies>

    第二步:看配置

    application.properties

    # Redis服务器地址
    # 单机版配置
    spring.redis.host = 127.0.0.1
    spring.redis.port = 6379
    # redis最大重连数
    redis.cluster.max-redirects=3
    # Redis服务器连接密码(默认为空)
    redis.password=
    # 最大空闲数  
    redis.maxIdle=5  
    # 连接池的最大数据库连接数。
    redis.maxTotal=5 
    # 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  
    redis.maxWaitMillis=1000  
    # 连接的最小空闲时间 默认1800000毫秒(30分钟)  
    redis.minEvictableIdleTimeMillis=300000  
    # 每次释放连接的最大数目,默认3  
    redis.numTestsPerEvictionRun=3 
    # 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1  
    redis.timeBetweenEvictionRunsMillis=30000  
    # 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个  
    redis.testOnBorrow=true  
    # 在空闲时检查有效性, 默认false  
    redis.testWhileIdle=true  

    第三步:代码的编写

    首先是编写Redis的配置类,对Redis这块进行配置。
    在使用SpringBoot整合Redis的时候,SpringBoot是可以根据配置自动完成Redis的相关配置,不过为了更灵活一点,我们这边还是手动加载一下配置,配置成自己想要的那种效果吧。
    1,配置一个Redis的连接池,使用redis.clients.jedis.JedisPoolConfig这个类来进行实现;
    2,再来配置一个Redis的工厂,加载Redis的连接池配置,这里我们也可以进行一下设置,如果Redis设置了密码,我们就加载改密码,否则就不进行加载。
    3,我们再来设置数据存入Redis的序列化的方式并开启事务。这里也顺便说下为什么要设置序列化器,如果不设置,那么在用实体类(未序列化)进行存储的时候,会提示错误: Failed to serialize object using DefaultSerializer; 当然,也可以不设置,不过存储的实体类必须进行序列化。
    4,我们再来实例化RedisTemplate的对象,加载上述的配置。在使用的时候,只需要使用如下的方式注入就可以使用了

    @Autowired

    RedisTemplate<String, Object> redisTemplate;

    a.Redis的配置类的代码如下:

    @Component
    public class RedisConfig {
    
        @Value("${redis.maxIdle}")
        private Integer maxIdle;
    
        @Value("${redis.maxTotal}")
        private Integer maxTotal;
    
        @Value("${redis.maxWaitMillis}")
        private Integer maxWaitMillis;
    
        @Value("${redis.minEvictableIdleTimeMillis}")
        private Integer minEvictableIdleTimeMillis;
    
        @Value("${redis.numTestsPerEvictionRun}")
        private Integer numTestsPerEvictionRun;
    
        @Value("${redis.timeBetweenEvictionRunsMillis}")
        private long timeBetweenEvictionRunsMillis;
    
        @Value("${redis.testOnBorrow}")
        private boolean testOnBorrow;
    
        @Value("${redis.testWhileIdle}")
        private boolean testWhileIdle;
    
        @Value("${redis.cluster.max-redirects}")
        private Integer mmaxRedirectsac;
    
        @Value("${redis.password}")
        private String redispwd;
    
        /**
         * JedisPoolConfig 连接池
         * 
         * @return
         */
        @Bean
        public JedisPoolConfig jedisPoolConfig() {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 最大空闲数
            jedisPoolConfig.setMaxIdle(maxIdle);
            // 连接池的最大数据库连接数
            jedisPoolConfig.setMaxTotal(maxTotal);
            // 最大建立连接等待时间
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
            jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
            jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
            // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
            jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
            jedisPoolConfig.setTestOnBorrow(testOnBorrow);
            // 在空闲时检查有效性, 默认false
            jedisPoolConfig.setTestWhileIdle(testWhileIdle);
            return jedisPoolConfig;
        }
    
    
    
        
        /**
         * 配置工厂
         */
        @Bean
        public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
            JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
            if (redispwd == null || redispwd.length() == 0) {
                JedisConnectionFactory.setPassword(redispwd);
            }
            return JedisConnectionFactory;
        }
    
        
    
        /**
         * 设置数据存入 redis 的序列化方式,并开启事务
         * 
         * @param redisTemplate
         * @param factory
         */
        private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
            /*
             * 设置 序列化器 .
             * 如果不设置,那么在用实体类(未序列化)进行存储的时候,会提示错误: Failed to serialize object using DefaultSerializer;
             */
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            // 开启事务
            redisTemplate.setEnableTransactionSupport(true);
            // 将连接工厂设置到模板类中
            redisTemplate.setConnectionFactory(factory);
        }
        
        /**
         * 实例化 RedisTemplate 对象
         * @return
         */
        @Bean
        public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
            return redisTemplate;
        }
        
    }

    b.实体类

    public class User implements Serializable{
        private static final long serialVersionUID = 1L;
        /** 编号 */
         private int id;
         /** 姓名 */
         private String name;
         /** 年龄 */
         private int age;
         
         public User(){
         }
    
        public int getId() {
            return id;
        }
        
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String toString() {
            return JSONObject.toJSONString(this);
        }
    }

    c.dao层

    @Repository
    public class UserDaoImpl implements UserDao {
    
        @Resource
        private RedisUtil redisUtil;
        
    
        @Override
        public void addUser(User user) {
            redisUtil.set(String.valueOf(user.getId()), user.toString());
        }
    
    
        @Override
        public void updateUser(User user) {
            redisUtil.set(String.valueOf(user.getId()), user.toString());
        }
    
    
        @Override
        public void deleteUser(int id) {
            redisUtil.del(String.valueOf(id));
        }
    
        
        @Override
        public User findByUserId(int id) {
            String data = redisUtil.get(String.valueOf(id)).toString();
            User user = JSON.parseObject(data, User.class);
            return  user;
        }
    }

    d、service层

    @Service
    public class UserServiceImpl implements UserService {   
    
        private  final Logger logger = LoggerFactory.getLogger(this.getClass());
        @Autowired
        private UserDao userDao;    
        
        @Override
        public boolean addUser(User user) {
            boolean flag=false;
            try{
                userDao.addUser(user);
                flag=true;
            }catch(Exception e){
                logger.error("新增失败!",e);
            }
            return flag;
        }
    
        @Override
        public boolean updateUser(User user) {
            boolean flag=false;
            try{
                userDao.updateUser(user);
                flag=true;
            }catch(Exception e){
                logger.error("修改失败!",e);
            }
            return flag;
        }
    
        @Override
        public boolean deleteUser(int id) {
            boolean flag=false;
            try{
                userDao.deleteUser(id);
                flag=true;
            }catch(Exception e){
                logger.error("删除失败!",e);
            }
            return flag;
        }
    
    
        @Override
        public User findByUserId(int id) {
            return userDao.findByUserId(id);
        }
    }

    e.Controller 控制层

    @RestController
    @RequestMapping(value = "/api")
    public class UserRestController {
        
        private  final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        
        @Autowired
        private UserService userService;
     
        @PostMapping("/user")
        public boolean addUser(@RequestBody User user) {
            logger.info("开始新增...");
            return userService.addUser(user);
        }
        
        @PutMapping("/user")
        public boolean updateUser(@RequestBody User user) {
            logger.info("开始更新...");
            return userService.updateUser(user);
        }
        
        @DeleteMapping("/user")
        public boolean delete(@RequestParam(value = "id", required = true) int userId) {
            logger.info("开始删除...");
            return userService.deleteUser(userId);
        }
        
    
        @GetMapping("/user")
        public User findByUserId(@RequestParam(value = "id", required = true) int userId) {
            logger.info("开始查询所有数据...");
            return userService.findByUserId(userId);
        }
    }

    f.App 入口

    @SpringBootApplication
    public class App 
    {
        public static void main( String[] args )
        {
            SpringApplication.run(App.class, args);
            System.out.println("程序正在运行...");
        }
    }

    原创作者:虚无境

    人这辈子没法做太多事情,所以每做一件事都要做到精彩绝伦。 因为,这就是我的宿命。人生苦短,你明白吗? 所以这是我为人生做出的选择
  • 相关阅读:
    Java学习:冒泡排序和选择排序
    Java学习:多态
    Java学习:抽象类与接口
    Java学习:继承
    Java学习:标准类
    Java学习:方法简介
    传参的本质
    new 关键字做的事
    一个引用类型的对象占多大堆空间
    栈中空间大小
  • 原文地址:https://www.cnblogs.com/junjun1578/p/10862372.html
Copyright © 2011-2022 走看看