0%

  • Elasticsearch简介
    • 一个分布式的,Restful风格的搜索引擎
    • 支持对各种类型的数据的检索
    • 搜索速度快,可以提供实时的搜索服务
    • 便于水平扩展,每秒可以处理PB级海量数据
  • Elasticsearch术语
    • 索引,类型,文档,字段(6.0前对应数据库中:数据库,表,行,列)
    • 集群,节点,分片,副本
    • 6.0后废弃类型,索引对应数据库中的表
    • 集群中每一台服务器称为节点
    • 一个索引可以拆分为多个分片存储,提高并发能力
    • 副本是对分片的备份,一个分片可以包含多个副本,提高可用性

Elasticsearch配置(elasticsearch.yml文件)

  • 集群名:cluster.name
  • 数据存放路径:path.data
  • 日志存放路径:path.logs

安装中文分词插件ik

https://github.com/medcl/elasticsearch-analysis-ik

使用

  • 启动elasticserach
  • 查看健康状况 curl -X GET “localhost:9200/_cat/health?v”
  • 查看节点 curl -X GET “localhost:9200/_cat/nodes?v”
  • 查看索引 curl -X GET “localhost:9200/_cat/indices?v”
  • 创建索引 curl -X PUT “localhost:9200/{索引名}”,返回json格式
  • 删除索引 curl -X DELETE “localhost:9200/{索引名}”
  • 插入数据PUT请求 localhost:9200/{索引名}/{类型}/{id},提交json格式数据
  • 查询数据GET请求
  • 删除数据DELETE请求
  • 搜索数据GET请求
    • 不加条件 localhost:9200/{索引名}/_search
    • 加条件 localhost:9200/{索引名}/_search?q=xxx:yyy
    • 会进行分词
  • 搜索条件复杂,通过json提交请求数据
1
2
3
4
5
6
7
8
{
"query":{
"multi_match":{
"query":"互联网", //搜什么
"fields":["title","content"] //从哪匹配
}
}
}

  • 通知列表
    • 显示评论、点赞、关注三种类型的通知
  • 通知详情
    • 分页显示某一类主题所包含的通知
  • 未读消息
    • 在页面头部显示所有的消息数量

  • 引入依赖

    • spring-kafka
  • 配置Kafka

    • 配置server,consumer
  • 访问Kafka

    • 生产者:kafkaTemplate.send(topic, data);
    • 消费者:

    ​ @KafkaListener(topics = {“test”})

    ​ public void handleMessage(ConsumerRecord record) {}

  • Kafka简介
    • Kafka是一个分布式的流媒体平台
    • 应用:消息系统,日志收集,用户行为追踪,流式处理
  • Kafka特点
    • 高吞吐量,消息持久化,高可用性,高扩展性
  • Kafka术语
    • Broker,Zookeeper
    • Topic,Partition,Offset
    • Leader Replica,Follower Replica
术语 解释
Broker Kafka的服务器,一个服务器称为一个Broker
Zookeeper 管理集群工具
Topic 主题,用来存放消息的位置
Partition 分区,对主题位置的分区
Offset 消息在分区内存放的索引序列
Replica 副本
Leader Replica 主副本,获取数据时处理请求
Follower Replica 从副本,只负责备份,不负责响应,主副本失效时会从中随机选择一个替代

Kafka官方网址

https://kafka.apache.org/

