• SpringBoot学习笔记6_整合Redis


    三十四  SpringBoot整合Redis(结合 SpringBoot整合Mybatis)

    34.0 该案例是实现单机版Redis整合

     34.1 相关依赖

     1           <dependency>
     2           <groupId>org.springframework.boot</groupId>
     3           <artifactId>spring-boot-starter-web</artifactId>  
     4        </dependency>
     5   
     6            <!-- mybatis(注解方式) -->
     7        <dependency>
     8                <groupId>org.mybatis.spring.boot</groupId>
     9                <artifactId>mybatis-spring-boot-starter</artifactId>
    10                <version>1.3.1</version>
    11        </dependency>
    12        
    13        <!-- Mysql -->
    14        <dependency>
    15                <groupId>mysql</groupId>
    16                <artifactId>mysql-connector-java</artifactId>
    17        </dependency>
    18        
    19        <!-- redis依赖 -->
    20        <dependency>  
    21             <groupId>org.springframework.boot</groupId>  
    22             <artifactId>spring-boot-starter-data-redis</artifactId>  
    23        </dependency>
    相关依赖

    34.2  mysql和redis的配置

     1 #数据库配置
     2 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
     3 spring.datasource.username=root
     4 spring.datasource.password=
     5 spring.datasource.url=jdbc:mysql://localhost:3306/springboot
     6 
     7 #redis单服务器配置
     8 spring.redis.database=0
     9 spring.redis.host=127.0.0.1
    10 spring.redis.port=6379
    11 spring.redis.pool.max-active=8
    12 spring.reids.pool.max-wait=-1
    13 spring.redis.pool.max-idle=8
    14 spring.redis.pool.min-idle=0
    15 spring.redis.timeout=0
    16     
    application.properties

    34.3 开启缓存

    在启动类上添加@EnableCaching 注解 

     1 package com.wu.app;
     2 
     3 import org.mybatis.spring.annotation.MapperScan;
     4 import org.springframework.boot.SpringApplication;
     5 import org.springframework.boot.autoconfigure.SpringBootApplication;
     6 import org.springframework.cache.annotation.EnableCaching;
     7 
     8 
     9 @SpringBootApplication(scanBasePackages={"com.wu.controller","com.wu.service"})
    10 @MapperScan("com.wu.mapper")//需要单独扫描
    11 @EnableCaching//开启缓存
    12 public class SpringApplications {
    13         //程序启动入口
    14         public static void main(String []args){
    15             SpringApplication.run(SpringApplications.class, args);
    16         }
    17 }
    启动类

    在需要缓存的service层方法中添加@Cacheable 注解

     1 package com.wu.service;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.cache.annotation.Cacheable;
     5 import org.springframework.stereotype.Service;
     6 
     7 import com.wu.mapper.UsersMapper;
     8 import com.wu.pojo.Users;
     9 @Service
    10 public class UsersServiceImp implements UsersService {
    11     @Autowired
    12     private UsersMapper mapper;
    13     
    14     @Cacheable(value="user")//设置键值
    15     @Override
    16     public Users selectByName(String name) {
    17         System.out.println("从数据库中查找");
    18         return mapper.selectByName(name);
    19     }
    20     
    21     
    22 }
    UsersServiceImp.java

    实体类需要实现序列化接口 implements Serializable

     1 public class Users implements Serializable{
     2     private Integer id;
     3 
     4     private String name;
     5 
     6     private String password;
     7 
     8     private String email;
     9 
    10     private Date birthday;
    11 
    12     public Integer getId() {
    13         return id;
    14     }
    15 
    16     public void setId(Integer id) {
    17         this.id = id;
    18     }
    19 
    20     public String getName() {
    21         return name;
    22     }
    23 
    24     public void setName(String name) {
    25         this.name = name == null ? null : name.trim();
    26     }
    27 
    28     public String getPassword() {
    29         return password;
    30     }
    31 
    32     public void setPassword(String password) {
    33         this.password = password == null ? null : password.trim();
    34     }
    35 
    36     public String getEmail() {
    37         return email;
    38     }
    39 
    40     public void setEmail(String email) {
    41         this.email = email == null ? null : email.trim();
    42     }
    43 
    44     public Date getBirthday() {
    45         return birthday;
    46     }
    47 
    48     public void setBirthday(Date birthday) {
    49         this.birthday = birthday;
    50     }
    实体类

     34.4 结果

    这样第一次查询时即从数据库查询,再次查询即从缓存中加载 

    三十五 SpringBoot整合Redis集群

    35.0 搭建redis集群     参考文档

    35.1 相关依赖(跟单机版一样)

    35.2 相关配置

    1 #数据库配置
    2 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    3 spring.datasource.username=root
    4 spring.datasource.password=
    5 spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    6 
    7 #redis cluster配置
    8 spring.redis.cluster.nodes=192.168.198.129:7001,192.168.198.129:7002,192.168.198.129:7003,192.168.198.129:7004,192.168.198.129:7005,192.168.198.129:7006
    9     
    application.properties

    35.3 编写Redis集群的配置类

     1 package com.wu.configure;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 import org.springframework.beans.factory.annotation.Value;
     6 import org.springframework.context.annotation.Bean;
     7 import org.springframework.context.annotation.Configuration;
     8 import redis.clients.jedis.HostAndPort;
     9 import redis.clients.jedis.JedisCluster;
    10 
    11 @Configuration
    12 public class RedisClusterConfigrue {
    13     @Value("${spring.redis.cluster.nodes}")
    14     private String nodes;
    15 
    16     @Bean
    17     public JedisCluster jedisCluster(){
    18         //分割
    19         String[] nodesArray = nodes.split(",");
    20         Set<HostAndPort> hostAndPorts=new HashSet<>();
    21         for (String node : nodesArray) {
    22                 //分割
    23                 String[] array = node.split(":");
    24                 HostAndPort hostAndPort=new HostAndPort(array[0],Integer.parseInt(array[1]));
    25                 hostAndPorts.add(hostAndPort);
    26             }
    27         JedisCluster jedisCluster=new JedisCluster(hostAndPorts);
    28         return jedisCluster;
    29         
    30     }
    31 }
    RedisClusterConfigrue

    35.4 简单测试

    在service层的实现类中引入 

    1 @Autowired
    2 private JedisCluster JedisCluster;

    添加如下方法

    1 @Override
    2     public String getRedisValue() {
    3         JedisCluster.set("key","value");
    4         return JedisCluster.get("key");
    5     }

    在controller层中调用该方法

    1 @RequestMapping("/redis")
    2     public String getRedisValue(){
    3         return service.getRedisValue();
    4     }

     三十六 使用RedisTemplate操作redis

    参考: 

    36.1 相关依赖

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

    36.2 相关配置

    spring:
      datasource:
        username: root
        password: '123456'
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost/test
        type: com.alibaba.druid.pool.DruidDataSource
      redis:
        port: 6379
        jedis:
          pool:
            max-active: 50
            min-idle: 20
        host: 127.0.0.1
        database: 11
    application.yml
    @Configuration
    public class RedisConfig {
        @Bean
        public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
            RedisTemplate redisTemplate=new RedisTemplate();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            //Key的序列化
            StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();
            redisTemplate.setKeySerializer(stringRedisSerializer);
            //value的序列化
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
    
            ObjectMapper objectMapper =  new ObjectMapper();
            
            //定制 DateTime类型的序列化和反序列化
            SimpleModule simpleModule = new SimpleModule();
            simpleModule.addSerializer(DateTime.class,new JodaDateTimeJsonSerializer());
            simpleModule.addDeserializer(DateTime.class,new JodaDateTimeJsonDeserializer());
            
            //设置类信息
            objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            
            //绑定simpleModule
            objectMapper.registerModule(simpleModule);
    
            //绑定objectMapper
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            return redisTemplate;
        }
    }
    RedisConfig.java

    如果需要序列化的实体类中使用了 joda 的 DateTime 类型的属性,(需要引入相关依赖

        <dependency>
          <groupId>joda-time</groupId>
          <artifactId>joda-time</artifactId>
          <version>2.9.1</version>
        </dependency>

    ),对该类型的序列化话可以额外配置,如下:

    public class JodaDateTimeJsonSerializer extends JsonSerializer<DateTime> {
        @Override
        public void serialize(DateTime dateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString(dateTime.toString("yyyy-MM-dd HH:mm:ss"));
        }
    }
    JodaDateTimeJsonSerializer.java
    public class JodaDateTimeJsonDeserializer extends JsonDeserializer<DateTime> {
        @Override
        public DateTime deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            String dateString =jsonParser.readValueAs(String.class);
            DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    
            return DateTime.parse(dateString,formatter);
        }
    }
    JodaDateTimeJsonDeserializer.java

    然后引入到RedisConfig配置中

      36.2.1 拓展  

     RestTemplate 三种常用的序列化规则:具体参考 这里 

    序列化规则 说明
    JdkSerializationRedisSerializer 默认序列化规则,要求对象必须实现 Serialable 接口
    StringRedisSerializer 对象只能为 String
    GenericJackson2JsonRedisSerializer Java 与 JSON 的序列化与反序列化,好处是不需要对象实现 Serialable 接口,
    但需要引入 jackson-databind 包

    36.3 使用

      36.3.1 引入

    @Autowired
    private RedisTemplate redisTemplate;

      36.3.2 RedisTemplate Api总结

    作者:wuba
    出处:http://www.cnblogs.com/wuba/
    版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明出处!
  • 相关阅读:
    Python multiprocessing相关疑问
    Tornado demo3
    WebSockets
    Tornado Demo1---webspider分析
    Python assert断言
    Python学习之--数据基础
    Python学习之--python概要
    Python学习之--函数/生成器/装饰器
    Python学习之文件操作
    Python操作MySQL数据库
  • 原文地址:https://www.cnblogs.com/wuba/p/11256111.html
Copyright © 2020-2023  润新知