springboot整合redis的去中心化集群模式

springboot整合redis的去中心化集群模式

1)引入依赖

 <dependencies>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.21</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
		<dependency>
			  <groupId>org.projectlombok</groupId>
           	 <artifactId>lombok</artifactId>
            <optional>true</optional>
		</dependency>
    </dependencies>

2)编写配置类

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

3)编写实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "readers")
public class Reader {
    @TableId(type = IdType.AUTO)
    private Integer readerId;
    private String name;
    private String sex;
    private String dept;
    private String status;
    private String address;
}

4)编写dao层

public interface ReaderMapper extends BaseMapper<Reader> {
}

5)编写service层

service层接口;
public interface ReaderService {
    /**
     * 根据readerid查询相对应的reader信息
     * @param readerId
     * @return
     */
    Reader getReaderByReaderId(Integer readerId);

    /**
     * 根据readerId删除相对应的reader信息
     * @param readerId
     * @return
     */
    int deleteReaderByReaderId(Integer readerId);

    /**
     * 根据reader修改相对应的reader信息
     * @param reader
     * @return
     */
    int updateReaderByReaderId(Reader reader);


}

service层实现类:

非注解模式

@Service
public class ReaderServiceImpl implements ReaderService {
    @Autowired
    private ReaderMapper readerMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public Reader getReaderByReaderId(Integer readerId) {
        Object o = redisTemplate.opsForValue().get("getReaderByReaderId::" + readerId);
        if (o!=null){
            return (Reader) o;
        }
        Reader reader = readerMapper.selectById(readerId);
        redisTemplate.opsForValue().set("getReaderByReaderId::"+readerId,reader);
        return reader;
    }

    @Override
    public int deleteReaderByReaderId(Integer readerId) {
        redisTemplate.delete("getReaderByReaderId::"+readerId);
        int i = readerMapper.deleteById(readerId);
        return i;
    }

    @Override
    public int updateReaderByReaderId(Reader reader) {
        redisTemplate.delete("getReaderByReaderId::"+reader.getReaderId());
        int i = readerMapper.updateById(reader);
        redisTemplate.opsForValue().set("getReaderByReaderId::"+reader.getReaderId(),reader);
        return i;
    }
}

注解模式
@Service
public class ReaderServiceImpl implements ReaderService {
    @Autowired
    private ReaderMapper readerMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
      //该注解的作用是:会先去redis缓存中查询是否存在所需要的数据,
    // 如果存在,则不执行代码块,直接返回缓存中的数据,
    // 如果redis缓存中不存在所需数据,则执行该方法,并将查询的数据放入redis缓存中。
    //缓存中的key默认以 getReaderByReaderId::readerid拼接起来
    @Cacheable(cacheNames = "getReaderByReaderId" ,key = "#readerid")
    public Reader getReaderByReaderId(Integer readerId) {
        Reader reader = readerMapper.selectById(readerId);
        return reader;
    }

    @Override
    //beforeInvocation:默认为false,是否在方法执行前就清空,
    // 如果指定为 true,则在方法还没有执行的时候就清空缓存。如果为false且方法执行抛出异常,则不会清空缓存。
     @CacheEvict(cacheNames = "getReaderByReaderId",key = "#readerid")
    public int deleteReaderByReaderId(Integer readerId) {
        redisTemplate.delete("getReaderByReaderId::"+readerId);
        int i = readerMapper.deleteById(readerId);
        return i;
    }

    @Override
      //这个注解是必须执行方法体,而且会把方法体执行的结果放入到缓存中。 如果发生异常则不操作缓存。
    @CachePut(cacheNames = "getReaderByReaderId",key = "#reader.id")
    public int updateReaderByReaderId(Reader reader) {
        int i = readerMapper.updateById(reader);
        return i;
    }
}

6)编写controller层

@RestController
public class ReaderController {
    @Autowired
    private ReaderService readerService;
    @GetMapping("getReaderByReaderId/{readerId}")
    public Reader getReader(@PathVariable("readerId")Integer readerId){
        Reader reader = readerService.getReaderByReaderId(readerId);
        return reader;
    }
    @GetMapping("deleteReaderByReaderId/{readerId}")
    public int deleteReader(@PathVariable("readerId")Integer readerId){
        int i = readerService.deleteReaderByReaderId(readerId);
        return i;
    }
    @GetMapping("updateReaderByReaderId")
    public int updateReader(Reader reader){
        int i = readerService.updateReaderByReaderId(reader);
        return i;
    }
}

在启动类上添加注解

@SpringBootApplication
@MapperScan(basePackages = "com.lipeng.fbms.dao")
@EnableCaching //开启缓存注解
public class FbmsLipengApplication {

    public static void main(String[] args) {
        SpringApplication.run(FbmsLipengApplication.class, args);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值