文章目录
数据库设计
理解维度数据仓库——事实表、维度表、聚合表
维表与事实表
简单说维表就是某个维度的可取值,例如商品id信息表,记录了某个商品的名称类别等:事实表就是将多个维表中的取值拼成的一个事实,例如订单表,里面包含着商品名,购买者等等
范式
数据库设计三大范式
如何理解关系型数据库的常见设计范式? - 知乎用户的回答 - 知乎
语句分类
Hive
SqlSever
Pivot
redis
lua脚本
后端程序员必会:并发情况下redis-lua保证原子操作
单线程执行lua
做缓存
广州小公司面试题:如何保证缓存一致性
这就是旁路缓存
先写后删+延迟双删,尽可能保证数据一致性。不可能完全保持啦。 就算是删除,并发的时候,只要不加锁,造成不一致的情况多了去了。
em。。。其实也有解决办法,可以类比mysql的锁策略。 某一条数据如果要更新,就加上写锁,这个写锁锁定的是db+缓存
线程A要更新数据X,为x加上写锁。
线程B要读取数据X,发现X带写锁,那么不写缓存。
线程A更新完之后,删掉缓存,然后释放写锁。
20 图 |6 千字|缓存实战(上篇)
上一篇文章里,关于本地锁的解释不太好,作者实际想说的是,为访问DB的操作加锁,一次只能有一个访问db的线程,这个线程会把访问结果写进缓存,然后释放掉锁,然后如果其他的线程抢到锁了,重新执行get方法,那么这些线程的访问就会去走缓存,而不会去访问db。
所以实际上应该是先判断缓存是否存在,如果不存在,才尝试获取锁,获取锁成功,就执行上述步骤,获取锁失败,应该就等一段时间后,重新执行get方法,而不是block住。如下所示
缓存穿透,缓存击穿,缓存雪崩解决方案分析
做分布式锁
Redis 分布式锁|从青铜到钻石的五种演进方案
钻石方案:原子地加锁+设置过期时间+设置uuid作为value来标识锁,原子地使用uuid+lua脚本解锁
分布式锁中的王者方案 - Redisson
限流器
我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了!
redisson也可,其实更好用。
MongoDB
etcd
Java中使用etcd,包括基本的set、get、超时设置,watch监听等
jetcd实战之三:进阶操作(事务、监听、租约)
etcd学习和实战:4、Java使用etcd实现服务发现和管理
etcd 中让人头大的 version, revision, createRevision, modRevision
jetcd
浅析jetcd中KeepAlive实现及使用
jetcd实战之二:基本操作
jetcd实战之一:极速体验
ElasticSearch
Elasticsearch Reference
ES java api
Java REST Client
ElasticSearch教程——汇总篇
目前只安装了ElasticSearch和kibana进行学习,ES可以理解为用restful风格使用http进行crud的数据库,其实我感觉直接用postman什么的直接发请求也可以。不用安装kibana了
聚合:
aggs就类似于sql里的groupby+聚合操作,aggs可以层层嵌套。例如
"aggs": {
"group_by_tags": {
"terms": { "field": "tags" },
"aggs":....
}
}
首先把这次aggs操作起了个名字叫做group_by_tags
,分组的条件是terms
(如果分组条件是"global:{}"
则相当于把全部的doc分为一组),然后基于分组结果,可以进行下一次aggs操作(继续分组或者求取平均值等)。当然可以定义多个聚合操作,他们之间可以相互并列。
Types cannot be provided in put mapping requests
es聚合查询失败
创建索引、类型、文档:
创建可以使用put与post,更新用post,删除用delete,获取用get
Elasticsearch Java API 很全的整理以及架构剖析
Elasticsearch7.X为什么移除类型(type)
Elasticsearch倒排索引、kibana、ES检索常用命令、ES进阶检索、ES聚合、SpringBoot整合Elasticsearch
java-api有点老了,而且也使用了type,但其实我觉得用了也没啥。
Elastic Stack-3:新版 ElasticSearch Java Client 尝鲜
聚合
elasticsearch系列六:聚合分析(聚合分析简介、指标聚合、桶聚合)
clickhouse
DDL
深入理解ClickHouse-本地表和分布式表
分布式表本身并不存储数据,只是提供了一个可以分布式访问数据的框架,查询分布式表的时候clickhouse会自动去查询对应的每个本地表中的数据
ClickHouse表引擎到底怎么选
DQL
ClickHouse分布式IN & JOIN 查询的避坑指南
只要理解了clickhouse分布式表的概念就好说了,两个分布式表可以join,两个本地表(例如子查询生成的表)也可以join,但如果是一个分布式与一个子查询进行join,就需要对子查询进行global