Spring Boot 整合 Spring Cache + Redis

1.安装redis

  a.由于官方是没有Windows版的,所以我们需要下载微软开发的redis,网址:https://github.com/MicrosoftArchive/redis/releases

  b.解压后,在redis根目录打开cmd界面,输入:redis-server.exe redis.windows.conf,启动redis(关闭cmd窗口即停止)

2.使用

  a.创建SpringBoot工程,选择maven依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        .....

    </dependencies>

  b.配置 application.yml 配置文件

server:
  port: 8080
spring:
  # redis相关配置
  redis:
    database: 0
    host: localhost
    port: 6379
    password:
    jedis:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
        # 连接池中的最大空闲连接
        max-idle: 5
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接超时时间(毫秒)默认是2000ms
    timeout: 2000ms
  # thymeleaf热更新
  thymeleaf:
    cache: false

  c.创建RedisConfig配置类

@Configuration
@EnableCaching  //开启缓存
public class RedisConfig {

    /**
     * 缓存管理器
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        // 设置缓存的默认过期时间,也是使用Duration设置
        config = config.entryTtl(Duration.ofMinutes(30))
                // 设置 key为string序列化
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                // 设置value为json序列化
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()))
                // 不缓存空值
                .disableCachingNullValues();

        // 对每个缓存空间应用不同的配置
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("userCache", config.entryTtl(Duration.ofSeconds(60)));

        // 使用自定义的缓存配置初始化一个cacheManager
        RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
                //默认配置
                .cacheDefaults(config)
                // 特殊配置(一定要先调用该方法设置初始化的缓存名,再初始化相关的配置)
                .initialCacheNames(configMap.keySet())
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }

    /**
     * Redis模板类redisTemplate
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        // key采用String的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer());
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer());
        return template;
    }

    /**
     * json序列化
     * @return
     */
    private RedisSerializer<Object> jackson2JsonRedisSerializer() {
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        //json转对象类,不设置默认的会将json转成hashmap
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        return serializer;
    }

}

  d.创建entity实体类

public class User implements Serializable {

    private int id;
    private String userName;
    private String userPwd;

    public User(){}

    public User(int id, String userName, String userPwd) {
        this.id = id;
        this.userName = userName;
        this.userPwd = userPwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }

}

  e.创建Service

@Service
public class UserService {

    //查询:先查缓存是是否有,有则直接取缓存中数据,没有则运行方法中的代码并缓存
    @Cacheable(value = "userCache", key = "‘user:‘ + #userId")
    public User getUser(int userId) {
        System.out.println("执行此方法,说明没有缓存");
        return new User(userId, "用户名(get)_" + userId, "密码_" + userId);
    }

    //添加:运行方法中的代码并缓存
    @CachePut(value = "userCache", key = "‘user:‘ + #user.id")
    public User addUser(User user){
        int userId = user.getId();
        System.out.println("添加缓存");
        return new User(userId, "用户名(add)_" + userId, "密码_" + userId);
    }

    //删除:删除缓存
    @CacheEvict(value = "userCache", key = "‘user:‘ + #userId")
    public boolean deleteUser(int userId){
        System.out.println("删除缓存");
        return true;
    }

    @Cacheable(value = "common", key = "‘common:user:‘ + #userId")
    public User getCommonUser(int userId) {
        System.out.println("执行此方法,说明没有缓存(测试公共配置是否生效)");
        return new User(userId, "用户名(common)_" + userId, "密码_" + userId);
    }

}

  f.创建Controller

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @RequestMapping("/getUser")
    public User getUser(int userId) {
        return userService.getUser(userId);
    }

    @RequestMapping("/addUser")
    public User addUser(User user){
        return userService.addUser(user);
    }

    @RequestMapping("/deleteUser")
    public boolean deleteUser(int userId){
        return userService.deleteUser(userId);
    }

    @RequestMapping("/getCommonUser")
    public User getCommonUser(int userId) {
        return userService.getCommonUser(userId);
    }

}
@Controller
public class HomeController {
    //默认页面
    @RequestMapping("/")
    public String login() {
        return "test";
    }

}

  g.在 templates 目录下,写书 test.html 页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style type="text/css">
        .row{
            margin:10px 0px;
        }
        .col{
            display: inline-block;
            margin:0px 5px;
        }
    </style>
</head>
<body>
<div>
    <h1>测试</h1>
    <div class="row">
        <label>用户ID:</label><input id="userid-input" type="text" name="userid"/>
    </div>
    <div class="row">
        <div class="col">
            <button id="getuser-btn">获取用户</button>
        </div>
        <div class="col">
            <button id="adduser-btn">添加用户</button>
        </div>
        <div class="col">
            <button id="deleteuser-btn">删除用户</button>
        </div>
        <div class="col">
            <button id="getcommonuser-btn">获取用户(common)</button>
        </div>
    </div>
    <div class="row" id="result-div"></div>
</div>
</body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
    $(function() {
        $("#getuser-btn").on("click",function(){
            var userId = $("#userid-input").val();
            $.ajax({
                url: "/user/getUser",
                data: {
                    userId: userId
                },
                dataType: "json",
                success: function(data){
                    $("#result-div").text("id[" + data.id + ", userName[" + data.userName + "], userPwd[" + data.userPwd + "]");
                },
                error: function(e){
                    $("#result-div").text("系统错误!");
                },
            })
        });
        $("#adduser-btn").on("click",function(){
            var userId = $("#userid-input").val();
            $.ajax({
                url: "/user/addUser",
                data: {
                    id: userId
                },
                dataType: "json",
                success: function(data){
                    $("#result-div").text("id[" + data.id + ", userName[" + data.userName + "], userPwd[" + data.userPwd + "]");
                },
                error: function(e){
                    $("#result-div").text("系统错误!");
                },
            })
        });
        $("#deleteuser-btn").on("click",function(){
            var userId = $("#userid-input").val();
            $.ajax({
                url: "/user/deleteUser",
                data: {
                    userId: userId
                },
                dataType: "json",
                success: function(data){
                    $("#result-div").text(data);
                },
                error: function(e){
                    $("#result-div").text("系统错误!");
                },
            })
        });
        $("#getcommonuser-btn").on("click",function(){
            var userId = $("#userid-input").val();
            $.ajax({
                url: "/user/getCommonUser",
                data: {
                    userId: userId
                },
                dataType: "json",
                success: function(data){
                    $("#result-div").text("id[" + data.id + ", userName[" + data.userName + "], userPwd[" + data.userPwd + "]");
                },
                error: function(e){
                    $("#result-div").text("系统错误!");
                },
            })
        });
    });
</script>
</html>

原文地址:https://www.cnblogs.com/vettel0329/p/12015779.html

时间: 2024-10-14 00:54:09

Spring Boot 整合 Spring Cache + Redis的相关文章

Spring Boot 整合Spring Data JPA

Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> &l

spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

最近上班太忙所以耽搁了给大家分享实战springboot 框架的使用. 下面是spring boot 整合多个框架的使用. 首先是准备工作要做好. 第一  导入框架所需的包,我们用的事maven 进行对包的管理. 以上的举例是本人的H5DS的真实的后台管理项目,这个项目正在盛情融资中,各位多多捧点人场.关注一下软件发展的动态,说不定以后就是您的生活不可或缺的软件哟. 点击打开链接.闲话少说.现在切入正题. 第二,写点配置文件 第三,spring data -设计一个简单的po关系,这里需要下载一

Spring Boot整合Spring Security

Spring Boot对于该家族的框架支持良好,但是当中本人作为小白配置还是有一点点的小问题,这里分享一下.这个项目是使用之前发布的Spring Boot会员管理系统重新改装,将之前filter登录验证改为Spring Security 1. 配置依赖 Spring Boot框架整合Spring Security只需要添加相应的依赖即可,其后都是配置Spring Security. 这里使用Maven开发,依赖如下: <dependency> <groupId>org.spring

Spring Boot整合Spring MVC、Spring、Spring Data JPA(Hibernate)

一句话总结:Spring Boot不是新的功能框架,而是为了简化如SSH.SSM等等多个框架的搭建.整合及配置.使用Spring Boot 10分钟搭建起Spring MVC.Spring.Spring Data JPA(Hibernate)基础后台架构.基本零配置,全注解. 步骤一: 使用Spring Boot提供的网站生成maven项目及基础依赖.打开https://start.spring.io/网站,右侧输入想要的特性依赖.输入Web提供整合Spring MVC,输入JPA提供整合Spr

Spring Boot整合Spring Security总结

一.创建Spring Boot项目 引入Thymeleaf和Web模块以及Spring Security模块方便进行测试,先在pom文件中将 spring-boot-starter-security 的依赖注解掉测试. 二.创建几个用于测试的页面 <!DOCTYPE html><!--index页面--> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head&g

Spring Boot 整合 Spring Security

1.建库 a.创建 用户表.角色表.关系表 CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `sys_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar

spring boot 整合spring security中spring security版本升级的遇到的坑

在spring security3.x的版本中 hasAnyRole这个方法不会对我们需要认证的身份前面加个前缀ROLE_,在3.x版本hasRole的源码如下 public final boolean hasAnyRole(String... roles) { Set<String> roleSet = getAuthoritySet(); for (String role : roles) { if (roleSet.contains(role)) { return true; } } r

Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的介绍请阅读Apache Kafka简介与安装(一),关于Kafka安装请阅读Apache Kafka安装,关于Kafka集群环境搭建请阅读Apache Kafka集群环境搭建 .这里关于服务器环境搭建不在赘述. Spring Kafka整合Spring Boot创建生产者客户端案例 创建一个kafk

Spring Boot --- 认识Spring Boot

在前面我们已经学习过Srping MVC框架,我们需要配置web.xml.spring mvc配置文件,tomcat,是不是感觉配置较为繁琐.那我们今天不妨来试试使用Spring Boot,Spring Boot让我们的Spring应用变的更轻量化.比如:你可以仅仅依靠一个Java类来运行一个Spring引用.你也可以打包你的应用为jar并通过使用java -jar来运行你的Spring Web应用. 一 Spring Boot简介 1.Spring Boot特点 开箱即用,提供各种默认配置来简