几个常用的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"
      }
    }
  ]

}
相关推荐
南墙上的石头1 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画2 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc2 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t3 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波3 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql
落叶-IT4 小时前
Java异常处理深度实战教程:异常传播的失败场景分析
数据库·oracle
执子手 吹散苍茫茫烟波5 小时前
常见的数据库隔离级别以及企业里常用的是什么方案
数据库
Database_Cool_5 小时前
数据库慢查询优化首选方案:阿里云 RDS 性能洞察+自动诊断
数据库·人工智能·阿里云
YOU OU5 小时前
Redis初识
数据库·redis·缓存
长孙豪翔6 小时前
在.net中读写config文件的各种方法
java·数据库·.net