go 下载速度慢

linux 和 mac

1
echo "export GOPROXY=https://goproxy.cn" >> ~/.profile && source ~/.profile

西瓜视频爬虫

写了一个小工具,主要是爬取西瓜视频的教程,方便下载下载学习,语言使用 goLang . 软件是编译成 exe 文件,想要源码直接联系我。

  1. 默认支持同时 5 个协程同时下载
  2. 支持单个和合集下载,最多默认支持 20集下载
  3. 纯属技术交流,不要用于其他。
  4. golang 编译成 exe 竟然会报毒,信任即可
阅读更多
Redis 系列--06. Redis 架构

Redis 系列--06. Redis 架构

Redis 在实际使用的过程中,针对不同的场景需要对应的架构,这篇博客主要是总结 Redis 在实际在生产中遇到的架构以及各自的有点和缺点。

1. 单机架构

Redis 架构
阅读更多
Redis底层原理--05. Redis 数据库

Redis底层原理--05. Redis 数据库

1数据库

1.1 数据结构

Redis 中的每个数据库,都由一个 redis.h/redisDb 结构表示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct redisDb {
// 保存着数据库以整数表示的号码
int id;
// 保存着数据库中的所有键值对数据
// 这个属性也被称为键空间(key space)
dict *dict;
// 保存着键的过期信息
dict *expires;
// 实现列表阻塞原语,如 BLPOP
// 在列表类型一章有详细的讨论
dict *blocking_keys;
dict *ready_keys;
// 用于实现 WATCH 命令
// 在事务章节有详细的讨论
dict *watched_keys;
} redisDb;
阅读更多
Redis底层原理--04. Redis 功能的实现
Redis底层原理--03. Redis 数据类型

Redis底层原理--03. Redis 数据类型

1. 对象处理机制

由于 redis 需要对每一个 key 产生不同的操作,所以Redis 必须让每个键都带有类型信息,使得程序可以检查键的类型,并为它选择合适的处理方式

为了解决以上问题, Redis 构建了自己的类型系统,这个系统的主要功能包括:

  • redisObject 对象。基于 redisObject 对象的类型检查。
  • 基于 redisObject 对象的显式多态函数。
  • 对 redisObject 进行分配、共享和销毁的机制。
阅读更多
Redis底层原理--02. 内存映射数据结构

Redis底层原理--02. 内存映射数据结构

1. 整数集合

整数集合(intset)用于有序、无重复地保存多个整数值,它会根据元素的值,自动选择该用什
么长度的整数类型来保存元素

举个例子,如果在一个 intset 里面,最长的元素可以用 int16_t 类型来保存,那么这个 intset
的所有元素都以 int16_t 类型来保存。

另一方面,如果有一个新元素要加入到这个 intset并且这个元素不能用 int16_t 类型来保存
——比如说,新元素的长度为 int32_t ,那么这个 intset 就会自动进行“升级” :先将集合中现有的所有元素从 int16_t 类型转换为 int32_t 类型,接着再将新元素加入到集合中。

阅读更多
Redis底层原理--01. Redis 中的数据结构

Redis底层原理--01. Redis 中的数据结构

简单的字符串

1. 设计要点

在 C 语言中,字符串可以用一个 \0 结尾的 char 数组来表示。 比如说,hello world 在 C 语言中就可以表示为 “hello world\0” 。

这种简单的字符串表示在大多数情况下都能满足要求,但是,它并不能高效地支持长度计算和 追加(append)这两种操作:

  • 每次计算字符串长度(strlen(s))的复杂度为 θ(N) 。

  • 对字符串进行 N 次追加,必定需要对字符串进行 N 次内存重分配(realloc)。

阅读更多

Redis系列--布隆过滤器

在 Redis 的使用场景中,基本的架构图如下:
布隆过滤器
如果在缓存中查询不到数据,会直接到 DB 中查询,查询的数据再插入到缓存中。例如我们根据 orderId 查询对应的订单,具体伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
OrderEntity getOrder(String orderId){
//1. 查询缓存
OrderEntity orderEntity= getFromRedis(orderId);
if (orderEntity != null) {
return orderEntity;
}
//2. 缓存不存在
orderEntity=getFromDb(orderId);
//3. 塞入缓存
setRedis(orderEntity);
//4. 返回查询的值
return orderEntity;
}
阅读更多

使用 docker-compose 打包多个应用

准备工作

这次部署两个项目,一个是 web 站点项目,一个是爬虫的后台应用项目。

  1. 两个项目的 jar 包,分别为 app.jar,spider.jar
  2. 两个应用都依赖 redis 和 mysql
  3. mysql 初始化需要的 sql 文件

docker file 文件

docker file 是 使用 docker 部署应用的命令。 具体的命令可以参考 Docker 命令.

由于是两个文件,所以需要两个不同的 Dockerfile .具体的 build 的内容如下:

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×