第一天:golang本地缓存简要总结和协程相关知识汇总
前言
1、golang本地缓存总结
2、golang协程知识汇总
1.本地缓存技术需求
(1)是否支持数据过期处理
(2)数据回收策略
(3)数据灾容处理机制
2.选择开源项目还是自己开发
github拥有众多现成的本地缓存解决方案,这些方案涉及的项目已经被众多开发人员使用到实际生产环境中去,这些项目经过开发完善,满足了许多需求,支持数据的过期处理,拥有LRU LFU等数据回收策略。为了完成开发任务,选择这些开源项目并运用到生产中必然是个不错的选择,但是每种项目所使用的缓存方案互不相同,实际生产对本地缓存的技术需求也有不同,所以如何选择这些开源项目并进行改进十分重要,根据这些缓存方案自己实现本地缓存同样可行。
3.开源项目选择
以下本地缓存开源项目均来自github:
freecache
bigcache
fastcache
offheap
groupcache
对比项 | freecache | bigcache | fastcache | offheap | groupcache |
---|---|---|---|---|---|
使用场景 | 高并发,多读少写 | 高并发,多读少写 | 高并发,多读少写 | 高并发,多读少写 | 高并发,多读少写 |
star数量/.fork数量 | 高 | 高 | 高 | 少 | 高 |
支持数据过期处理 | 是 | 是 | 否 | 否 | 是 |
淘汰策略 | lru | fifo | fifo | 不支持 | lru |
gc回收 | zero gc | zero gc | zero gc | zero gc | go gc |
建议 | 使用 | 使用 | 使用 | 不使用 | 使用 |
1.进程与线程的关系
进程是程序的一次运行过程,线程是更小的运行单位,一个进程对应多个线程,一个进程拥有唯一的进程标识符,内存,资源状态,一个进程的所有线程共享进程的内存,但是自己独占一个栈内存,进程和线程切换均需要操作系统从用户态转为内核态,这个过程叫作上下文切换,线程切换时,操作系统会记住上一个线程的状态,栈内存,指令运行位置等等资源信息。
为什么编程推荐多线程而不是多进程?
1、多进程占用更多的内存,多线程共享进程内存空间,一定程度上减少内存的消耗,2、线程切换消耗小于进程切换,进程切换最大的问题在于其内存地址发生变化,所以操作系统需要重新读入新进程的快表到寄存器,导致缓存失效,当然新版本操作系统通过应用快速上下文切换技术解决了这个问题。
2.线程与协程的关系
接下来从调度方式,切换速度,调度策略,栈大小四个方面比较这两者
(1)调度方式
通过go协程管理器可以调度协程到线程上运行,协程与线程的对应关系为M:N,多对多关系,一个线程可以运行多个协程(需要队列切换),一个协程可以在多个线程上切换运行,
(2)切换速度
协程是用户态的,无需用户态到内核态转换,比线程更快,据统计,线程切换平均时间为1~2微秒,协程切换时间为0.2微妙。
(3)调度策略
线程是抢占式的,操作系统可以通过强制中断切换线程,即使某个线程未执行完成,也会被切换,但是协程是协作式的,一个协程会尽可能在执行完成后退出执行下一个协程。
(4)栈大小
golang中一个线程的栈大小为2mb,不可扩容,一个协程的初始大小为2kb,可以不断扩容。
今天学习总结了golang本地缓存的使用方案选型策略,协程,线程,进程三者在golang语言使用中的具体差别,接下来继续学习其他知识点,对golang语言生态有个更深的认识。