自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(94)
  • 收藏
  • 关注

原创 go-zero源码阅读-固定时间窗口限流

go-zero框架的PeriodLimit限流是固定时间窗口限流,通过lua脚本操作redis, 对key进行计数并搭配过期时间实现限流

2023-02-19 22:13:11 350

原创 go-zero源码阅读-RedisLock分布式锁实现

go-zero分布式锁代码文件: core/stores/redislock.go。该分布式锁通过lua脚本使用redis的set命令实现, 整体实现逻辑比较简单。

2023-02-15 22:43:27 612

原创 go-zero源码阅读-布隆过滤器

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2023-02-05 22:09:52 610

原创 errgroup源码

golang为并发执行提供了WaitGroup工具,方便goroutine执行的控制,但是缺少了error的传递和一个goroutine出错,取消其他goroutine执行能力。通过对WaitGroup的进一步封装,就变成了errgroup,可以很好的解决上述问题。

2023-01-15 11:26:16 593

原创 groupcache源码(六)-一致性哈希实现

groupcache分布式集群下,使用了一致性哈希算法

2022-10-05 20:57:35 154

原创 groupcache源码(五)-分布式设计

groupcache分布式设计比较简单,各节点通过http进行交互,传输内容为pb格式。并且使用一致性哈希算法减少扩缩容对数据的影响

2022-10-05 11:27:26 623

原创 groupcache源码(四)-主数据结构group

group是核心数据结构,对外提供服务,对内进行数据操作

2022-10-04 23:19:34 174

原创 groupcache源码(三)-cache对lru的进一步封装

lur.Cache是对数据lru的实现,但并不是并发安全的。groupcache.cache进行了进一步的并发封装

2022-10-04 17:53:27 326

原创 groupcache源码(二)-核心数据结构Cache的lru实现

groupcache使用Cache(结构体名)进行数据存储,Cache内部利用lru缓存淘汰策略进行数据淘汰

2022-09-25 21:21:17 131

原创 groupcache源码(一)-groupcache使用

groupcache是类似于memcache的分布式储存库,在使用时它既是客户端又是服务端

2022-09-25 20:03:20 160

原创 kafka-数据存储介绍

topic的一个分区对应一个日志(Log), Log又被切分为多个LogSegment,可以防止Log过大的同时方便维护和清理。Log在物理上是以文件夹的形式存储,LogSegment对应的是以个日志文件和两个索引文件,以及可能的其他文件。想Log中写入数据是顺序写入的,只会向最后一个LogSegment中写入数据,当满足一定条件后,会向新的LogSegment中写入数据。每一个LogSegment都有一个基准偏移量用来表示当前LogSegment第一条消息的offset索引文件主要用来提高消息查找的速度。

2022-06-12 14:11:48 305

原创 golang源码阅读-sync.map

golang内置的map不是并发安全的,在v1.9版本提供了并发安全的map: sync.mapsync.map的使用方式和map类似,数据存储、获取、删除和遍历如果使用map 加锁进行数据操作时,耗时相对较多,sync.map采用了对数据进行读写分离,读时不加锁,用空间换时间进行read操作时,不需要加锁,数据类型为atomic.Value,保证了数据的获取和将dirty赋值给read时的原子性,数据存储的是readOnly, readOnly内部存储的是值的指针,和dirty值的指针一致

2022-06-04 17:25:33 171

原创 java源码-String

String类常用方法源码

2022-05-29 14:47:11 797 4

原创 行为参数化 lambda简单使用

1. 行为参数化让方法接受多种行为作为参数,并在内部使用,来完成不同的行为2. 使用示例2.1 苹果类定义颜色和重量属性,用于lambda表达式数据过滤2.2 苹果过滤的类调用ApplePredicate的方法,返回true的数据加入到结果中2.3 ApplePredicate 接口2.4 lambda简单使用使用lambda表达式, 传入 颜色为1 并且 重量小于200的行为, 不需使用匿名类减少代码量...

2022-05-14 16:15:17 94

原创 gorm-简单使用(一)

一. gorm操作表代码package mainimport ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm")// 表对应的结构体type User struct { Id int `gorm:"primary_key"` Name string Age int Email string}func main() {// 链接mysql db, err := gorm.O

2022-04-16 22:58:42 783 1

原创 centos安装nacos

1. 下载nacos a. 官网下载:Releases · alibaba/nacos · GitHub参考命令:wget https://github.com/alibaba/nacos/releases/download/2.0.4/nacos-server-2.0.4.tar.gz2. 解压文件tar -zxvf nacos-server-2.0.4.tar.gz3. 配置mysql a. 创建数据库 nacos_config b. 进入nacos下...

