几个常用的nosql数据库的操作方式

dynamoDB

partition key:分区键
定义:分区键是用于分布数据存储的主键,每个项(Item)在表中都必须有一个唯一的分区键值。
特点:

  • 唯一性:每个分区键值在表中必须是唯一的,这是因为分区键决定了数据在物理存储中的位置。
  • 数据分布:选择一个良好的分区键可以确保数据在 DynamoDB 表中均匀分布。
    下面比较一些常见分区键架构的预置吞吐量效率:
    [图片]

sort key:排序键
定义:排序键是用于组织和查询表中数据的一部分主键,每个项目在表中都可以有一个分区键和一个可选的排序键。
特点:

  • 组合主键:在 DynamoDB 中,分区键和排序键一起形成组合主键。组合主键唯一标识表中的每个项目,并且排序键允许我们对项目进行排序和分组。
  • 唯一性:组合主键必须具有唯一性。
  • 查询速度快:在查询时可以通过二分查找快速定位到数据。

一般以时间作为排序键
索引
GSI (Global Secondary Index):全局二级索引

  • 可以是简单主键(分区键)或复合主键(分区键和排序键)
  • 可以在建表后更改
  • 可以跨分区查询整个表
    ps:分区只作用于物理分区,而对于索引没有意义,所以对于索引来说,GSI的partition key可以为任意字段,只要能够满足要求即可。
    LSI(Local Secondary Indexes):本地二级索引
  • 主键必须是复合主键(分区键和排序键)
  • 只能在建表时更改
  • 只能查询表中的单个分区

查询方式:

GetItem – 从表中检索单个项目。这是读取单个项目的最高效方式,因为它将提供对项目物理位置的直接访问。(DynamoDB 还提供
BatchGetItem 操作,允许在单个操作中执行最多 100 次 GetItem 调用。) Query –
检索具有特定分区键的所有项目。在这些项目中,您可以将条件应用于排序键并仅检索一部分数据。 Scan –
检索指定表中的所有项目。(不应对大型表使用此操作,因为这可能会占用大量系统资源。)

选择:

  • 查询GSI全局索引上的单个item,使用query
  • 查询同一个分区键的多个item,使用query
  • 查询不同分区键和排序键组合的多个项目,使用BatchGetItem
  • 仅在分区键上查找单个项目,使用GetItem

go第三方库:https://github.com/guregu/dynamo
Query:

  • RunWithContext()
  • AllWithContext()
  • CountWithContext()

GetItem:

  • OneWithContext()

mongodb

  1. 定义:
    索引是一个数据结构,它包含了表中某个或多个字段的值以及指向这些值对应的实际数据位置的引用。它类似于书籍的目录,允许数据库系统快速查找特定数据而无需扫描整个数据集合。

  2. 用途:

  • 提高查询性能
  • 加速排序
  • 唯一性约束
  1. 工作原理:
    索引通常是B树或B树的变种。当创建索引时,MongoDB会在指定的字段上构建索引数据结构,以存储值和对应的数据位置引用。在查询时,MongoDB可以使用索引来快速定位并检索数据。

  2. 关键概念:

  • 单字段索引:基于单个字段创建的索引。
  • 复合索引:基于多个字段创建的索引,可以包含多个字段的组合。
  • 唯一索引:确保索引字段的值在集合中是唯一的。
  • 文本索引:用于全文搜索的特殊索引。
  • 过期索引(ttl):定期检查该字段的时间戳

redis

数据类型

Redis 几种数据类型及应用场景 - 掘金
String 普通存储 适合存单value eg:粉丝数
hash 特别适合存储 value是map 适合存struct eg:用户信息对象
List 双向链表与消息队列 eg:粉丝列表
set 无序排重列表 eg:所有粉丝求共同关注
zset 提供score进行自动排序 eg:按时间取最新数据

幂等性

