xcache

package module
v0.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 27, 2020 License: Apache-2.0 Imports: 10 Imported by: 0

README

xcache缓存

介绍

  1. 本缓存模块是在freecache的理解的基础之上,以及内存的管理思想之上思考的一个cache框架。 本缓存分为两部分,第一部分是元数据的管理,元数据里面包括了大小,位置,过期时间,删除等信息,这个数据是无指针的数据,存储到map中,无指针的map不会被gc扫描 第二部分,是数据的管理,这部分的数据存储了key,value的数据。整个数据被分成了65535个桶,每个桶存储8bytes的数据。这样的话,所有的key value大小会进行桶计算, 然后存储到对应的桶里面。也就是说,同一个桶里面的数据,大小相差不超过8bytes。删除数据的时候,桶里面的数据不会被清理,只会做一个删除的标志,并把删除的标志放到 一个queue里面。下一次,如果来了新的存储的数据,先检查queue里面有没有多余的空间位置,有的话,直接获取数据,然后清空,并存储新的数据。如果删除的queue里面没有空间 那么,就申请一个桶对应的新的空间,然后存储进去,并获取一个位置。

  2. 每个桶里面的添加和删除会被计数,主要是为了检查活跃的桶,在后期数据清空的时候,先会清理不活跃的桶里面的数据,然后清理活跃的桶

  3. 元数据的存储,通过对key进行hash,然后获取uint32长度,然后分成一个65535*65535的一个matrix,里面存放元数据。 关于hash重复的处理,重复的元素放到了go-adaptive-radix-tree,这是一个前缀树的实现。检查的时候,会先判断go-adaptive-radix-tree是否有数据, 如果有的话,那么,就从go-adaptive-radix-tree取数据。go-adaptive-radix-tree里面只存放重复的数据,数据必然不会太多,所以,查询效率会高效很多。

  4. 本缓存模块对存储的key长度, 缓存大小, 缓存策略, 内存清理, 过期时间, 数据加载, 过期驱逐进行定义和描述

  5. 提供默认的大小长度限制, 并允许使用者自己设置最大的限制

Key长度限制

  1. 最小Key长度5
  2. 最大Key长度65535

缓存策略, 应该是插件

  1. 防止雪崩,让同一时刻缓存的时间做一下抖动处理,默认时间+随机时间(0,2s)
  2. 防止穿透,对于缓存不存在数据库也不存在的数据,缓存存储一个空值null,并设置极小的过期时间(2s)
  3. 防止击穿,如果并发访问不存在缓存数据, 会给数据库造成很大压力,那么,当发现数据不存在的时候,锁住对数据源的访问,其他的访问暂时等待,数据获取成功后,解开锁,其他访问正常
  4. 考虑过期数据 可以使用, 防止从数据库获取数据,等待时间过长。

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrXCache ...
	ErrXCache = xerror.New("xcache error")
	// ErrKeyNotFound ...
	ErrKeyNotFound = ErrXCache.New("key不存在")
	// ErrLength ...
	ErrLength = ErrXCache.New("数据超过了最大的长度限度或者小于最小的长度限度")
	// ErrBufSize ...
	ErrBufSize = ErrXCache.New("现有的缓存超过了最大的限度或者小于最小的限度")
	// ErrBufExceeded ...
	ErrBufExceeded = ErrXCache.New("现有的缓存超过了最大的缓存限制")
	// ErrExpiration ...
	ErrExpiration = ErrXCache.New("过期时间超过了最大的过期时间或者小于最小的过期时间")
	// ErrClearTime ...
	ErrClearTime = ErrXCache.New("定时清理过期缓存时间错误")
	ErrClearNum  = ErrXCache.New("定时清理过期缓存数量错误")
	// ErrDataLoadTime ...
	ErrDataLoadTime = ErrXCache.New("数据加载函数时间设置错误")
	// ErrDataLoadTimeout...
	ErrDataLoadTimeout = ErrXCache.New("数据加载超时")
)

Functions

func Delete

func Delete(k []byte) error

func Get

func Get(k []byte) ([]byte, error)

func GetSet

func GetSet(k []byte, v []byte, e time.Duration) ([]byte, error)

func GetWithDataLoad

func GetWithDataLoad(k []byte, e time.Duration, fn ...func(k []byte) (v []byte, err error)) ([]byte, error)

func Init

func Init(opts ...Option) error

func New

func New(opts ...Option) (*xcache, error)

New ...

func Set

func Set(k []byte, v []byte, e time.Duration) error

Types

type IXCache

type IXCache interface {
	Set(k, v []byte, e time.Duration) error
	Get(k []byte) ([]byte, error)
	GetSet(k, v []byte, e time.Duration) ([]byte, error)
	GetWithDataLoad(k []byte, e time.Duration, fn ...func(k []byte) (v []byte, err error)) ([]byte, error)
	Delete(k []byte) error
	DeleteExpired() error
	Init(opts ...Option) error
	Option() Options
}

ICache

type MemClearStrategy

type MemClearStrategy uint8

type Option

type Option func(o *Options)

Option 可选配置

func WithBreakdownStrategy

func WithBreakdownStrategy(breakdownStrategy func([]byte, []byte, time.Duration) ([]byte, time.Duration)) Option

func WithClearNum

func WithClearNum(clearRate float32) Option

func WithClearTime

func WithClearTime(clearTime time.Duration) Option

WithClearTime ...

func WithDataLoadTime

func WithDataLoadTime(mataLoadTime time.Duration) Option

WithDataLoadTime ...

func WithDefaultExpiration

func WithDefaultExpiration(defaultExpiration time.Duration) Option

WithDefaultExpiration ...

func WithMaxDataSize

func WithMaxDataSize(maxDataSize int) Option

WithMaxDataSize ...

func WithMaxExpiration

func WithMaxExpiration(maxExpiration time.Duration) Option

WithMaxExpiration ...

func WithMinBufSize

func WithMinBufSize(minBufSize int) Option

WithMinBufSize ...

func WithMinDataSize

func WithMinDataSize(minDataSize int) Option

WithMinDataSize ...

func WithMinExpiration

func WithMinExpiration(minExpiration time.Duration) Option

WithMinExpiration ...

func WithPenetrateStrategy

func WithPenetrateStrategy(penetrateStrategy func(k []byte, fn ...func(k []byte) ([]byte, error)) ([]byte, error)) Option

func WithSnowSlideStrategy

func WithSnowSlideStrategy(snowSlideStrategy func(expired time.Duration) time.Duration) Option

type Options

type Options struct {
	DefaultExpiration time.Duration
	MinExpiration     time.Duration
	MaxExpiration     time.Duration

	MinBufSize int
	MaxBufSize uint32

	MinDataSize int
	MaxDataSize int
	MaxKeySize  int

	DataLoadTime time.Duration
	ClearTime    time.Duration
	ClearRate    float32
	Delimiter    string
	// 定期清理时间
	Interval time.Duration

	// 防止雪崩策略
	SnowSlideStrategy func(expired time.Duration) time.Duration
	// 防止穿透策略
	PenetrateStrategy func(k []byte, fn ...func(k []byte) ([]byte, error)) ([]byte, error)
	// 防止击穿策略
	BreakdownStrategy func([]byte, []byte, time.Duration) ([]byte, time.Duration)
}

Options 缓存配置变量

func GetOption

func GetOption() Options

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL