用map+lock实现redis缓存

本文介绍了如何在高并发场景下,利用Go语言的Map和锁机制实现一个简单的内存缓存系统,以替代Redis,达到减轻数据库压力的目的。缓存系统包括初始化、存取、删除和清空等基本操作,通过加锁确保了数据一致性。
摘要由CSDN通过智能技术生成

map + lock 实现 Redis缓存

·高并发的瓶颈就是数据库· 写这些只为笔记,不想被动收录

项目生产中 Redis 是最常用的,主要用与存放客户经常会访问的一些数据到内存里,从而减轻数据库的压力。根据需要获取你的系统不需要redis来增大开销,使用map+locak实现redis的主要功能是最好的选择.

//cache.go

var Cache *CacheMap

//初始化
func CacheInit() {
	if Cache == nil {
		Cache = NewCacheMap()
	}
}

//存放
func CachePut(key string, obj interface{}) {
	if obj == nil {
		return
	}
	CacheInit()
	Cache.Set(key, obj)
}

//按键获取
func CacheGet(key string) interface{} {
	CacheInit()
	return Cache.Get(key)
}

//按键获取 string
func CacheGetString(key string) string {
	CacheInit()

	v := Cache.Get(key)
	if v == nil {
		return ""
	}

	return v.(string)
}

//按键获取对象
func CacheGetObjt(key string) interface{} {
	CacheInit()
	return Cache.Get(key)
}

//清空
func CacheClear() {
	CacheInit()
	Cache.Clear()
}

//按键删除
func CacheClearKey(key string) {
	CacheInit()

	for k := range Cache.GetAllData() {
		if strings.HasPrefix(k.(string), key) {
			Cache.Delete(k.(string))
		}
	}
}

/***   缓存 声明   ***/
type CacheMap struct {
	lock *sync.RWMutex
	m    map[interface{}]interface{}
}

//新建缓存
func NewCacheMap() *CacheMap {
	
	return &CacheMap{
		lock: new(sync.RWMutex),
		m:    make(map[interface{}]interface{}),
	}
}

//获取缓存
func (cache *CacheMap) Get(k interface{}) interface{} {

	cache.lock.RLock()
	defer cache.lock.RUnlock()

	if val, ok := cache.m[k]; ok {
		return val
	}

	return nil
}

//开始缓存
func (cache *CacheMap) Set(k interface{}, v interface{}) bool {

	cache.lock.Lock()
	defer cache.lock.Unlock()

	if val, ok := cache.m[k]; !ok {
		cache.m[k] = v
	} else if val != v {
		cache.m[k] = v
	} else {
		return false
	}

	return true
}

// 如果缓存已经存在就返回true
func (cache *CacheMap) Check(k interface{}) bool {

	cache.lock.RLock()
	defer cache.lock.RUnlock()

	if _, ok := cache.m[k]; !ok {
		return false
	}
	return true

}

//删除一条数据
func (cache *CacheMap) Delete(k interface{}) {
	cache.lock.Lock()
	defer cache.lock.Unlock()

	delete(cache.m, k)
}

//获取所有缓存数据
func (cache *CacheMap) GetAllData() map[interface{}]interface{} {

	cache.lock.Lock()
	defer cache.lock.Unlock()

	result := make(map[interface{}]interface{})
	for k, v := range cache.m {
		result[k] = v
	}

	return result
}

//清空缓存
func (cache *CacheMap) Clear() {

	cache.lock.Lock()
	defer cache.lock.Unlock()

	cache.m = make(map[interface{}]interface{})

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值