首页

关于spring redis缓存的@Cacheable注解和Cache代码两种代码示例

标签:redis缓存,cache     发布时间:2022-09-21   

一、前言

基于org.springframework.cache.CacheManager和org.springframework.cache.annotation.Cacheable代码和注解方式实现redis缓存使用,详情如下代码说明(完整代码示例下载)

二、代码说明

getUserBy方法 - 注解代码方式 、getUserById缓存cacheManager.getCache(CACHE_NAME).get(userId)代码方式

package com.meizhi.service;@b@@b@import cn.hutool.core.util.RandomUtil;@b@import com.meizhi.config.CacheManagerConfig;@b@import com.meizhi.mapper.UserMapper;@b@import com.meizhi.model.User;@b@import lombok.extern.slf4j.Slf4j;@b@import org.springframework.beans.factory.annotation.Autowired;@b@import org.springframework.cache.Cache;@b@import org.springframework.cache.CacheManager;@b@import org.springframework.cache.annotation.CacheConfig;@b@import org.springframework.cache.annotation.CacheEvict;@b@import org.springframework.cache.annotation.CachePut;@b@import org.springframework.cache.annotation.Cacheable;@b@import org.springframework.data.redis.core.RedisTemplate;@b@import org.springframework.stereotype.Service;@b@@b@@Service@b@@CacheConfig(cacheNames = "user")@b@@Slf4j@b@public class UserService {@b@@b@    @Autowired@b@    private UserMapper userMapper;@b@@b@    @Autowired@b@    private CacheManager cacheManager;@b@@b@    @Autowired@b@    private RedisTemplate<String, Object> redisTemplate;@b@@b@    // 简单来说这个 CACHE_NAME 的作用就是指当前的缓存操作的 key 的前缀都是 "user::"@b@    private static final String CACHE_NAME = CacheManagerConfig.USER_CACHE_NAME;@b@@b@@b@    @Cacheable(value = "getUserBy", key = "#user.userId", unless = "#result == null")@b@    public User getUserBy(User user) {@b@        log.info("getUserBy={}",user);@b@        try {@b@            // 真的去数据库中查询数据,查完以后存入缓存@b@            User userQuery = userMapper.selectById(user.getUserId());@b@            return userQuery;@b@        } catch (Exception e) {@b@            e.printStackTrace();@b@            return null;@b@        }@b@    }@b@@b@@b@    /**@b@     * 根据 id 查询用户详情的接口@b@     * 使用布隆过滤器防止缓存穿透@b@     * 使用加锁、限流解决缓存雪崩@b@     */@b@    public User getUserById(Integer userId) {@b@        // 从缓存中读取@b@        Cache.ValueWrapper valueWrapper = cacheManager.getCache(CACHE_NAME).get(userId);@b@        if (valueWrapper != null) {@b@            System.err.println("从缓存中得到数据");@b@            return (User) valueWrapper.get();@b@        }@b@@b@        try {@b@            // 真的去数据库中查询数据,查完以后存入缓存@b@            User user = userMapper.selectById(userId);@b@            if (user != null) {@b@                cacheManager.getCache(CACHE_NAME).put(userId, user);@b@            }@b@            return user;@b@        } catch (Exception e) {@b@            e.printStackTrace();@b@            return null;@b@        }@b@    }@b@@b@@b@    /**@b@     * 添加接口@b@     * 由于是使用 userId 作为 key ,但是 id 又是添加后才得到的,所以不能直接使用 @cachePut 注解@b@@b@     */@b@    public User userAdd() {@b@        User user = new User();@b@        user.setUsername("许强" + RandomUtil.randomInt(100));@b@        userMapper.insert(user);@b@@b@        redisTemplate.opsForValue().set("user::" + user.getUserId(), user);@b@@b@        return user;@b@    }@b@@b@@b@    /**@b@     * 更新接口@b@     * @CachePut 应用到写数据的方法上,如新增/修改方法,调用方法时会自动把该方法返回值放入缓存@b@     */@b@    @CachePut(key = "#user.userId")@b@    public User userUpdate(User user){@b@        userMapper.updateById(user);@b@        return  user;@b@    }@b@@b@@b@@b@    /**@b@     * 删除用户@b@     * 删除的时候同时需要删除 redis 里的缓存数据@b@     * CacheEvict 注解的存在会使调用这个接口的时候删除 redis 里 key 为 user::userId 的数据@b@     * 由于配置了 @CacheConfig(cacheNames = "user") 所以 @CacheEvict(value = "user", key = "#userId") 不需要写 value 了@b@     */@b@    @CacheEvict(key = "#userId")@b@    public boolean userDelete(Integer userId) {@b@        int i = userMapper.deleteById(userId);@b@        return i == 1;@b@    }@b@@b@@b@@b@@b@}
<<推荐下载>>
  • (1) 阿里巴巴Java开发手册8种不同版本
  • (2) Web前端开发视频教程
  • (3) 30+明星讲师PPT课件分享一线大厂架构实战经验
  • (4) java开发_架构篇_视频资源分享_v2208
  • (5) java开发_高级篇_视频资源分享_v2208
  • (6) java开发_进阶篇(中级)_视频资源分享_v2208
  • (7) java开发_入门篇_视频资源分享_v2208
  • (8) 微信小程序开发视频1+167源码+实战demo等下载
  • (9) easy-shopping电子商务java源码(附脚本和安装文档说明)下载
  • (10) java常用的72份知名实用的电子书下载
  • (11) java开发性能优化资料整理大全(8份电子文档+3份实战优化)下载
  • (12) 9个常用的算法设计资料和100以上视频课件内容下载
  • (13) vue开发必备常用手册16件下载
  • (14) 21种不同技术集群方案(es、flink、redis、nginx、zk、lvs、kafka、mysql、k8s等)参考资料下载
  • (15) 20种技术代码规范(js/java/dba/阿里/华为/oracle/mysql等)参考资料下载
  • (16) 微服务五套资料(0-1,架构设计,springcloud,nacos等)下载
  • (17) 架构师(28知识图谱+3套简历模板+6套架构实战文档等)完整资料整理下载
  • (18) 大数据18套实战基础知识+8套简历模板下载
  • (19) 并发编程全套(7套+阿里巴巴+亿级实战等)实战资料下载
  • (20) Kafka九套学习整理知识点全套(面试+笔记+代码api+命令+容备等)资料下载
  • (21) java全套9个不同方向类型的面试题(基础+核心+大厂+架构师+近万套题库等)下载
  • (22) JAVA开发常用API帮助文档大全(超52种以上技术资料,高手必备)下载
  • (23) springcloud超详细139件全套学习实战资料( 视频课件+源码demo+文档资料等)下载
  • 更多推荐>>
  • <<热门文章>>