栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用map+lock实现redis缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用map+lock实现redis缓存

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{})

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/681045.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号