幂等方法是指可以使用相同参数重复执行,并能获得相同结果的函数。
保证函数不被重复执行
应用场景:多次重复点击购买商品
下面代码保证了只有第一次会设置键的值

func main() {
        ...
        // 检查幂等性的 Lua 脚本
        script := `
        if redis.call('exists', KEYS[1]) == 0 then
            redis.call('set', KEYS[1], ARGV[1])
            return 1
        else
            return 0
        end
        `
        // 执行 Lua 脚本
        result, err := client.Eval(ctx, script, []string{key}, value).Result()
        if err != nil {
                fmt.Println("Error:", err)
                return
        }
}

elastic

go-elastic的写入、读取、查询方法

写入:BodyString(),BodyJson()
读取:cookie:searchAfter(LastSortMap)
fetchSource(true):默认true,查询结果将包括源文档的内容
fetchSource(false):仅可以访问文档的ID和排序信息

bool查询:允许组合多个查询条件,包括 must、should、must_not 等
must:必须包含
should:任意一个包含

query = query.Must(elastic.NewBoolQuery().Should(
    elastic.NewBoolQuery().Must(elastic.NewMatchQuery("xxx", 1), elastic.NewMatchQuery("uid", uid)),
    elastic.NewBoolQuery().MustNot(elastic.NewMatchQuery("xxx", 1)),
).MinimumShouldMatch("1"))

elastic的查询语法

