project-redis用于缓存,但我现在还没想好怎么搞,想搞成热key的,还要慢慢研究,目前只是接收kafka消息后直接存到redis中
1、项目结构
2、pom.xml
<parent>
<artifactId>spring-cloud-project</artifactId>
<groupId>com.meng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>project-redis</artifactId>
<properties>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
</properties>
<dependencies>
<!--没有这个依赖,就不会往consul中注册该项目-->
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>-->
<!-- redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
<!--kafka-->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>compile</scope>
</dependency>
<!--consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
<exclusions>
<exclusion>
<artifactId>jackson-databind</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
这个consul-config我暂时还不清楚什么用,但如果引入这个jar,application.yml文件名就要改名(bootstrap.yml),否则就找不到对应的配置内容
-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
</dependencies>
3、application.yml
# Database base configuration
spring:
application:
name: project-redis
redis:
host: 192.168.233.137
cloud:
consul:
host: 192.168.233.137
port: 8500
discovery:
instance-id: ${spring.application.name}:${server.port} #这个id作为唯一识别的id必填
service-name: consul-redis
#开启ip地址注册
prefer-ip-address: true
#实例的请求ip
ip-address: ${spring.cloud.client.ip-address}
heartbeat:
enabled: true #不打开心跳机制,控制台会显示红叉
kafka:
bootstrap-servers: 192.168.233.137:9092
consumer:
group-id: redisGroup # 指定默认消费者group id --> 由于在kafka中,同一组中的consumer不会读取到同一个消息,依靠groud.id设置组名
auto-offset-reset: earliest # smallest和largest才有效,如果smallest重新0开始读取,如果是largest从logfile的offset读取。一般情况下我们都是设置smallest
enable-auto-commit: true # enable.auto.commit:true --> 设置自动提交offset
auto-commit-interval: 100 #如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer # 指定消息key和消息体的编解码方式
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer # 指定消息key和消息体的编解码方式
server:
port: 84
4、启动类RedisApplication
@SpringBootApplication
@EnableDiscoveryClient
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class , args);
}
}
5、RedisKafkaConsumer
@Configuration
@Slf4j
public class RedisKafkaConsumer {
@Autowired
private StringRedisTemplate redisTemplate;
@KafkaListener(topics = {"resultMsgTopic"})
public void listen(ConsumerRecord<String, String> record){
Optional<String> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
String itemStr = kafkaMessage.get();
log.info("--redis-接收到kafka消息-----msg:{}" , itemStr);
if(!StringUtils.isEmpty(itemStr)){
try {
BaiDuResult baiDuResult = JSONObject.parseObject(itemStr, BaiDuResult.class);
//保存到redis
redisTemplate.opsForHash().put("baiDuResult", baiDuResult.getId().toString(), itemStr);
}catch (Exception e){
log.error("保存到redis数据异常:" , e.getMessage());
}
}
}
}
}
以上,project-redis缓存项目