Linux-Ch10
Linux-Ch10 缓存和容器
缓存技术和Redis简介
缓存:一种历史存储数据的技术,一般将数据存储到内存中,提供数据访问速度和系统性能。
用途:
- 临时保存数据
- 高性能需求
实现原理:内存Hash表
Redis简介:
- 速度快
- 存储数据的数据结构专门设计,O(1)
- 单线程
- 非阻塞I/O多路复用技术
- 丰富的数据类型、原子性,支持事务、丰富的特性(分布式锁、持久化数据等)
Redis基本使用
Redis提供两种持久化方式:
- RDB,即将redis的数据生成快照并存储到磁盘介质上
- AOF,将redis执行过的指令记录下来,下次再重复执行一般,类似数据库回滚
缓存数据库双写一致性问题:redis只能保证最终一致性
- 设置一定过期时间,过期后会自动查询数据库
- 选取正确的更新策略,先更新数据库再更新缓存
- 删除缓存可能出现问题:将要删除的缓存的key放到消息队列中,不断重试直到成功
缓存雪崩问题:缓存数据同时大面积失效,请求都落在数据库上,数据库短时间内承受大量请求而崩溃
- 事前,保证redis集群的高可用性,发现宕机尽快补上,选择合适的内存淘汰策略
- 事中:本地ehcache缓存、hystrix限流&降级,避免MySQL崩溃
- 事后:redis持久化机制尽快恢复缓存
缓存穿透问题:故意请求缓存中不存在的数据,导致所有的请求集中到数据库上
- 利用互斥锁:缓存失效的时候,不能直接访问数据库,而是要先获取到锁
- 采用异步更新策略。无论Key是否取到值都返回,value值中维护一个缓存失效的时间,缓存如果过期,异步起一个线程读取数据库。
- 提供一个迅速判断请求是否有效的拦截机制:布隆过滤器:内部维护一系列有效的Key
缓存并发竞争问题:多线程对某个Key进行Set的时候,会出现数据不一致的情况:
- 多线程操作没有顺序要求:设置一个分布式锁,多个线程争夺,谁抢到谁先行
- incr命令
- 需要顺序的时候,设置一个消息队列,严格按照队列的先后执行命令
过期策略:随着数据增多,内存占用率会变高,必须为没有被访问的Key设置过期策略和内存淘汰机制,保证内存性能和占有率
- 定期删除
- 惰性删除
- 内存淘汰机制
Redis原理和数据结构
**Redis字符串:**最常用的数据类型,被称为简单动态字符串(SDS),底层采用字节数组方式
**List数据类型:**底层采用quicklist(快速列表),快速列表在压缩列表和双端列表基础上发展而来
- **ziplist:压缩列表:**由一系列特殊编码的连续内存块组成的顺序型数据结构,每一个节点之间没有指针的指向,而是多个元素相邻
- linkedList:双端列表
**Hash数据类型:**底层采用ziplist和hashtable两种方式
**Set数据类型:**底层采用intset和hashtable两种方式
**Zset数据类型:**为SortedSet有序集合,底层实现采用ziplist和skiplist两种方式
容器技术简介
Docker是目前容器技术理论的主流实现方式,是一个用于构建、运行、传送应用程序的平台
基本原理和概念:
- 镜像image:一个只读的模板,用于创建container
- 容器container:一个镜像的实例,提供一个独立的可移植的运行环境
- 仓库registry:储存Docker镜像的地方,Dockerhub
- Docker daemon:安装好后会启动Docker daemon守护进程作为Server
- Docker Client:在Docker Client中通过各种命令对Docker进行操作
Kubernetes:基于Docker技术、用于部署大规模分布式应用的平台。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 星辰微光的博客!



