zoukankan      html  css  js  c++  java
  • SpringBoot整合Redis

    在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。

    pom.xml文件(可以根据自己的需要来添加或修改)

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- mybatis 与 spring boot 2.x的整合包 -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
    
            <!--mysql JDBC驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.39</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
        </dependencies>
    

      下面是springboot的配置文件application.yml,配置redis

    server.port=8888
    
    
    spring.datasource.url=jdbc:mysql://localhost:3306/blog?serverTimezone=Asia/Chongqing&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
    
    spring.datasource.username=root
    
    spring.datasource.password=123456
    
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    logging.level.com.example.demo.dao.UserMapper=debug
    
    mybatis-plus.mapper-locations=classpath*:mapper/*.xml
    
    mybatis-plus.type-aliases-package=com.god.blog.entity
    
    
    ## 定位模板的目录
    #spring.thymeleaf.prefix=classpath:/templates/
    ## 给返回的页面添加后缀名
    #spring.thymeleaf.suffix=.html
    #spring.thymeleaf.content-type=text/html
    #spring.thymeleaf.mode=HTML5
    
    
    
    
    
    ## Redis 配置
    redis:
    ## Redis数据库索引(默认为0)
    database: 0
    ## Redis服务器地址
    host: 127.0.0.1
    ## Redis服务器连接端口
    port: 6379
    ## Redis服务器连接密码(默认为空)
    password:123456
    jedis:
    pool:
    ## 连接池最大连接数(使用负值表示没有限制)
    #spring.redis.pool.max-active=8
    max-active: 8
    ## 连接池最大阻塞等待时间(使用负值表示没有限制)
    #spring.redis.pool.max-wait=-1
    max-wait: -1
    ## 连接池中的最大空闲连接
    #spring.redis.pool.max-idle=8
    max-idle: 8
    ## 连接池中的最小空闲连接
    #spring.redis.pool.min-idle=0
    min-idle: 0
    ## 连接超时时间(毫秒)
    timeout: 1200
    
    #将themilef的默认缓存禁用,热加载生效
    thymeleaf:
    cache: false
    
    #mybatis的下划线转驼峰配置
    configuration:
    map-underscore-to-camel-case: true
    
    #另外一种打印语句的方式
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    #打印sql时的语句
    logging:
    level:
    com:
    acong:
    dao: debug
    file: d:/logs/bsbdj.log

    package com.god.blog.controller;
    
    import com.god.blog.entity.User;
    import com.god.blog.service.UserService;
    import io.swagger.annotations.Api;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Api
    @RestController
    @RequestMapping("/user")
    public class UserController {
        @Autowired
        private UserService userService;
        
        @GetMapping("/queryAll")
        public List<User> queryAll(){
            List<User> lists = userService.queryAll();
            return lists;
        }
    
        @GetMapping("/findUserById")
        public Map<String, Object> findUserById(@RequestParam int id){
            User user = userService.findUserById(id);
            Map<String, Object> result = new HashMap<>();
            result.put("uid", user.getUid());
            result.put("uname", user.getUserName());
            result.put("pass", user.getPassWord());
            result.put("salary", user.getSalary());
            return result;
        }
    
        @PostMapping("/updateUser")
        public String updateUser(){
            User user = new User();
            user.setUid(1);
            user.setUserName("cat");
            user.setPassWord("miaomiao");
            user.setSalary(4000);
    
            int result = userService.updateUser(user);
    
            if(result != 0){
                return "update user success";
            }
    
            return "fail";
        }
    
        @DeleteMapping("/deleteUserById")
        public String deleteUserById(@RequestParam int id){
            int result = userService.deleteUserById(id);
            if(result != 0){
                return "delete success";
            }
            return "delete fail";
        }
    }
    package com.god.blog.service;
    
    import com.god.blog.entity.User;
    import com.god.blog.mapper.UserMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    @Service
    public class UserService {
        @Autowired
        private UserMapper userDao;
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        public List<User> queryAll() {
            return userDao.queryAll();
        }
    
        /**
         * 获取用户策略:先从缓存中获取用户,没有则取数据表中 数据,再将数据写入缓存
         */
        public User findUserById(int id) {
            String key = "user_" + id;
    
            ValueOperations<String, User> operations = redisTemplate.opsForValue();
    
            //判断redis中是否有键为key的缓存
            boolean hasKey = redisTemplate.hasKey(key);
    
            if (hasKey) {
                User user = operations.get(key);
                System.out.println("从缓存中获得数据:"+user.getUserName());
                System.out.println("------------------------------------");
                return user;
            } else {
                User user = userDao.findUserById(id);
                System.out.println("查询数据库获得数据:"+user.getUserName());
                System.out.println("------------------------------------");
    
                // 写入缓存
                operations.set(key, user, 5, TimeUnit.HOURS);
                return user;
            }
        }
    
        /**
         * 更新用户策略:先更新数据表,成功之后,删除原来的缓存,再更新缓存
         */
        public int updateUser(User user) {
            ValueOperations<String, User> operations = redisTemplate.opsForValue();
            int result = userDao.updateUser(user);
            if (result != 0) {
                String key = "user_" + user.getUid();
                boolean haskey = redisTemplate.hasKey(key);
                if (haskey) {
                    redisTemplate.delete(key);
                    System.out.println("删除缓存中的key-----------> " + key);
                }
                // 再将更新后的数据加入缓存
                User userNew = userDao.findUserById(user.getUid());
                if (userNew != null) {
                    operations.set(key, userNew, 3, TimeUnit.HOURS);
                }
            }
            return result;
        }
    
        /**
         * 删除用户策略:删除数据表中数据,然后删除缓存
         */
        public int deleteUserById(int id) {
            int result = userDao.deleteUserById(id);
            String key = "user_" + id;
            if (result != 0) {
                boolean hasKey = redisTemplate.hasKey(key);
                if (hasKey) {
                    redisTemplate.delete(key);
                    System.out.println("删除了缓存中的key:" + key);
                }
            }
            return result;
        }
    }
    package com.god.blog.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.god.blog.entity.User;
    import io.lettuce.core.dynamic.annotation.Param;
    import org.apache.ibatis.annotations.Delete;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    import org.apache.ibatis.annotations.Update;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    @Repository
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
        @Select("select * from user")
        List<User> queryAll();
    
        @Select("select * from user where uid = #{id}")
        User findUserById(int id);
    
        @Update("UPDATE USER SET username = CASE WHEN (#{userName} != NULL) AND (#{userName} != '') THEN #{userName},PASSWORD = CASE WHEN (#{passWord} != NULL) AND (#{passWord} != '') THEN #{passWord},salary = CASE WHEN (#{salary} != 0) THEN #{salary} WHERE uid = #{uid}")
        int updateUser(@Param("user") User user);
    
        @Delete("delete from user where uid = #{id}")
        int deleteUserById(int id);
    }
    package com.god.blog.config;
    
    
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import lombok.AllArgsConstructor;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.annotation.CachingConfigurerSupport;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.cache.RedisCacheConfiguration;
    import org.springframework.data.redis.cache.RedisCacheManager;
    import org.springframework.data.redis.cache.RedisCacheWriter;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.*;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import java.time.Duration;
    
    @AllArgsConstructor
    @Configuration
    @EnableCaching//开启注解
    public class RedisConfig extends CachingConfigurerSupport {
    
    
    
    //    @Bean
    //    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
    //        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
    //        redisTemplate.setConnectionFactory(factory);
    //        return redisTemplate;
    //    }
    //
    //    // 管理缓存
    //    @Bean
    //    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
    //                .entryTtl( Duration.ofHours(1)); // 设置缓存有效期一小时
    //        return RedisCacheManager
    //                .builder( RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
    //                .cacheDefaults(redisCacheConfiguration).build();
    //    }
    
    
        /**
         * 选择redis作为默认缓存工具
         * @param redisConnectionFactory
         * @return
         */
        /*@Bean
        //springboot 1.xx
        public CacheManager cacheManager(RedisTemplate redisTemplate) {
            RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
            return rcm;
        }*/
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
            RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                    .entryTtl(Duration.ofHours(1)); // 设置缓存有效期一小时
            return RedisCacheManager
                    .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
                    .cacheDefaults(redisCacheConfiguration).build();
        }
    
        /**
         * retemplate相关配置
         * @param factory
         * @return
         */
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            // 配置连接工厂
            template.setConnectionFactory(factory);
    
            //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
            Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
    
            ObjectMapper om = new ObjectMapper();
            // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jacksonSeial.setObjectMapper(om);
    
            // 值采用json序列化
            template.setValueSerializer(jacksonSeial);
            //使用StringRedisSerializer来序列化和反序列化redis的key值
            template.setKeySerializer(new StringRedisSerializer());
    
            // 设置hash key 和value序列化模式
            template.setHashKeySerializer(new StringRedisSerializer());
            template.setHashValueSerializer(jacksonSeial);
            template.afterPropertiesSet();
    
            return template;
        }
    
        /**
         * 对hash类型的数据操作
         *
         * @param redisTemplate
         * @return
         */
        @Bean
        public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForHash();
        }
    
        /**
         * 对redis字符串类型数据操作
         *
         * @param redisTemplate
         * @return
         */
        @Bean
        public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForValue();
        }
    
        /**
         * 对链表类型的数据操作
         *
         * @param redisTemplate
         * @return
         */
        @Bean
        public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForList();
        }
    
        /**
         * 对无序集合类型的数据操作
         *
         * @param redisTemplate
         * @return
         */
        @Bean
        public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForSet();
        }
    
        /**
         * 对有序集合类型的数据操作
         *
         * @param redisTemplate
         * @return
         */
        @Bean
        public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
            return redisTemplate.opsForZSet();
        }
    
    }

    执行spring boot的启动类,访问http://localhost:8888/findUserById?id=1

  • 相关阅读:
    java-数组
    编程练习
    java-循环语句
    java-条件语句if&switch
    JAVA-运算符
    JAVA-常量
    springAOP源码分析之篇一:配置文件的解析
    spring IOC容器的扩展
    spring IOC之篇六 bean的加载---bean的创建
    spring IOC之篇五 bean的加载--缓存中获取
  • 原文地址:https://www.cnblogs.com/juquanyu-com/p/12925307.html
Copyright © 2011-2022 走看看