Linux-Ch10 缓存和容器

缓存技术和Redis简介

缓存:一种历史存储数据的技术,一般将数据存储到内存中,提供数据访问速度和系统性能。

用途:

  1. 临时保存数据
  2. 高性能需求

实现原理:内存Hash表

Redis简介:

  • 速度快
  • 存储数据的数据结构专门设计,O(1)
    1. 单线程
    2. 非阻塞I/O多路复用技术
  • 丰富的数据类型、原子性,支持事务、丰富的特性(分布式锁、持久化数据等)

Redis基本使用

Redis提供两种持久化方式:

  • RDB,即将redis的数据生成快照并存储到磁盘介质上
  • AOF,将redis执行过的指令记录下来,下次再重复执行一般,类似数据库回滚

缓存数据库双写一致性问题:redis只能保证最终一致性

  1. 设置一定过期时间,过期后会自动查询数据库
  2. 选取正确的更新策略,先更新数据库再更新缓存
  3. 删除缓存可能出现问题:将要删除的缓存的key放到消息队列中,不断重试直到成功

缓存雪崩问题:缓存数据同时大面积失效,请求都落在数据库上,数据库短时间内承受大量请求而崩溃

  1. 事前,保证redis集群的高可用性,发现宕机尽快补上,选择合适的内存淘汰策略
  2. 事中:本地ehcache缓存、hystrix限流&降级,避免MySQL崩溃
  3. 事后:redis持久化机制尽快恢复缓存

缓存穿透问题:故意请求缓存中不存在的数据,导致所有的请求集中到数据库上

  1. 利用互斥锁:缓存失效的时候,不能直接访问数据库,而是要先获取到锁
  2. 采用异步更新策略。无论Key是否取到值都返回,value值中维护一个缓存失效的时间,缓存如果过期,异步起一个线程读取数据库。
  3. 提供一个迅速判断请求是否有效的拦截机制:布隆过滤器:内部维护一系列有效的Key

缓存并发竞争问题:多线程对某个Key进行Set的时候,会出现数据不一致的情况:

  1. 多线程操作没有顺序要求:设置一个分布式锁,多个线程争夺,谁抢到谁先行
  2. incr命令
  3. 需要顺序的时候,设置一个消息队列,严格按照队列的先后执行命令

过期策略:随着数据增多,内存占用率会变高,必须为没有被访问的Key设置过期策略和内存淘汰机制,保证内存性能和占有率

  1. 定期删除
  2. 惰性删除
  3. 内存淘汰机制

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技术、用于部署大规模分布式应用的平台。