es分爲站內搜索和瀏覽器搜索,一般是logstash,但是要是實時的更新就要用到了mq發消息進行更新。
倒排索引,一個詞條對應一個文檔。
es是被優化的。
es可以實時但是solr是不能實時的,任意阻塞。
其實用的最多的還是這兩個:
redis是緩存數據庫。
mongodb是非關係數據庫最像數據庫的。
接口安全:cookie和session能對應上。
logstash:吃資源的。
----------------------------------------------------01-----------------------------------------------
內容介紹無用。
----------------------------------------------------02-----------------------------------------------
使用場景:異步處理 應用解耦 流量削峯 消息通信
----------------------------------------------------------------------------03-------------------------------------------------------------------------------------
--------------------------------------------------------------------------------04----------------------------------------------------------------------------------
win的安裝。直接忽略。
--------------------------------------------------------------------------------05----------------------------------------------------------------------------------
docker安裝部署rabbitmq。
docker run -di --name=tensquare_rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management
訪問:http://192.168.244.136:15672/ 用戶密碼:guest
--------------------------------------------------------------------------------06----------------------------------------------------------------------------------
Driect模式:
第一步:創建隊列:
第二步:創建模塊
第三步:導包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
第四步:配置yml
server:
port: 8099
spring:
rabbitmq:
host: 192.168.244.136
第五步:寫啓動類
第六步:寫測試的生產者。
測試類
消息的生產者:
@Test
public void sendMsg(){
rabbitTemplate.convertAndSend("itcast","test直接模式");
}
消息的消費者:
@SpringBootApplication
@EnableRabbit
public class RabbitmqApplication {
public static void main(String[] args) {
SpringApplication.run(RabbitmqApplication.class,args);
}
}
消費一次都消費完畢,不管是插入了幾條。監聽直接消費。
我插入了三條數據消費者一次就消費完畢了,厲害了。目前我只有一個消費者。
---
三個人等着拿消息, 本身有負載均衡的。輪流拿。
實驗1的做法:直連模式三個都是。
實驗2的做法,消息隊列加入多個消息。
和實驗1是一樣的。
--------------------------------------------------------------------------------07----------------------------------------------------------------------------------
Fanout模式:
分裂模式:消息發給交換器,交換器綁定我的rountingKey。
第一步:搭架子,多個隊列。
往交換器發消息,就往三個綁定的隊列裏面發送,業務場景就是一個消息發送短信,郵件,微信。
第二步:測試
/**
* 分裂模式,使用交換機
*/
@Test
public void sendMsg2(){
rabbitTemplate.convertAndSend("chuanzhi","","分裂模式消息");
}
監控就是監控隊列。主題是分列模式的加強版。
--------------------------------------------------------------------------------08----------------------------------------------------------------------------------
主題模式:匹配規則.就是直接和分列的結合。
/**
* 主題模式
*/
@Test
public void sendMsg3(){
rabbitTemplate.convertAndSend("topic84","good.abc","主題模式消息2");
}
測試:第一步:
第二步:
/**
* 主題模式
*/
@Test
public void sendMsg3(){
rabbitTemplate.convertAndSend("topic84","good.abc","主題模式消息2");
}
術語解釋:
交換機的類型。
隊列的key。
--------------------------------------------------------------------------------09----------10------------------------------------------------------------------------
普通用戶和後臺用戶的區別:
--------------------------------------------------------------------------------11------------------------------------------------------------------------
新建模塊:
--------------------------------------------------------------------------------12------------------------------------------------------------------------
redist用於驗證。
mq用於發送消息。
註冊的手機驗證碼:
第一步:
/**
* 發送短信驗證碼
* @return
*/
@PostMapping("/sendsms/{mobile}")
public Result sendSms(@PathVariable String mobile){
userService.sendSms(mobile);
return new Result(true,StatusCode.OK,"發送成功");
}
第二步:
導入long3的包。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
public void sendSms(String mobile) {
//生成六位隨機數字
String code = RandomStringUtils.randomNumeric(6);
//向緩存中放一份
redisTemplate.opsForValue().set("tensquare_checkCode_"+mobile,code,6, TimeUnit.MINUTES);
Map<String,String>map=new HashMap<>();
map.put("mobile",mobile);
map.put("checkcode",code);
//給用戶發一份
rabbitTemplate.convertAndSend("sms",map);
//在控制檯顯示一份
System.out.println("驗證碼爲"+code);
}
第三步:加redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第四步:導入mq的包
第五步:測試:
localhost:9007/user/sendsms/15854132997
--------------------------------------------------------------------------------13------------------------------------------------------------------------
註冊:
第一步:
/**
* 驗證碼
* @param mobile
*/
public void sendSms(String mobile) {
//生成六位隨機數字驗證碼
String code = RandomStringUtils.randomNumeric(6);
//向緩存中放一份 判斷填的對不對的 指定刪除時間6小時
redisTemplate.opsForValue().set("tensquare_checkCode_"+mobile,code,6, TimeUnit.HOURS);
Map<String,String>map=new HashMap<>();
map.put("mobile",mobile);
map.put("checkcode",code);
//給用戶發一份 不需要等 直接的模式發送的 消息隊列裏面的數據直接發送給了運營商。
rabbitTemplate.convertAndSend("sms",map);
//在控制檯顯示一份
System.out.println("驗證碼爲"+code);
}
第二步:
完善基本信息
/**
* 增加
* @param user
*/
public void add(User user) {
user.setId( idWorker.nextId()+"" );
//密碼加密
user.setPassword(user.getPassword());
user.setFollowcount(0);//關注數
user.setFanscount(0);//粉絲數
user.setOnline(0L);//在線時長//
user.setRegdate(new Date());//註冊日期
user.setUpdatedate(new Date());//更新日期
user.setLastdate(new Date());//最後登陸日期
userDao.save(user);
}
--------------------------------------------------------------------------------14------------------------------------------------------------------------
消費者環境的搭建:
第一步:新建模塊。導包。
只發短信。
第二步:yml
server:
port: 9008
spring:
application:
name: tensquare-sms
rabbitmq:
host: 192.168.244.136
第三步:
步驟i的詳解:驗證碼發送的消息隊列,馬上就消費掉髮送給運營商。
@Component
@RabbitListener(queues = "sms")
public class SmsListener {
// @Autowired
// private SmsUtil smsUtil;
// @Value("${aliyun.sms.template_code}")
// private String template_code;
//
// @Value("${aliyun.sms.sign_name}")
private String sign_name;
@RabbitHandler
public void executeSms(Map<String,String> map){
String mobile=map.get("mobile");
String checkcode=map.get("checkcode");
System.out.println("手機號"+map.get("mobile"));
System.out.println("驗證碼"+map.get("checkcode"));
// try {
// smsUtil.sendSms(mobile,template_code,sign_name,"{\"code\":\""+checkcode+"\"}");
// } catch (ClientException e) {
// e.printStackTrace();
// }
}
}
--------------------------------------------------------------------------------15------------------------------------------------------------------------
短信服務:
第一步:充值,獲得用戶的AccessKey
第二步:下載代碼(舊版),導入阿里雲的包。
第四步:寫代碼。改yml。
第五步:寫監聽器。
流程:輸入電話號點擊確定,發送驗證碼,一個存redis,一個存消息隊列,消息消費者馬上監聽消費,調用阿里短信,給這個手機號發送短信,註冊,短信的code和redis的code比對即可。
@PostMapping("/register/{code}")
public Result register(@PathVariable String code,@RequestBody User user){
//得到緩存中的驗證碼
String checkcodeRedis=(String)redisTemplate.opsForValue().get("tensquare_checkCode_"+user.getMobile());
if(StringUtils.isEmpty(checkcodeRedis)){
return new Result(false,StatusCode.ERROR,"請先獲取手機驗證碼");
}
if(!checkcodeRedis.equals(code)){
return new Result(false,StatusCode.ERROR,"請輸入正確的驗證碼");
}
userService.add(user);
return new Result(true,StatusCode.OK,"註冊成功");
}
註冊的完整代碼。
--------------------------------------------------------------------------------16-------17-----------------------------------------------------------------