2022-04-11 22:45:40 1881

原创 springboot获取配置文件信息

1. 配置文件内容2. 实体类装载配置信息3. 测试4. 单个值可以使用@Value加载,同时可以使用@ConfigurationProperties的prefix将特定前缀的配置装载到类中

2022-02-22 23:45:36 688

原创 使用idea将springboot打包成jar包

1. File->Project Structure2. Project Settings -> Artifacts -> 点击 + 号 -> JAR -> From modules with dependencies3. 点击文件图标 -> 选择入口类 -> OK->OK4. idea右侧点击maven -> 点击Lifecycle下的clean -> 点击package...

2022-02-21 23:07:28 4910

原创 hive-数据操作

1. 向管理表增加数据local: 代表路径是本地文件系统,没有local 可以是hdfs路径2. 通过查询语句插入数据3. 导出数据

2021-12-05 17:47:11 261

原创 hive-数据定义

0. 语句和sql类似1. 显示所有数据库2. 创建数据库3. 切换数据库default未默认数据库4. 显示所有表5. 显示建表语句6. 建表7. 创建外部表external: 外部表fields terminated by: 列切分的标识符location: 文件位置8. 创建分区表...

2021-12-05 14:50:08 182

原创 hive-基础操作

0. 已经安装hive并且设置变量1. 命令行界面 直接输入hive 回车,编写sql2. 一次性sql b

2021-12-04 22:29:35 118

原创 mybatis(1)-简单使用

1. 要操作的表2. 使用maven创建项目3. 导入坐标 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> &l

2021-10-06 22:05:54 66

原创 java-c3p0简单使用

1. 项目下创建libs目录, 放入对应jar包文件2. 鼠标右键libs目录,点击 Add as Library(idea)3. 拷贝c3p0-config.xml文件到src目录下主要存放mysql连接信息4. 测试代码有statement对象后就可以正常操作mysql...

2021-09-20 16:05:04 284

原创 php单元测试-phpunit mac安装

1. 下载phpunit.pharwget http://phar.phpunit.cn/phpunit.phar2. 为phpunit.phar添加执行权限chmod +x phpunit.phar 3. 移动phpunit.pharsudo mv phpunit.phar /usr/local/bin/phpunit4. 查看phpunit版本phpunit --version ...

2021-08-04 22:24:23 145

原创 es-索引

1. 索引索引是具有相同结构的文档集合。2. 创建2个分片1个副本的索引PUT /user{ "settings": { "number_of_shards": 2, "number_of_replicas": 1 }}3. 删除索引DELETE /user4. 获取索引GET /user5. 添加映射PUT /user/_mapping/admin{ "properties": { "username": {

2020-12-29 08:34:17 85

原创 tp5源码学习-容器类

1. index.php调用//容器获取实例,执行实例的方法Container::get('app')->run()->send();2.Container::get public static function get($abstract, $vars = [], $newInstance = false) {//单例模式获取容器类的实例, 获取$abstract类实例// $vars参数 $newInstance 是否生成新的实例 return.

2020-11-15 13:04:43 331

原创 tp5源码学习-配置加载类

1. 类路径 tp5\thinkphp\library\think\Config.php2. 父类\ArrayAccess 实现父类的方法,可以像访问数组一样访问对象3. 配置文件加载 public function load($file, $name = '') { //如果是文件 if (is_file($file)) { $filename = $file; } elseif (is_f...

2020-11-14 16:40:18 177

原创 tp5源码学习-类自动加载机制

1. 加载基础文件文件路径: tp5\public\index.php2. 加载类自动加载执行类Loader,执行方法文件路径:tp5\thinkphp\base.php3.register类// 注册自动加载机制 public static function register($autoload = '') { // 注册系统自动加载 // 当没有找到的类,会执行 think\\Loader::autoload 这个方法...

2020-11-10 09:09:34 309

原创 php7执行过程

1. 首先进行词法分析,将源代码切割为多个字符串单元(token) 借助token_get_all函数获取代码切割后的token<?phpvar_dump(token_get_all("<?php echo \"hello world\";"));打印结果:array(5) { [0]=> array(3) { [0]=> int(379) [1]=> string(6) "<?php " [2]=&..

2020-11-08 17:32:00 167 1

原创 redis笔记-AOF持久化

1. AOF全称 Append Only File2. AOF持久化是通过保存redis服务器所执行的写命令来记录数据库状态3. AOF持久化功能三个步骤命令追加、文件写入、文件同步 a. 命令追加: 服务器执行完一个写命令之后,将被执行的命令追加到aof_buf缓冲区的末尾 b. 文件写入: 在每次结束一个事件循环前,会调用flushAppendOnlyFile()函数,判断是否将aof_buf缓冲区中的内容写入和保存到 AOF文件里 c. 文件同...

2020-09-13 20:58:54 181

原创 redis笔记-RDB持久化

1. redis为什么需要持久化? 因为redis是内存数据库,它将数据存储在内存里,如果服务器进程退出,内存中的数据也会丢失2. 生成rdb文件的两个命令 save: save命令会阻塞redis服务器进程,直到rdb文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何命令请求 bgsave: bgsave会派生一个子进程,在子进程里创建rdb文件,服务器主进程会继续处理命令3. rdb文件的载入 rdb文件的载入没有专门的命令,只有在服务器启动时自动执行3...

2020-09-13 11:50:43 112

原创 redis笔记-过期键删除

1.三个删除策略 a. 定时删除 在设置键的过期时间的同时,创建一个定时器,让定时器在键过期时,立即执行对键执行删除操作 b. 惰性删除 放任键过期不管,但是每次从键空间获取键时,都检查获取的键是否过期,如果过期就删除 c. 定期删除 每隔一段时间,程序就对数据库进行一次检查,删除里面过期键2. redis服务器使用了惰性删除和定期删除两种策略3. 过期键惰性删除策略expireIfNeeded() 所有读数据库的redis...

2020-09-12 21:55:36 99

原创 redis笔记-对象的空转时长

1. redisObject的lru属性记录了该对象最后一次被命令访问的时间2. object idletime可以打印给定键的空转时长, 通过当前时间减去键的值对象的lru时间3. object idletime 在访问键的值对象时,不会修改对象的lru属性4. 如果服务器打开了maxmemory选项,并且用于内存回收的算法为volatile-lru或者allkeys-lru,当内存数超过了maxmemory时,优先删除空转时长较高的那部分键...

2020-09-10 08:41:07 362

原创 redis笔记-共享对象

000

2020-09-09 08:59:00 620

原创 redis笔记-有序集合对象

1. 有序集合的编码可以是ziplist或者skiplist2. 当使用ziplist编码时,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素则保存元素的分值3. ziplist内的集合元素按分值从小到大进行排序,分值小的元素被放置表头方向4. 当使用skiplist编码的有序集合对象使用zset结构作为底层实现typedef struct zset { dict *dict; zskiplist *zsl;} zset;a

2020-08-31 22:50:38 77

原创 redis笔记-集合对象

1. 集合对象的编码可以是inset或者hashtable2. 当使用hashtable编码时,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为null3. 使用intset条件a. 集合中所有元素都是整数值b.集合对象保存的元素数量不超过512个...

2020-08-31 22:17:16 81

原创 redis笔记-哈希对象

1. 哈希对象的编码可以是ziplist或者hashtable2. 当ziplist作为哈希对象的底层实现时,当有新的键值对时,程序会先将保存了键的压缩列表节点推入表尾,再将保存值的压缩列表节点推入表尾3. hashtable编码的哈希对象使用字典作为底层实现,键值对都使用一个字典键值对来保存4.使用ziplist的两个条件a.哈希对象保存的所有键值对的键和值的字符串长度都小于64字节b.键值对数量小于512个...

2020-08-30 21:55:16 71

原创 redis笔记-列表对象

1.列表对象的编码可以是ziplist或者linkedlist2.列表对象使用ziplist的两个条件a.列表对象保存的所有字符串长度小于64字节b.列表元素个数小于512个当不能同时满足上面两个条件时列表对象使用linkedlist编码3.linkedlist编码的列表对象使用双端链表作为底层实现,每个双端链表节点都保存了一个字符串对象...

2020-08-30 21:32:30 72

原创 redis笔记-字符串对象

1.字符串对象的编码可以是int、raw\或者embstr2. 如果字符串对象保存的是整数值,并且可以用long类型来表示,那么字符串对应的编码是int

2020-08-30 13:24:34 83

原创 redis笔记-压缩列表

1.压缩列表压缩列表是列表键和哈希键的底层实现之一, 当包含的少量列表项并且列表项是小整数值或者较短字符串时,redis会使用压缩列表键的底层实现2.压缩列表的构成zlbytes: 压缩列表的总长zltail: 尾节点距离压缩列表起始地址的便宜量zllen: 表示压缩列表包含的节点数量3.压缩列表节点previous_entry_length: 记录前一个节点的长度, 通过这个属性可以获取前一个节点的指针encoding: 记录节点content属性所保存数据的类型和长度

2020-08-27 23:06:42 100

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除