Redis 过期删除策略
当数据库中的键过期时,会如何删除?
- 定时删除,当键的时间一到,立即执行删除,对内存友好,对CPU时间不友好
- 惰性删除,当获取该键时,判断是否过期进行删除,对内存不友好,对CPU时间友好
- 定期删除,隔一段时间进行检测过期键,然后删除。是前两种策略的结合,需要根据项目情况,把握好发生频率和时长。
Redis 使用的是 惰性删除 和 定期删除,在一段时间内对数据库进行抽样检查,如果检查时间上限一到就停止。之后再次触发时,接着上一次的数据库继续进行。
当数据库中的键过期时,会如何删除?
Redis 使用的是 惰性删除 和 定期删除,在一段时间内对数据库进行抽样检查,如果检查时间上限一到就停止。之后再次触发时,接着上一次的数据库继续进行。
gorountine
切换时间来实现“同时”运行,在并行则是利用多核实现多线程的运行,通过通信共享内存
1 | func Go(){ |
反射可以提高程序的灵活性,使得 interface() 有更大的发挥余地,反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息,将匿名字段作为独立字段。
修改对象状态的前提是 interface.data 是 settable , 即 pointer-interface
通过反射可以动态调用方法
Go 中虽然没有class
,但依旧有method
,通过显示说明receiver
来实现与某个类型的组合,只能为同一个包中的类型定义方法,receiver
可以是类型的值或指针。
method
不存在方法重载,可以是使用值或指针来调节方法,编译器会自动完成转换,从某种意义上来说,方法是函数的语法糖,因为receiver
其实就是方法所接收的第一个参数(Method Value vs Method Expression)
如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法,类型别名不会拥有底层类型所附带的方法。
方法可以待用结构中的非公开字段
接口是一个或多个方法签名的集合,只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明了实现了哪个接口,这称为 Structural Typing
接口只有方法声明,没有实现,没有数据类型
接口可以匿名嵌入其他接口,或嵌入结构中
将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态 ,也无法获取指针
只有当接口存储的类型和对象都为 nil 时,接口才等于 nil
接口调用不会做 receiver 的自动转换
接口同样支持匿名字段方法
接口可实现类型 OOP 中的多态
空接口可以作为任何类型数据的容器
Go 中的struct
与 C 中的 struct
非常相似,并且 Go 没有 class 。使用 type<Name> struct{}
定义结构,名称遵循可见性规则。
map
的值==
与!=
比较运算符,但是不支持>
和<
类似其他语言中的哈希表或者字典,以key-value
形式存储数据,key
必须是支持==
或者!-
比较运算的类型,不可以是函数,map
或者slice
。
Map
查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍。
Map
使用make()
创建,支持:=
简写方式
make([keyType]valueType, cap)
,其中cap
表示容量,可省略
超出容量时会自动扩容,但尽量提供一个合理的初始值
键值对不存在时会自动添加,使用delete()
删除某键值对
使用for range
对map
和slice
进行迭代操作