配置Kafka

  • 配置文件zookeeper.properties
    • dataDir:数据存放路径,默认为Linux系统路径
  • 配置文件server.properties
    • log.dirs:日志文件存放路径,默认为Linux系统路径

  • BlockingQueue
    • 解决线程通信的问题
    • 阻塞方法:put,take
  • 生产者消费者模式
    • 生产者:产生数据的线程
    • 消费者:使用数据的线程
  • 实现类
    • ArrayBlockingQueue
    • LinkedBlockingQueue
    • PriorityBlockingQueue,SynchronousQueue,DelayQueue等

  • 使用Redis存储验证码
    • 验证码需要频繁的访问与刷新,对性能要求较高
    • 验证码不需永久保存,通常在很短时间后失效
    • 分布式部署时,存在Session共享的问题
  • 使用Redis存储登陆凭证
    • 处理每次请求时,都要查询用户的登陆凭证,访问的频率非常高
  • 使用Redis缓存登录用户信息
    • 处理每次请求时,都要根据凭证查询用户信息,访问的频率非常高

  • 点赞
    • 支持对帖子、评论点赞
    • 第1次点赞,第2次取消点赞
  • 首页点赞数量
    • 统计帖子点赞数量
  • 详情页点赞数量
    • 统计点赞数量
    • 显示点赞状态

Service层

  • 点赞功能
    • 使用Redis在SpringBoot中的事务管理
    • 对某实体与用户的赞的增加与删除
  • 查询实体点赞数量
  • 查询某人对某实体的点赞状态
  • 查询某个用户获得的赞数量

Controller层

  • HomeController中帖子列表增加点赞数显示
  • DiscussPostController中帖子与评论的点赞数显示
  • LikeController,使用AJAX异步,实现点赞数的动态修改

我收到的赞

  • 个人信息页面显示
  • 到redis查询用户收到的赞的数量

  • 引入依赖
    • spring-boot-starter-data-redis
  • 配置Redis
    • 配置数据库参数
    • 编写配置类,构造RedisTemplate
  • 访问Redis

配置redisTemplate

  • 为什么要配置
    • 默认是键值对,重新设置序列化方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);

//设置key的序列化方式
template.setKeySerializer(RedisSerializer.string());
//设置普通value序列化方式
template.setValueSerializer(RedisSerializer.json());
//设置hash的key的序列化方式
template.setHashKeySerializer(RedisSerializer.string());
//设置hash的value的序列化方式
template.setHashValueSerializer(RedisSerializer.json());

template.afterPropertiesSet();
return template;
}

访问Redis

  • 访问不同key
    • redisTemplate.opsForValue()
    • redisTemplate.opsForHash()
    • redisTemplate.opsForList()
    • redisTemplate.opsForSet()
    • redisTemplate.opsForZSet()
  • 处理key
    • 删除:redisTemplate.delete()
    • 查询是否存在:redisTemplate.hasKey()
    • 设置有效时间:redisTemplate.expire(key, time, 时间单位(TimeUnit.SECONDS))
  • 多次访问同一个key,绑定key
    • BoundValueOperations operations = redisTemplate.boundValueOps(redisKey)

Redis事务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//编程式事务
@Test
public void testTransactional() {
Object obj = redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
String redisKey = "test:tx";

operations.multi(); //开启事务

operations.opsForSet().add(redisKey, "zhangsan");
operations.opsForSet().add(redisKey, "lisi");
operations.opsForSet().add(redisKey, "wangwu");

System.out.println(operations.opsForSet().members(redisKey));
return operations.exec(); //提交事务
}
});
System.out.println(obj);
}

AOP的实现

  • AspectJ
    • 语言级的实现,扩展了Java语言,定义了AOP语法
    • 在编译期织入代码,它有一个专门的编译器,用来生成遵守Java字节码规范的class文件
  • Spring AOP
    • Spring AOP使用Java实现,不需要专门的编译过程,也不需要特殊的类加载器
    • Spring AOP在运行时通过代理的方式织入代码,只支持方法类型的连接点
    • 支持对AspectJ的集成

Spring AOP

  • JDK动态代理
    • Java提供的动态代理技术,可以在运行时创建接口的代理实例
    • Spring AOP默认采用此种方式,在接口的代理实例中织入代码
  • CGLib动态代理
    • 采用底层的字节码技术,在运行时创建子类代理实例
    • 当目标对象不存在接口时,Spring AOP会采用此种方式,在子类中织入代码