- protobuf:优点轻量快速,需要编译成二进制,安全。缺点可读性差
- channel和goroutine
package main
import (
"fmt"
)
func run(a []int, c chan int) {
first := 0
for _, i := range a {
first += i
}
c <- first
}
func main() {
a := []int{3, 5, 6, 2, 9, 10}
c := make(chan int)
go run(a[:4], c)
x := <-c
fmt.Println(x)
}
- 指针的讲解 http://m.biancheng.net/view/21.html?from=timeline
- 单例模式特点:每个对象的内存地址都一样
https://segmentfault.com/a/1190000020293616#articleHeader3 代理
https://studygolang.com/articles/7884 go语言斐波那契数列三种写法
https://www.cnblogs.com/ExMan/p/11490719.html go语言导包的几种方法
说到Golang的Redis库,用到最多的恐怕是
redigo 和 go-redis。其中 redigo 不支持对集群的访问。
node.js 接口文档神器 https://www.cnblogs.com/ExMan/p/11475710.html
https://www.cnblogs.com/ExMan/p/11431412.html 集群限流 缓存
-
如果仅仅对于一个博客而已一个Nginx 足够了,后面可以带多个Tomcat 做负载均衡进群
-
Nginx 应用层面做限流,后端单个服务可以做接口限流
-
后端服务用户 Session 可以集中存储到 Redsi 中
-
布隆过滤拦截防止缓存穿透
-
热点数据读取 Redis 缓存
-
如有必要 Redis 、MySql 可以做主从集群
https://www.cnblogs.com/ExMan/p/11431391.html gin中文文档
- Elasticsearch 是一个分布式,可扩展,开源的全文搜索与数据分析引擎。可以存储,搜索,分析PB级别的近实时数据,使用Lucene作为核心来实现所有的索引和搜索功能,通过简单的restful api隐藏Lucene的复杂性,让全文搜索变的简单
- 结构化搜索:日期,时间,数字,可以进行比较
- 全文搜索:对一篇文章进行索引,根据关键字进行搜索,类似于mysql中的like
- 聚合:通过聚合得到全文数据的概览
优点:高可用,横向扩展
缺点:不支持事务,伪实时的,mapping不可变,写入性能不高
- 应用场景:站内搜索,大数据的实时搜索,存储,统计 监控日志分析,可视化
https://www.cnblogs.com/ExMan/p/11386130.html
https://www.cnblogs.com/ExMan/p/11373884.html redis分布式锁
- 死锁:在事务执行的过程中,因争抢资源而互相等,死锁的概率非常低,因为innodb内置有死锁检查机制,当出现死锁自动回滚
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流
https://www.cnblogs.com/ExMan/p/11247122.html
缓存:
在高并发的情况下,如果没有缓存数据库将会分分钟被爆,系统也会瞬间瘫痪,使用缓存不单单能提升系统访问速度,提高并发量,也是保护数据库,保护系统的有效方式。大型网站主要是读,缓存很容易被想到,在大型写系统中,缓存也扮演重要的角色。积累一些数据批量写入,内存里面的缓存队列(生产消费),HBase写入数据机制等都是通过缓存提升系统的吞吐量或者实现系统的保护措施。甚至是消息中间件,可以理解为分布式的数据缓存。
降级:
服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。根据服务方式:可以拒绝服务,可以延迟服务,也可以随机服务,根据服务的范围,可以砍掉某个功能,可以砍掉某些模块。总之服务降级需要根据不同的业务需求采用不同的降级策略。主要的目的就是服务虽有损但总比没有好。
限流:
可以理解为服务降级的一种,限流就是限制系统的输入输出流量已达到保护系统的目的。一般来说系统的吞吐量可以被测算,为了保证系统的稳定性,一旦到达某个阈值就要需要限流并采取一些措施来完成限制流量的目的。比如:延迟处理,拒绝处理,拒绝部分处理等。
限流的算法:计数器,漏桶和令牌桶算法
计数器: