当前位置: 首页 > wzjs >正文

个人在国外网站做电商品牌公关具体要做些什么

个人在国外网站做电商,品牌公关具体要做些什么,网站开发合同文档,手机网站功能map map结构 一个map由多个桶构成,每个桶有8个槽位,每个槽位放一个键值对,哈希函数计算出来桶号和槽位号,如槽位被占了则顺序放置,如果满了则创建一个溢出桶放里面。查找就是算出桶和槽位去找,找不到就遍…

map

map结构

一个map由多个桶构成,每个桶有8个槽位,每个槽位放一个键值对,哈希函数计算出来桶号和槽位号,如槽位被占了则顺序放置,如果满了则创建一个溢出桶放里面。查找就是算出桶和槽位去找,找不到就遍历桶链表。

Go 的 map 是由多个桶(bucket)组成的哈希表结构,每个桶有 8 个槽位(slot),每个槽位存一个 key-value 对。

哈希函数的低位决定数据落在哪个桶,哈希的高位(tophash)帮助定位桶内的槽位。如果槽位被占就顺序查找空位。

如果主桶满了,就分配 溢出桶(overflow bucket),多个桶通过指针串联成链表。

查找时,从主桶开始线性扫描所有槽位,没找到就继续沿 overflow 链遍历,直到找到或链尾。

并发安全

map不能并发使用,如果并发使用需要进行一些处理。

有三种解决方法:1. 使用系统锁(sync.Mutex或sync.RWMutex等);2. 使用sync.Map系统给的安全map;3.使用第三方安全map(分片锁)。

使用系统锁

最常用的方式,go主流框架里面也基本上是用这个方法,一般用的是sync.RWMutex性能好一点;下面是使用Mutex的例子(真实项目代码):

var g errgroup.Group
var mu sync.Mutex // 仍然需要锁
m := make(map[int]string)for i, query := range funArray {index := ig.Go(func() error {s, err := query(univCode)if err != nil {return fmt.Errorf("查询失败: %v", err)}mu.Lock()    // 加锁defer mu.Unlock() // 延迟解锁m[index] = *s // 安全写入return nil})
}

原因:(哪怕index是唯一的)多个 goroutine 同时调用 m[index] = *s 仍然可能导致 map 内部状态损坏,进而引发 panic 或数据不一致。

分片锁是什么?

分片锁是一种 将数据分片,每个分片独立加锁 的并发控制技术。
核心思想:通过减少锁的粒度,降低多线程竞争,提高并发性能。

  • 传统全局锁:所有操作竞争同一把锁(如 sync.Mutex 包裹整个 map)。
  • 分片锁:将数据分成多个块,每个块有自己的锁,线程只需竞争当前操作的块的锁。
// 示例:分片数为 16 的线程安全 map
type ShardedMap struct {shards [16]map[string]interface{}  // 分片数组locks  [16]sync.RWMutex            // 每个分片对应的锁
}// 根据 key 计算分片位置
func (m *ShardedMap) getShard(key string) int {hash := fnv32(key)  // 哈希函数return int(hash) % len(m.shards)
}

二、sync.Map的实现、锁机制和与Go锁的区别

sync.Map

(一)sync.Map的实现
  1. 基本结构
    • sync.Map是一个并发安全的map。它内部维护了一个哈希表,用于存储键值对。和普通map相比,它主要是为了在并发场景下安全地读写数据。
    • 它使用了分段锁(sharded lock)的机制来实现并发控制。将哈希表分为多个段(segment),每个段有自己的锁。这样可以减少锁的粒度,提高并发性能。
  2. 存储和读取过程
    • 在存储键值对时,根据键的哈希值确定存储的段,然后在该段的哈希表中存储键值对。
    • 读取时,也是先根据键的哈希值找到对应的段,然后在该段的哈希表中查找键值对。例如,syncMap.Load("apple")会先找到“apple”对应的段,然后在该段中查找“apple”键对应的值。
(二)锁机制
  1. 锁的类型
    • sync.Map内部使用了互斥锁(mutex)来保护每个段的数据。当对某个段进行写操作(如插入、删除键值对)时,会获取该段的锁;读操作(如查找键值对)也可以获取锁,不过在某些情况下,读操作可以不获取锁,以提高性能。
  2. 锁的作用
    • 锁的作用是保证在并发环境下,对同一个段的操作不会出现数据竞争。例如,当一个线程正在向某个段的哈希表中插入一个键值对时,另一个线程不能同时对该段进行修改操作,否则可能会导致数据不一致。
(三)与Go锁的区别
  1. 锁的粒度
    • Go的sync.Mutex是一个全局锁,它会锁定整个数据结构。而sync.Map使用的是分段锁,锁的粒度更细。例如,对于一个普通的map,如果多个线程同时访问它,可能会因为全局锁而导致性能瓶颈;而sync.Map的分段锁可以让多个线程同时访问不同的段,提高并发性能。
  2. 使用场景
    • sync.Mutex适用于简单的并发控制场景,当需要保护一个共享资源(如一个变量、一个简单的数据结构等)时使用。而sync.Map是专门针对键值对存储的并发场景设计的,它封装了锁的细节,让开发者可以方便地在并发环境下安全地使用map。
http://www.dtcms.com/wzjs/161112.html

相关文章:

  • 文山专业网站建设哪家好如何建立自己的网络销售
  • 福州专业网站建设服务商站长工具介绍
  • 做网站与做app哪个容易定制网站建设
  • 论述三种常见的网络营销方式杭州seo博客
  • 网站备案跟做哪个推广有关系吗接广告推广
  • 做网站会遇到哪些问题建网站需要多少钱
  • 本地生活服务网站怎么做今晚比分足球预测
  • 重庆建设工程交易中心官网zac博客seo
  • 微信内转发的网页怎么制作沈阳百度seo
  • 很长的网站域名怎么做短曼联目前积分榜
  • wordpress调用分类和文章aso优化什么意思是
  • 西安网站制作顶尖公司友情链接翻译
  • 北京南站在哪个区哪个街道好用的百度网盘搜索引擎
  • 要建设一个网站需要准备些什么2020年百度搜索排名
  • 黑龙江新闻联播历年片头唐山seo排名优化
  • 网站租用域名注册哪个网站好
  • 福州疫情最新消息seo优化步骤
  • 图图网百度网站怎么优化排名靠前
  • wordpress 作品集 相册淄博seo怎么选择
  • 网站建设产品培训注册域名后如何建立网站
  • c 做网站seo关键词seo排名公司
  • 别人做的网站怎么seo优化链接买卖价格
  • 有代码怎么做网站网站页面优化方案
  • 安徽合肥中国建设银行网站首页虎扑体育网体育
  • 沈阳网站建设方法百度一下你就知道了百度
  • wordpress 数据库备份插件长沙正规竞价优化服务
  • 局网站建设制度北京网络营销公司哪家好
  • 做网站推广销售怎么样郑州网站制作
  • 360游戏推广平台seo公司优化方案
  • 百度网站建设公司哪家好整站优化工具