GET hot_recommend/_search
{
  "query":{
      "match": {
        "creator" : "2W0qxSLm95WkjPyerQ6h4rMCeAB",
              "ugcType": 1
      }
  },
    "sort": [
    {
      "updateTime": {
        "order": "desc"
      }
    }
  ]

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/110037.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java 进阶篇】Java HTTP 请求消息详解

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,广泛用于构建互联网应用。在Java中,我们经常需要发送HTTP请求来与远程服务器进行通信。本文将详细介绍Java中HTTP请求消息的各个部分,包括请求行、…

基于纵横交叉算法的无人机航迹规划-附代码

基于纵横交叉算法的无人机航迹规划 文章目录 基于纵横交叉算法的无人机航迹规划1.纵横交叉搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用纵横交叉算法来优化无人机航迹规划。 …

vscode 通过ssh 连接虚拟机vmware(ubuntu)

1.网络连接是否ping的通(ubuntu虚拟机使用的是net 连接方式) 2.配置环境 ubuntu 需要安装ssh server 服务 (1): 安装(Ubuntu安装ssh server) apt-get install openssh-server 检查是否ssh server 是否启动…

PostMan 之 Mock 接口测试

在测试的时候经常会碰到后端开发工程师的接口还没有开发完成,但是测试任务已经分配过来。没有接口怎么测试呢? 测试人员可以通过 mock server 自己去造一个接口来访问。mock server 可用于模拟真实的接口。收到请求时,它会根据配置返回对应的…

图解Kafka高性能之谜(五)

高性能的多分区、冗余副本集群架构 高性能网络模型NIO 简单架构设计: 详细架构设计: 高性能的磁盘写技术 高性能的消息查找设计 索引文件定位使用跳表的设计 偏移量定位消息时使用稀疏索引: 高响应的磁盘拷贝技术 kafka采用sendFile()的…

Linux:KVM虚拟化

本章操作基于centos7系统 简介 KVM是Kernel Virtual Machine的简写,目前Redhat只支持在64位的Rhel5.4以上的系统运行KVM,同时硬件需要支持VT技术。KVM的前身是QEMU,在2008年被redhat公司收购并获得了一项hypervisor技术,不过redh…

一文浅析Instagram网红经济为什么远远超出其他社媒平台

根据数据显示,网红营销市场规模在短短五年时间内从2016年的17亿美元增长至2022年的164亿美元,累计增速超过了712%。未来,有专家预计该市场预计将进一步增长,将在2023年突破210亿美元。这种惊人的增长趋势源于社交媒体的快速发展以…

SpringBoot整合Gateway 的Demo(附源码)

源码&#xff0c;可直接下载 Gateway模块 Gateway 的父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

【图像分类】基于计算机视觉的坑洼道路检测和识别(ResNet网络,附代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 本篇博文,我们将使用PyTorch深度学习框架搭建ResNet实现钢轨缺陷识别,附完整的项目代码和数据集,可以说是全网…

基于单片机的智能清洁小车设计—控制系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究的主要内容和目标二、总体方案设计2.1智能清洁小车的硬件系统组成2.2智能清洁小车的硬件结构图 三、 小车结构设计5.1基本布局和功能分析5.2小车二维及三维图小车三维图&#xff1a; 四、 原理图程序 五、…

JAVA反射机制及动态代理

反射机制 反射机制是什么 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c; 再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 2、Java属于先编译再运行的…

gurobi 安装/license激活 记录

前言&#xff1a;花了好久&#xff0c;被嫌弃惹ww&#xff0c;记录一下踩过的坑 至于为何没安装gurobi也能跑一段时间&#xff0c;直到显示需要license激活&#xff0c;还是未解之迷&#xff0c;需要教教。 首先这是官方给的gurobi license激活教程 我们一步步来复现吧&#…

Go命令行参数操作:os.Args、flag包

Go命令行参数操作&#xff1a;os.Args、flag包 最近在写项目时&#xff0c;需要用到命令行传入的参数&#xff0c;正好借此机会整理一下。 1 os.Args&#xff1a;程序运行时&#xff0c;携带的参数&#xff08;包含exe本身&#xff09; package mainimport ("fmt"&q…

cola架构:有限状态机(FSM)源码分析

目录 0. cola状态机简述 1.cola状态机使用实例 2.cola状态机源码解析 2.1 语义模型源码 2.1.1 Condition和Action接口 2.1.2 State 2.1.3 Transition接口 2.1.4 StateMachine接口 2.2 Builder模式 2.2.1 StateMachine Builder模式 2.2.2 ExternalTransitionBuilder-…

Spring中Bean的完整生命周期!(Bean实例化的流程,Spring后处理器,循环依赖解释及解决方法)附案例演示

Bean实例化的基本流程 加载xml配置文件&#xff0c;解析获取配置中的每个的信息&#xff0c;封装成一个个的BeanDefinition对象将BeanDefinition存储在一个名为beanDefinitionMap的Map<String,BeanDefinition>中ApplicationContext底层遍历beanDefinitionMap&#xff0c…

解决计算机msvcp120.dll文件丢失的5种方法,亲测有效

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。这个错误提示可能会给我们带来很大的困扰&#xff0c;影响我们的正常使用。本文将详细介绍msvcp120.dll丢失的原因、解决方法以及预防措施&#xff0c;帮助大家更好地…

3D LUT 滤镜 shader 源码分析

最近在做滤镜相关的渲染学习&#xff0c;目前大部分 LUT 滤镜代码实现都是参考由 GPUImage 提供的 LookupFilter 的逻辑&#xff0c;整个代码实现不多。参考网上的博文也有各种解释&#xff0c;参考了大量博文之后终于理解了&#xff0c;所以自己重新整理了一份&#xff0c;方便…

selenium工作原理和反爬分析

一、 Selenium Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一&#xff0c;支持并行测试执行。Selenium通过使用特定于每种语言的驱动程序支持各种编程语言。Selenium支持的语言包括C#&#xff0c;Java&#xff0c;Perl&#xff0c;PHP&#xff0c;Python和Ru…

Linux——Linux权限

Linux权限 前言一、shell命令以及运行原理二、Linux权限的概念Linux权限管理文件访问者的分类&#xff08;人&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;文件权限值的表示方法文件访问权限的相关设置方法 file指令目录的权限粘滞位 总结 前言 linux的学习…

基本微信小程序的体检预约小程序

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;体检预约系统小程序被用户普遍使用&#xff0c;为方便用户…