10 2022 档案
摘要:本文学redis常用数据类型有序集合Zset基本操作与底层数据结构 1. 基本操作 # zadd <key> <score> <member>将多个member元素及其score值加入有序集合key中 127.0.0.1:6379> zadd top 100 java 99 python 98 vu
阅读全文
摘要:本文讲解redis常用数据类型集合Set的基本操作与数据结构 1. 基本操作 # sadd集合添加元素 127.0.0.1:6379> sadd username shenjian shenjian domi jing (integer) 3 # smembers取出集合中所有元素 127.0.0.
阅读全文
摘要:1. 基本操作 # lpush/rpush从左边或右边插入一个或多个值 127.0.0.1:6379> lpush username shenjian domi (integer) 2 # lpop/rpop从左边或右边抛出一个值 127.0.0.1:6379> rpop username 1 1)
阅读全文
摘要:本文系列学习redis五大常用数据类型之字符串String的基本操作及编码与底层数据结构 1. 基本操作 // set key value设置键值对 127.0.0.1:6379> set blog shenjian.online OK // get查询对应键值 127.0.0.1:6379> ge
阅读全文
摘要:本文介绍redis键key基本操作 // 切换数据库,redis0-15,共16个数据库 127.0.0.1:6379> select 0 OK // 查看所有的key 127.0.0.1:6379> keys * (empty array) // 赋值key键blog值为shenjian.onli
阅读全文
摘要:本文介绍采用docker-compose快速部署redis7,供学习使用 1. 编写docker-compose.yml文件 version: '3' services: redis: network_mode: bridge container_name: redis image: redis:7
阅读全文
摘要:本文讲解如何从零到一打造自己的NFT 所有代码已上传至https://gitee.com/SJshenjian/blockchain/tree/master/hardhat-nft-fcc 1. 下载安装项目 git clone https://gitee.com/SJshenjian/blockc
阅读全文
摘要:本文继续通过笔者学习到的抵押赎回智能合约Fund来进一步学习solidity语言,加深对开发的理解,其中通过storage节省gas是需要重点实践的,毕竟涉及到资产 代码已提交至https://gitee.com/SJshenjian/blockchain/tree/master/hardhat-f
阅读全文
摘要:先前我们讲解了如何部署智能合约,今天我们来对合约进行测试,这是非常重要的一部分,毕竟一旦部署后不可变,如果测试不充分,那么黑客就不会客气了 1. 单元测试 在test目录下新建test-deploy.js const { ethers } = require("hardhat") const { e
阅读全文
摘要:现在我们来实践hardhat部署合约中的其他更多技术要点 1. 代码方式验证合约 注册https://etherscan.io/, 如下图添加拷贝API_KEY 在.env文件中新增ETHERSCAN_API_KEY ETHERSCAN_API_KEY=API_KEY【刚才注册的key】 hardh
阅读全文
摘要:先前讲解的本地部署只能合约的方式编码较多,现在我们介绍目前比较流行的智能合约框架hardhat 1.环境准备 yarn init yarn add --dev hardhat yarn hardhat npm install --save-dev @nomicfoundation/hardhat-t
阅读全文
摘要:1. 注册登录alchemy https://www.alchemy.com/ 在面板中我们看到Goerli网络,然后点击view key,如下图所示拷贝http 替换.env中的RPC_URL=http://127.0.0.1:7545配置 2. 导出MetaMask私钥 注意选择网Goerli测
阅读全文
摘要:本文讲解如何对私钥加密处理以及部署后需注意的事项 1.新建encryptKey.js const ethers = require("ethers"); const fs = require("fs-extra"); require("dotenv").config(); async functio
阅读全文
摘要:本文讲解使用本地开发工具编写、部署智能合约。 准备环境 Visual Studio Code Node 安装solidity插件,如图所示: 同理安装Prettier - Code formatter插件 安装插件后,重启Visual Studio Code PS D:\blockchain\eht
阅读全文
摘要:本文继续用Remix工具部署学习智能合约,通过具体案例来深入学习solidity语法 1. 编写PriceConverter.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@chainlink/contract
阅读全文
摘要:本文介绍从零至一采用Remix工具,使用Solidity语言开发,部署合约至rinkeby测试网,对于主网部署只需切换网络即可。 https://remix.ethereum.org/ 1. 编写SimpleStorage.sol合约 // SPDX-License-Identifier: MIT
阅读全文
摘要:1. 基本概念 智能合约:过去中心化的方式来执行一系列的指令,在这些指定的执行中,并不需要中心化或者第三方的中介 混合型智能合约:将链上去中心化逻辑和链下去中心化数据和计算相结合 WEB3:以区块链与智能合约为基础的下一代网络,用户拥有他们所使用的协议,即用户是自己数据的主人 智能合约行业应用: D
阅读全文
摘要:对于ReplacingMergeTree引擎,我们之前讲过在后台合并的时间不定,合并前查询会存在数据不一致问题。 CREATE TABLE study.house ( id String, city String, region String, name String, price Float32,
阅读全文
摘要:本文介绍多表关联查询优化方式 1. 用IN代替JOIN 当多表查询时,查询的数据仅从一张表出时,可考虑用IN操作而不是JOIN SELECT a.* FROM hits_v1 a WHERE a.CounterID in (SELECT CounterID FROM visits_v1); 2. 多
阅读全文
摘要:1. Explain查询计划查看 // 查看执行计划,默认值 EXPLAIN PLAN SELECT arrayJoin([6,6,7]) // AST语法树查看 EXPLAIN AST SELECT numbers FROM system.numbers LIMIT 10; // 用于优化语法 E
阅读全文
摘要:副本集对数据进行完整备份,数据高可用,对于分片集群来说,不管是ES还是ClickHouse是为了解决数据横向扩展的问题,ClickHouse在实际应用中一般配置副本集就好了 1. 编写clickhouse-shard.yml文件 具体代码已上传至gitee,可直接克隆使用 # 副本集部署示例 ver
阅读全文
摘要:1. 编写clickhouse-replication.yml文件 该代码已上传至gitee,可克隆下来 # 副本集部署示例 version: '3' services: zoo1: image: zookeeper restart: always hostname: zoo1 ports: - 2
阅读全文
摘要:上篇文章已经创建过表及熟悉了基本语法,本文介绍CK的数据类型以及表引擎的一些分类与作用 1. 数据类型 |类型||||| |-|-|-|-|-| |整型|Int8|Int16|Int32|Int64| |浮点型|Float32|Float64| |Decimal型|Decimal|Decimal32
阅读全文
摘要:首先我们建表,表引擎我们后续文章在详细介绍,我们首先了解下基本SQL语法 CREATE DATABASE study; CREATE TABLE study.customer ( id UInt8, city String, name String, score Float32, sex Enum8
阅读全文
摘要:1. 列式存储 采用列式存储时,数据在磁盘上的组织结构为: 1 2 3 张三 李四 王五 18 20 25 好处: 对于列的聚合、计数、求和等统计操作由于列式存储 由于列数据类型相同,更容易数据压缩 由于数据压缩比更好,不仅节省磁盘空间,更便于cache发挥空间 2. DBMS功能完备 几乎覆盖标准
阅读全文
摘要:本文介绍docker-compose方式部署clickhouse数据库 编写docker-compose.yml文件: version: '3' services: elasticsearch: image: clickhouse/clickhouse-server container_name:
阅读全文
摘要:本文介绍工作中Python版常用的高效ES批量插入、更新数据方式 1. 批量插入 import pandas as pd from elasticsearch import helpers actions = list() count = 0 for index, item in merged_df
阅读全文
摘要:1. SSHFS挂载 上传Elasticsearch\fuse-2.9.2-11.el7.x86_64.rpm至ES所在三台机器 上传Elasticsearch\fuse-libs-2.9.2-11.el7.x86_64.rpm至ES所在三台机器 上传Elasticsearch\fuse-sshfs
阅读全文
摘要:深入理解聚合分析原理及精确性问题 1. Metric Aggregation 单值分析,只输出一个分析结果 min max avg sum cardinality (类似distinct count) 多值分析,输出多个分析结果 stats extended stats percentile, pe
阅读全文
摘要:1. 刨析分布式查询及相关性算分 1.1 分布式搜索的运行机制 ElasticSearch的搜索,会分为两阶段进行 第一阶段 Query 第二阶段 Fetch Query Then Fetch 1.2 Query阶段 用户发出搜索请求到ES节点。节点收到请求后,会已Coordinating节点的身份
阅读全文
摘要:由于nlp分词服务属于CPU密集型,所以需要在部署的时候尽量使得pod分散在不同node上,已缓解cpu负载,目前发现线上部署每次发布都会到同一节点上,故如下改造 apiVersion: apps/v1 kind: Deployment metadata: name: shenjian-nlp na
阅读全文
摘要:分片内部原理及其生命周期 什么是ES分片 ES中最小的工作单元,是一个Lucene的index 一些问题 ES搜索是近实时的 ES在断电时数据不会丢失 删除文档,不会立刻释放空间 1.1 倒排索引不可变性 倒排索引采用Immutable Design,一旦生成,不可更改 不可变性优点 无需考虑并发写
阅读全文
摘要:1. 分布式特性 ElasticSearch的分布式架构带来的好处 存储的水平扩容,支持PB级数据 提高系统可用性,部分节点停止服务,整个集群服务不受影响 2. 脑裂问题 Split-Brain 当出现网络问题,一个节点和其他节点无法连接,在各自的网络环境下,选举为各自主节点 如何避免脑裂问题? 限
阅读全文
摘要:1. 相关性和相关性算分 1.1 相关性 搜索的相关性算分,描述了一个文档和查询语句匹配的程度。ES会对每个匹配查询条件的结果进行算分_score 打分的本质是排序,需要把最符合用户需求的文档排在最前面。ES5之前,默认的相关性算分是TF-IDF,现在采用BM 25 2. 词频TF Term Fre
阅读全文
摘要:1. 基于词项与全文的搜索 1.1 基于term的搜索 term的重要性:term是表达语义的最小单位 特点: 包括term query\range query\exists query\prefix query\wildcard query term查询,对输入不做分词 可以通过constant
阅读全文
摘要:1. 聚合分类 Bucket Aggregation:系列满足特定条件的文档的集合,如term range GET kibana_sample_data_flights/_search { "size": 0, // 只显示聚合结果 "aggs": { "flight_dest": { "terms
阅读全文
摘要:1. 索引模板创建索引 可以通过http://127.0.0.1:5601/app/management/data/index_management/templateskibana工具进行创建索引模板 也可以自定义语句,如创建poi索引模板 POST _index_template/poi { "i
阅读全文
摘要:1. Analysis与Analyzer Analysis: 文本分析是把全文本转换一系列单词(term/token)的过程,也要分词 Analysis是通过Analyzer来实现的。可使用ElasticSearch内置分析器或按需定制化分析器 除了在数据写入时转换词条,匹配Query语句时候也需要
阅读全文
摘要:1. 倒排索引简介 对于书通过目录查找对应章节内容的方式属于正排索引,而对于想查询文本,如我爱中国在书籍中出现的次数与具体位置,则是倒排索引的范畴。 2. 倒排索引核心组成 单词词典(Term Dictionary) 记录所有文档的单词,记录单词到倒排列表的关联关系。单词词典一般比较大,可以通过B+
阅读全文
摘要:1. 文档写入 # create document. 自动生成 _id POST users/_doc { "user" : "shenjian", "post_date" : "2022-08-07T14:12:12", "message" : "trying out Kibana" } # 创建
阅读全文
摘要:1. 文档 ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位 文档会被序列化成JSON格式,保存在ES中 每个文档都有一个unique ID #查看前10条文档,了解文档格式 POST kibana_sample_data_ecommerce/_search { } 1.1 文
阅读全文
摘要:对于之前的部署方式一般用于生产环境,而对于学习而言Docker方式快速部署就好了,本示例在window10环境下进行。 1. Docker使用Elasticsearch 需要对vm.max_map_count进行如下配置 # Windows and macOS with Docker Desktop
阅读全文
摘要:1. 在master节点上创建秘钥库 export ES_PATH_CONF="/home/elasticsearch/config" && /usr/local/elasticsearch-7.6.2/bin/elasticsearch-keystore create 2. 在所有节点中开启ssl
阅读全文
摘要:第一步:安装JDK JDK要求jdk1.8+,不安装也可以,ES自带JDK 第二步:系统配置 2.1 禁用交换区 sudo swapoff -a 2.2 开最大文件数的限制 编辑文件 /etc/security/limits.conf把nofile设置为65536 或者执行 echo "* soft
阅读全文
摘要:Groovy作为脚本,比Java在数据处理中具有更高的灵活性 // 获取mongo连接略 .... def count = 0 for(Township town : townships) { Document updateBson = new Document() Document update
阅读全文
摘要:在实际的工作中,难免批量更新的数量极大,pymongo提供了便捷的客户端供使用 假设读者对pandas比较熟悉,下图为事先准备好的dataframe import pandas as pd from pymongo import MongoClient from bson.codec_options
阅读全文
摘要:1. 查看当前状态 1.1 查看配置信息 mongos> use config // 查看分片 mongos> db.shards.find() { "_id" : "study", "host" : "study/localhost:27018,localhost:27019,localhost:
阅读全文
摘要:1. 查看当前操作 mongos> db.currentOp() { "inprog" : [ { "shard" : "study", "type" : "op", "host" : "2bffe09ec303:27019", "desc" : "ReplBatcher", "active" :
阅读全文
摘要:1. 片键类型 1.1 升序片键 升序片键通常类似于date或ObjectId--随着时间稳步增长的字段。 这种模式通常会使MongoDB更难保持块的平衡,因为所有的块都是由一个分片创建的。 1.2 随机分发的片键 随机分发的键可以是用户名,电子邮件地址,UUID,MD5哈希值等 由于写操作是随机分
阅读全文
摘要:1. 启动服务器 1.1 启动配置服务器 配置服务器是集群的大脑,保存着关于每个服务器包含哪些数据的所有元数据,因此,必须首先创建配置服务器。 由于资源限制,在同一机器上启动三个进程 # mkdir /home/mongo/cs1 # mkdir /home/mongo/cs2 # mkdir /h
阅读全文
摘要:1. 分片概念 分片是指跨机器拆分数据的过程,有时也会用术语分区。MongoDB既可以手工分片,也支持自动分片 2. 理解集群组件 分片的目标之一是由多个分片组成的集群对应用程序来说就像是一台服务器。为了此实现,需要在分片前面运行一个或多个称为mongos的路由进程。mongos维护着一个“目录”,
阅读全文
摘要:1. 控制成员状态 1.1 把主节点变为从节点 rs.stepDown() 1.2 阻止选举 如果需要对主节点维护,不想期间其他从节点选举为主节点,则可以 rs.freeze(10000) 维护完成后,只需要再次执行以下命令即可 rs.freeze(0) 2. 监控复制 2.1 获取状态 rs.st
阅读全文
摘要:1. Python连接副本集 from pymongo import MongoClient from bson.codec_options import CodecOptions from retry import retry import pytz import pandas as pd cla
阅读全文
摘要:1. 管道阶段和可调参数 聚合框架基于管道的概念。他由多个阶段组成,每个阶段都会提供一组按钮或可调参数。每个阶段对其输入执行不同的数据处理任务,并生成文档已作为输出传递到下一阶段。 2. 阶段常见操作 匹配(match)、投射(project)、排序(sort)、跳过(skip)、限制(limit)
阅读全文
摘要:1. 同步 复制是指多台服务器保持相同的数据副本。MongoDB通过保存操作日志(oplog)实现复制功能。 oplog存在于主节点local数据库中的一个固定集合,包含了主节点执行的每一次写操作。 每个节点维护自己的oplog,用来记录它从主节点复制的每个操作,从节点停止运行重启后,会从oplog
阅读全文
摘要:1. 如何设计副本集 大多数:选取主节点时需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点,写操作被复制到大多数成员时就是安全的写操作。这里的大多数定义为“副本集中一半以上的成员”,由此可看一般设置为奇数,如3个节点 2. 如何进行选举 MongoDB在3.2版本中引入了第一版复制协
阅读全文
摘要:1. 复制简介 在MongoDB中,创建副本集后就可以使用复制功能了,副本集是一组服务器,其中一个是用于处理写操作的主节点,还有多个用于保存主节点的数据副本的从节点,如果主节点崩溃了,则从节点会从中选举中一个新的主节点 2. 创建副本集 mongod --replSet study --dbpath
阅读全文
摘要:1. 地理空间索引及全文搜索 与Elasitcsearch一样,MongoDB同样支持地理空间索引及全文搜索,由于选型常用ES而非MongoDB此处略过 2. TTL索引 首先先了解下固定集合,其类似于循环队列 ,当满的时候,最旧的文档会被覆盖。而TTL索引允许允许为每个文档设置一个超时时间,当一个
阅读全文
摘要:1. $运算符如何使用索引 1.1 低效的运算符 $ne、$not查询可以使用索引,但不是很有效,尽量避免 1.2 范围查询 范围查询其实是多值查询,根据复核索引规则,尽可能先等值精确匹配,然后范围查询 1.3 OR查询 $or实际执行两个索引查询然后合并,应尽可能使用$in,而非$or 2. 索引
阅读全文
摘要:1. 执行计划查看 db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats') 结果查看,先大致看一遍,后续慢慢来深入理解 { "queryPlanner": { "plannerVersion
阅读全文
摘要:1. find简介 // 查询所有文档 db.users.find({}) // 查询指定条件文档 db.users.find({'name': 'shenjian'}) // 查询指定字段,1查询键 0剔除键 db.users.find({'name': 'shenjian'}, {'name':
阅读全文
摘要:1. 插入文档 // 单条插入 db.getCollection('blog').insertOne({'type': 'mongodb'}) // 批量 插入 db.getCollection('blog').insertMany([{'type': 'elasticsearch'}, {'typ
阅读全文
摘要:1. 编写docker-compose.yaml文件 version: "3" services: mongo: image: mongo:4.2.6 ports: - 27017:27017 volumes: - ./data:/data/db:rw - ./configdb:/data/conf
阅读全文
摘要:Publisher Confirms发布确认是用于实现可靠发布的RabbitMQ扩展。 我们将使用发布确认来确保已发布的消息已安全到达代理。我们将介绍几种使用publisher确认的策略,并解释其优缺点 首先检查application.yml文件 spring: rabbitmq: host: 12
阅读全文
摘要:1. RPC Remote Procedure Call:远程过程调用,一次远程过程调用的流程即客户端发送一个请求到服务端,服务端根据请求信息进行处理后返回响应信息,客户端收到响应信息后结束 2. Client interface客户端接口 为了说明如何使用RPC服务,我们将把“发送方”和“接收方”
阅读全文
摘要:topic主题交换器它根据在队列绑定的路由键和路由模式通配符匹配将消息路由到队列。 生产者在消息头中添加路由键并将其发送到主题交换器。 收到消息后,exchange尝试将路由键与绑定到它的所有队列的绑定路由模式匹配。 如果找到匹配,则将消息路由到其路由模式匹配的队列,如果未找到匹配,则忽略该消息 R
阅读全文
摘要:我们通过fanout exchange(扇型交换机)实现生产者发送一个消息,这个消息同时被传送给所有队列。但是有时我们不希望所有的消息都被所有队列接收,我们希望可以指定类型为a的消息只能被队列A接收,类型为b的消息只能被队列B,C接收。扇型交换机只能无脑地广播消息给所有的消费者,其实质是广播给所有关
阅读全文
摘要:headers exchange是根据消息header值而不是routing key将消息路由到队列的交换器。 生产者在消息头中以键值对的形式添加一些值,并将其发送到headers exchange, 收到消息后,headers exchange尝试将所有或任何(基于x-match的值)header
阅读全文
摘要:我们把一个消息转发给多个消费者,这种模式称之为发布-订阅模式 1.交换器(Exchange) RabbitMq消息模式的核心思想是:一个生产者并不会直接往一个队列中发送消息,事实上,生产者根本不知道它发送的消息将被转发到哪些队列。 实际上,生产者只能把消息发送给一个exchange,exchange
阅读全文
摘要:1. 编写消费者 @Component @RabbitListener(queues = "hello") public class RabbitReceiver { @RabbitHandler public void receive(String in) { System.out.println
阅读全文
摘要:1. 新建队列 2. 新增POM.xml配置文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.0</vers
阅读全文
摘要:1. docker方式启动MQ # latest RabbitMQ 3.10 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management 2. 登录ui http://127.0.0
阅读全文