• SpringBoot整合redis做缓存案例


    前言

    工作项目中使用SpringBoot框架结合Redis非关系型数据库做缓存功能,以提升数据查询效率。本文以此来记录开发过程。

    一、开发步骤

    1.引入Redis依赖

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    根据SpringBoot自动版本仲裁机制,我们不需要指明redis的版本号。

    2.编写redis配置信息

    spring:
      application:
        name: service-user
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springcloud-alibaba-shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
        username: root
        password: root
      redis:
        host: 192.168.220.131
        port: 6379
        password:
        database: 0
        ssl: false
        timeout: 50000d
        status: true
    logging:
      config: classpath:logback-spring.xml
    server:
      port: 8070
      servlet:
        context-path: /user
    redis:
      status: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3.Controller 层代码

    @Slf4j
    @RestController
    @RequestMapping("/user")
    public class UserController extends BaseController {
    
        @Autowired
        private UserService userService;
    
        @GetMapping("/getUserByUserId")
        public Message.DataRespone<User> getUserByUserId(Integer userId) {
            User user = userService.getUserByUserId(userId);
            if (!ObjectUtils.isEmpty(user)) {
                return Message.Success.createWithData(user);
            }
            return Message.Result_IsNull.createWithData(null);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.Service 层代码

    public interface UserService extends IService<User> {
        User getUserByUserId(int userId);
    }
    
    • 1
    • 2
    • 3

    5.ServiceImpl 层代码

    @Service
    public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
        @Autowired
        private UserDao userDao;
        @Resource
        private RedisUtil redisUtil;
        @Value("${redis.status}")
        private boolean redisStatus;
    
        private static final String REDIS_KEY_PREFIX = "USER_";
    
        @Override
        public User getUserByUserId(int userId) {
            User user = null;
            if (redisStatus) {
                user = (User) redisUtil.get(REDIS_KEY_PREFIX + "USER_ID_" + userId);
                if (!ObjectUtils.isEmpty(user)) {
                    return user;
                }
            }
            if (ObjectUtils.isEmpty(user)) {
                user = userDao.selectById(userId);
                redisUtil.del(REDIS_KEY_PREFIX + "USER_ID_" + userId);
                if (!ObjectUtils.isEmpty(user)) {
                    redisUtil.set(REDIS_KEY_PREFIX + "USER_ID_" + userId, user, 60 * 2);
                }
            }
            return user;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    6.RedisUtil Redis工具类

    @Component
    public class RedisUtil {
    
    
        private RedisTemplate<String, Object> redisTemplate;
    
        //指定用redis的序列化方式进行序列化
        @Resource
        public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
            RedisSerializer stringSerializer = new StringRedisSerializer();//序列化为String
            //不能反序列化
            //Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);//序列化为Json
            GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
            redisTemplate.setKeySerializer(stringSerializer);
            redisTemplate.setValueSerializer(serializer);
            redisTemplate.setHashKeySerializer(stringSerializer);
            redisTemplate.setHashValueSerializer(serializer);
            this.redisTemplate = redisTemplate;
        }
    
        /**
         * 普通缓存获取
         *
         * @param key 键
         * @return 值
         */
        public Object get(String key) {
            return key == null ? null : redisTemplate.opsForValue().get(key);
        }
    
        /**
         * 普通缓存放入
         *
         * @param key   键
         * @param value 值
         * @return true成功 false失败
         */
        public boolean set(String key, Object value) {
            try {
                redisTemplate.opsForValue().set(key, value);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
        /**
         * 删除缓存
         *
         * @param key 可以传一个值 或多个
         */
        @SuppressWarnings("unchecked")
        public void del(String... key) {
            if (key != null && key.length > 0) {
                if (key.length == 1) {
                    redisTemplate.delete(key[0]);
                } else {
                    redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(key));
                }
            }
        }
        
        /**
         * 获取list缓存的内容
         * @param key 键
         * @param start 开始
         * @param end 结束 0 到 -1代表所有值
         * @return
         */
        public List<Object> lGet(String key, long start, long end) {
            try {
                return redisTemplate.opsForList().range(key, start, end);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
        
        /**
         * 将list放入缓存
         * @param key 键
         * @param value 值
         * @param time 时间(秒)
         * @return
         */
        public boolean lSet(String key, List<Object> value, long time) {
            try {
                redisTemplate.opsForList().rightPushAll(key, value);
                if (time > 0)
                    expire(key, time);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98

    7.发送请求,测试结果

    在这里插入图片描述

    在这里插入图片描述

    8.查询出所有用户信息

    public List<User> getAllUser() {
        List<User> result = new ArrayList<>();
        if (redisStatus) {
            List<Object> list = redisUtil.lGet(REDIS_KEY_PREFIX + "ALL_USER", 0, -1);
            if (!CollectionUtils.isEmpty(list)) {
                result = DataSwitchUtil.objToList(list, User.class);
            }
        }
        if (CollectionUtils.isEmpty(result)) {
            result = userDao.getAllUser();
            redisUtil.del(REDIS_KEY_PREFIX + "ALL_USER");
            redisUtil.lSet(REDIS_KEY_PREFIX + "ALL_USER", JSONArray.parseArray(JSON.toJSONString(result)), 60 * 2);
        }
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    9.发送请求,测试结果

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    vulnhub DC: 4
    全面了解v-if和v-show的区别
    个人玩航拍,如何申请无人机空域?
    【day09】继承、super、this、抽象类
    美国连锁超市FamilyDollar(家多乐)验厂须知
    基于SSM+Vue的药品商超销售进销存网站设计与实现
    基于中间件的密码泛在化保障技术研究
    ctfshow 命令执行(40-50)
    kubernetes镜像下载页,离线安装k8s的资源
    【Python网络爬虫】详解python爬虫中URL资源抓取
  • 原文地址:https://blog.csdn.net/m0_49692893/article/details/127632422