当前位置:   article > 正文

分布式ID选型对比(3)

分布式ID选型对比(3)

redis自增

一, 引入依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. <version>2.6.5</version>
  5. </dependency>

二, 配置信息:

  1. spring:
  2. redis:
  3. # 地址
  4. host: localhost
  5. # 端口号
  6. port: 6379
  7. # 密码
  8. password:
  9. # 超时时间,单位毫秒
  10. timeout: 3000
  11. # 数据库编号
  12. database: 0

JedisConfig:

  1. package org.com.spi.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.data.redis.connection.RedisConnectionFactory;
  8. import org.springframework.data.redis.core.RedisTemplate;
  9. import org.springframework.data.redis.core.StringRedisTemplate;
  10. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  11. @Configuration
  12. public class JedisConfig {
  13. @Bean
  14. public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
  15. StringRedisTemplate template = new StringRedisTemplate(factory);
  16. //定义key序列化方式
  17. //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
  18. //定义value的序列化方式
  19. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  20. ObjectMapper om = new ObjectMapper();
  21. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  22. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  23. jackson2JsonRedisSerializer.setObjectMapper(om);
  24. // template.setKeySerializer(redisSerializer);
  25. template.setValueSerializer(jackson2JsonRedisSerializer);
  26. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  27. template.afterPropertiesSet();
  28. return template;
  29. }
  30. }

三, redis配置类RedisUtils:

  1. package org.com.spi.utils;
  2. import org.springframework.data.redis.core.RedisTemplate;
  3. import org.springframework.stereotype.Component;
  4. import javax.annotation.Resource;
  5. @Component
  6. public class RedisUtils {
  7. @Resource
  8. private RedisTemplate<String, Object> redisTemplate; //这里使用的是redisTemplate
  9. /**
  10. * redis 自增
  11. * @param key 键
  12. // * @param by 要增加几(大于0)
  13. * @return
  14. */
  15. public long incr(String key, long delta){
  16. if(delta<0){
  17. throw new RuntimeException("递增因子必须大于0");
  18. }
  19. return redisTemplate.opsForValue().increment(key, delta);
  20. }
  21. }

4, 编写接口controller:

  1. @Autowired
  2. RedisUtils redisUtils;
  3. /**
  4. * 根据数据库ID自增生成主键
  5. * 缺点在于数据库不能集群,只能单机搞,不适合ID作为业务传递的场景
  6. */
  7. @PostMapping("/redisInc")
  8. public Long redisInc(){
  9. return redisUtils.incr("generate2",1);
  10. }

特点: redis自增仅适合单业务场景,对于多模块、复杂业务场景不太适用;另外,redis的两种持久化机制都有一定的弊端: RDB方式-宕机存在丢失的风险, AOF方式-宕机能恢复数据,但数据恢复时间较长,在并发量大的时候可能导致ID重复的情况.

------------------------------------------------------------------------------------------------

雪花算法

主要类: IdWorker

  1. package org.com.spi.config;
  2. import org.springframework.stereotype.Component;
  3. import java.lang.management.
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/202687
推荐阅读
相关标签
  

闽ICP备14008679号