面试题答案
一键面试- 利用互斥机制保证数据一致性原理
- Mutex(互斥锁):当需要对缓存数据进行写操作时,通过获取Mutex锁来确保同一时间只有一个客户端能进行写操作,避免数据冲突。
- RWMutex(读写互斥锁):对于读操作,允许多个客户端同时进行,因为读操作本身不会改变数据状态,不会导致数据不一致。但当有写操作时,需要获取写锁,此时会阻止其他读操作和写操作,保证写操作的原子性。结合分布式系统特性,虽然每个节点可能有自己的缓存副本,但通过锁机制可以在局部节点上保证数据一致性,再通过合适的同步机制(如分布式共识算法等)来保证整个分布式系统的缓存数据一致性。
- 关键代码示例
package main
import (
"fmt"
"sync"
)
// Cache 代表缓存
type Cache struct {
data map[string]interface{}
mu sync.RWMutex
}
// Set 设置缓存数据
func (c *Cache) Set(key string, value interface{}) {
c.mu.Lock()
defer c.mu.Unlock()
if c.data == nil {
c.data = make(map[string]interface{})
}
c.data[key] = value
}
// Get 获取缓存数据
func (c *Cache) Get(key string) (interface{}, bool) {
c.mu.RLock()
defer c.mu.RUnlock()
if c.data == nil {
return nil, false
}
value, exists := c.data[key]
return value, exists
}
在上述代码中:
Cache
结构体包含一个map
用于存储缓存数据,以及一个sync.RWMutex
用于控制读写操作。Set
方法在写入数据时获取写锁(mu.Lock()
),确保同一时间只有一个客户端能进行写操作。Get
方法在读取数据时获取读锁(mu.RLock()
),允许多个客户端同时读。