业务场景
在互联网电商系统中通常有着千亿级别的商品数据,万亿级别的订单数据;而传统的单库单表是无法支撑这种级别的数据的,通常会采用分库分表。
但是一旦进行分库分表,数据库表中原先设计的自增 ID 就会失去意义,所以在分布式系统中通常需要一个全局唯一 ID 来标识每一条数据。
全局唯一 ID 生成的技术方案有很多,业界比较有名的有
UUID
Redis
Snowflake
Leaf
实战演练
这里我们使用 Redis INCR 命令来实现分布式系统全局唯一 ID
核心 Maven Dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
复制
核心 application.properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0
spring.redis.password=
spring.redis.timeout=2000
spring.redis.lettuce.pool.max-active=50
spring.redis.lettuce.pool.max-wait=2000
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.min-idle=10
复制
RedisConfiguration.java
package org.fool.springboot.config;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@Configuration
@EnableCaching
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public CacheManager cacheManager(LettuceConnectionFactory connectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30L))
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory))
.cacheDefaults(redisCacheConfiguration)
.build();
}
}
复制
IdGeneratorService.java
package org.fool.springboot.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class IdGeneratorService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final String CACHE_MERCHANDISE_ID_KEY = "MERCHANDISE::ID";
public Long genId() {
return stringRedisTemplate.opsForValue().increment(CACHE_MERCHANDISE_ID_KEY);
}
}
复制
MerchandiseRequest.java
package org.fool.springboot.contract.request;
import lombok.Data;
@Data
public class MerchandiseRequest {
private Long id;
private String name;
private Double price;
private String desc;
}
复制
MerchandiseController.java
Test
多次执行以下 curl 命令
curl --location --request POST 'http://localhost:8080/merchandise/create' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Car",
"price": 300000.00,
"detail": "Lexus"
}'
复制
泰克风格 只讲干货 不弄玄虚
文章转载自TechStyle,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
国产非关系型数据库 Eloqkv 初体验
JiekeXu
156次阅读
2025-04-10 23:51:35
融合Redis缓存的PostgreSQL高可用架构
梧桐
109次阅读
2025-04-08 06:35:40
Redis概要
听溪
49次阅读
2025-04-11 10:23:10
安装与配置Redis
鲁鲁
42次阅读
2025-04-11 10:26:10
Redis改协议内幕曝光!核心开发者亲述被“踢出局”,外部贡献者几乎全跑光了!
老鱼笔记
40次阅读
2025-04-17 10:41:56
Redis数据库——Cluster集群模式
编程Cookbook
40次阅读
2025-04-16 15:34:44
使用Jedis访问Redis数据库
怀念和想念
38次阅读
2025-04-11 15:08:30
Redis geo 实战:“附近的人”实现,打造社交的新维度
老王两点中
35次阅读
2025-04-11 09:02:30
Redis
鲁鲁
30次阅读
2025-04-07 20:14:35
Redis提供的持久化机制
luyingjun
28次阅读
2025-04-11 15:11:05