Redis学习篇-3.30(Redis、MongoDB、Docker、K8s)

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!

目录

一、NoSQL简介

二、Redis

2.1、Redis介绍

2.2、Redis的基本知识

2.3、Redis的基本数据类型

2.4、Redis的特殊数据类型

2.5、事务

2.6、Redis持久化

2.7、Redis消息队列

2.8、Redis集群

2.9、Redis的缓存命中率问题

三、MongoDB

3.1、mongoDB概述

3.2、springBoot整合MongoDB

四、Docker

4.1、docker概念

4.2、Docker相关指令

五、K8s

5.1、Docker与K8s

5.2、K8s概述

5.3、Kubernetes指令


一、NoSQL简介

NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库。Nosql这个技术门类,早期就有人提出,发展至2009年趋势越发高涨。

NoSQL相对于传统的关系型数据库,有如下优点:

(1)方便扩展(数据之间没有关系,很好拓展)
(2)大数据量高性能(Redis一秒钟写8万次,读取11万)
(3)数据类型是多样性的(不需要事先设计数据库,随取随用)
(4)传统RDBMS和NoSQL

我们常用的非关系型数据库主要是redis和mongoDB,其中redis是键值对类型的,mongoDB是文档型的。

二、Redis

参考链接:Redis学习篇

2.1、Redis介绍

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
 

redis一般用来做什么呢,一般主要有以下功能:

1、内存存储、持久化,内存中的数据是断电即失的,所以持久化很重要(RDB、AOF)
2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量)

redis的特性包括如下几点:

1、多样的数据类型
2、持久化
3、集群
4、事务

2.2、Redis的基本知识

redis默认有16个数据库,DB0~DB15,默认使用的是第0个数据库,可以使用select切换数据库。可以使用Another Redis Desktop Manager可视化软件管理管理redis。

Redis的速度很快,那么Redis为什么那么快呢?

Redis是基于内存操作的,是单线程的,CPU不是Redis的性能瓶颈。Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程,就使用单线程了!

redis是将全部数据放在内存中,所以使用单线程去操作效率就是最高的,对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上。

2.3、Redis的基本数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis 支持多种数据类型,每种数据类型都有其特定的应用场景。以下是 Redis 支持的数据类型及其应用场景:

  1. 字符串(String):用于存储字符串、整数和浮点数等简单值,经常用于缓存、计数器、分布式锁等场景。

  2. 列表(List):用于存储一系列有序的字符串值,支持从两端插入和弹出元素,常用于消息队列、任务队列等场景。

  3. 集合(Set):用于存储一组无序且唯一的字符串值,支持交、并、差集等操作,常用于统计独立访客数、用户标签等场景。

  4. 有序集合(Sorted Set):与集合类似,但每个成员都关联一个分数,可以按照分数排序,支持范围查询和排名等操作,常用于排行榜、计分系统等场景。

  5. 哈希(Hash):用于存储键值对的无序散列表,支持单个字段读写和批量读写等操作,常用于存储对象、用户信息等场景。

根据具体场景需要,可以选择合适的数据类型来存储和处理数据。在实际使用中,还可以将多种数据类型结合起来进行复杂的数据处理,例如使用 List 和 Hash 存储多个对象,并通过 Set 和 Sorted Set 进行快速查找和排序。

2.4、Redis的特殊数据类型

1.Geospatial(地理位置)

Geospatial 数据类型可以存储地理位置坐标,并支持对位置进行距离计算、范围查询和邻近查询等操作。这种数据类型常用于实现地图应用、附近的人功能、基于地理位置的推荐系统等场景。

2.HyperLogLog(基数)

HyperLogLog 数据类型用于统计大量数据的基数(即不重复元素的数量),并具有空间效率高、精度可调的特点。这种数据类型常用于统计网站独立访客数、用户留存率、广告点击率等场景。

3.Bitmaps(位图)

Bitmaps 数据类型可以存储二进制位数组,并支持对位数组进行逻辑运算,例如 AND、OR、NOT 等操作。这种数据类型常用于统计用户活跃度、用户行为分析等场景。

举例来说:

  1. Geospatial 应用场景:一个餐厅订餐平台需要查询附近的外卖店家,可以将每个店家的经纬度信息存储在 Redis 的 Geospatial 数据类型中,并使用 ZRANGEBYSCORE 命令查询指定地点周围一定距离范围内的店家。

  2. HyperLogLog 应用场景:一个社交网络需要统计每天有多少独立访问用户,可以使用 Redis 的 HyperLogLog 数据类型来估算网站的独立访客数,从而评估网站的流量质量。

  3. Bitmaps 应用场景:一个电商平台需要统计每个用户在一段时间内的页面访问情况,可以将每个用户对应的位数组存储在 Redis 的 Bitmaps 数据类型中,并使用位运算命令进行数据分析,例如 BITCOUNT 命令计算活跃用户数量、BITOP 命令计算两个时间段内的新增用户数量等。

2.5、事务

Redis事务的本质:一组命令的集合!一个事务中所有命令都会被序列化,在事务执行的过程中,会按照顺序执行。

Redis 支持事务的功能,可以将一系列命令打包成一个执行单元,并保证这个执行单元要么全部执行成功,要么全部不执行。Redis 的事务使用 MULTI、EXEC、DISCARD 和 WATCH 等命令来实现。

1.开启事务

开启事务需要使用 MULTI 命令,该命令会将客户端的事务状态设置为已开启,然后等待用户输入多条命令。在事务中,所有的命令只是被记录到一个暂存区中,而没有真正地执行。

2.执行事务

在事务中,用户可以输入任意多条 Redis 命令,这些命令都会被记录到暂存区中。当用户输入完所有命令后,执行事务需要使用 EXEC 命令,该命令会按照顺序执行暂存区中的所有命令,并返回每个命令的执行结果。

3.取消事务

在事务过程中,如果用户想要取消事务,可以使用 DISCARD 命令,该命令会清空暂存区中的所有命令,并将客户端的事务状态设置为未开启。

4.监视键

在事务过程中,如果用户想要在某个键发生变化时取消事务,可以使用 WATCH 命令,该命令会监视指定的键,并在其中任意一个键被修改时中止事务的执行。

Redis 的事务功能可以保证多个命令的原子性执行,但不支持回滚操作。如果在 EXEC 命令执行之前出现了错误,整个事务会被取消,并返回错误信息。因此,在使用 Redis 事务时需要特别注意异常情况的处理。

2.6、Redis持久化

Redis 提供了两种持久化方式,分别是 RDB(Redis DataBase)和 AOF(Append-Only File)。

1.RDB 持久化

RDB 是 Redis 的一种快照持久化方式,它会将 Redis 在某个时间点上的数据集保存到硬盘上的一个二进制文件中。RDB 持久化可以通过配置文件开启或关闭,并支持手动触发。当 Redis 服务器重启时,可以通过加载 RDB 文件来恢复服务器状态,从而提高 Redis 的启动速度和稳定性。但是,RDB 持久化存在数据丢失的风险,因为如果 Redis 进程在最后一次保存 RDB 文件之后崩溃,那么最近修改的数据将会丢失。

2.AOF 持久化

AOF 是 Redis 的一种追加日志持久化方式,它会将 Redis 执行的每一条写命令以追加的方式记录到一个日志文件中。AOF 持久化可以通过配置文件开启或关闭,并支持每秒自动保存或每条命令保存等多种策略。当 Redis 服务器重启时,可以通过读取 AOF 文件来重新执行所有写命令,从而保证数据的完整性和一致性。AOF 持久化相比 RDB 持久化更安全,但也更耗费系统资源,并可能导致 AOF 文件过于庞大,需要定期进行重写。

3.RDB 和 AOF 混合持久化

在某些场景下,可以同时使用 RDB 和 AOF 持久化方式,以充分利用它们各自的优点。例如,可以开启 RDB 持久化,每小时备份一次数据集,并开启 AOF 持久化,将所有写命令追加到 AOF 文件中,这样既能保证快速恢复数据集并提高 Redis 的启动速度,又能保证数据的安全性和完整性。总之,在使用 Redis 的持久化功能时,需要根据实际应用场景和系统资源情况选择合适的持久化方式,并进行合理的配置和管理。

2.7、Redis消息队列

Redis 可以用作轻量级的消息队列,通常采用 List 数据类型来实现。具体地,可以将生产者产生的消息插入到一个列表的尾部,然后将消费者从同一列表的头部取出消息进行处理。为了保证多个消费者之间的消息处理顺序和互斥性,可以使用 Redis 的阻塞命令 BLPOP 或 BRPOP 进行消息的弹出操作。

需要注意的是,Redis 的消息队列通常不支持消息的重新入队、消息的过期时间等高级特性,因此适合处理简单、低延迟的消息场景,例如任务分发、通知推送、日志记录等。如果需要更丰富的消息队列功能,可以考虑使用专业的消息队列中间件,例如 RabbitMQ、Kafka 等。

2.8、Redis集群

Redis集群是一种分布式系统,旨在提高Redis的可伸缩性和冗余性。其原理是将数据分散存储在多个节点上,使用哈希函数将数据映射到一个固定的槽位上,每个节点负责管理一部分槽位。客户端可以直接连接任意一个节点进行读写操作。

Redis集群的方法包括以下步骤:

  1. 初始化集群:启动多个Redis实例作为节点,使用命令行工具redis-trib.rb创建集群。

  2. 添加节点:向已有节点添加新节点,使其加入到集群中,并将一部分槽位分配给新节点。

  3. 故障转移:当某个节点故障时,Redis会自动将该节点的槽位转移到其他节点上,并选举出一个新的主节点来接管故障节点的工作。

  4. 扩容缩容:当需要扩容或缩容时,可以通过增加或减少节点来改变槽位的分配情况。

  5. 集群维护:监控节点状态、备份数据、定期清理过期数据等操作,确保集群的稳定运行。

注意事项:

  1. Redis集群最好采用奇数个节点,避免脑裂问题。
  2. Redis集群不支持单独对某个key进行操作,因为一个key可能被分配到多个节点上。
  3. Redis集群需要使用Redis客户端库的集群模式来连接。

2.9、Redis的缓存命中率问题

① 缓存穿透:大量请求根本不存在的key,请求根本不存在的资源(DB本身就不存在,Redis更是不存在)

解决方案:

对空值进行缓存 
使用布隆过滤器( 使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截)
② 缓存雪崩:redis中大量key集体过期(下文详解)

③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热点key过期)

缓存雪崩和缓存穿透解决方案:

        进行预先的热门词汇的设置,进行key时长的调整,热点数据预热是指在系统上线前,提前将一些热门数据加载到缓存中,以便在系统正式上线后就可以直接从缓存中获取这些数据,缓解系统上线后短时间内的访问压力,避免出现缓存击穿、缓存雪崩等问题。通过热点数据预热,可以有效地保证系统的稳定性和高可用性,提升系统的性能和响应速度。
       锁机制可以用来解决缓存击穿和雪崩问题。具体而言,可以在获取缓存数据之前,先尝试获取一个互斥锁,如果获取成功则表示当前是第一个请求,此时可以从数据库中加载数据到缓存中,然后释放锁。如果获取失败则表示其他请求正在进行缓存数据的加载,此时可以等待一段时间后重试或者直接返回默认值或错误提示。(当热点key过期,那么就使用锁机制防止大量的请求直接打在DB)

三、MongoDB

3.1、mongoDB概述

MongoDB是为快速开发互联网Web应用而设计的数据库系统。MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。MongoDB的数据模型是面向文档的, 所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。( BSON )
 

MongoDB中有如下三个概念:

数据库( database ):数据库是一个仓库,在仓库中可以存放集合。

集合( collection ):集合类似于数组,在集合中可以存放文档。

文档( document ):文档数据库中的最小单位,我们存储和操作的内容都是文档。

mongoDB的优势:

易扩展: NoSQL数据库种类繁多, 但是⼀个共同的特点都是去掉关系数据库的关系型特性。 数据之间⽆关系, 这样就⾮常容易扩展

⼤数据量, ⾼性能: NoSQL数据库都具有⾮常⾼的读写性能, 尤其在⼤数据量下, 同样表现优秀。 这得益于它的⽆关系性, 数据库的结构简单

灵活的数据模型: NoSQL⽆需事先为要存储的数据建⽴字段, 随时可以存储⾃定义的数据格式。 ⽽在关系数据库⾥, 增删字段是⼀件⾮常麻烦的事情。

3.2、springBoot整合MongoDB

参考这篇博客就可以:《SpringBoot篇》15.SpringBoot整合MongoDB超详细教程(包括安装教程)_springboot mongodb_陈老老老板的博客-CSDN博客

添加依赖,使用mongoDBTemplate模板就可以操作MongoDB数据。

四、Docker

4.1、docker概念

Docker是一个开源容器化平台,可以方便地打包、发布和运行应用程序。Docker的核心组件包括Docker Engine、Docker Hub和Docker Compose等。

  • Docker Engine:是Docker的核心组件,负责管理容器的生命周期,包括创建、启动、停止和删除容器等操作。Docker Engine也提供了一系列命令行工具来管理Docker容器。

  • Docker Hub:是Docker的官方镜像仓库,用户可以在其中搜索和下载各种预构建的Docker镜像,或者上传自己构建的镜像到Docker Hub进行分享。

  • Docker Compose:是Docker的多容器编排工具,可以通过一个YAML文件定义多个容器之间的关系和依赖,并快速启动、停止和删除多个容器。

使用Docker可以带来许多好处,例如:

  • 简化应用部署:将应用程序及其所需的依赖项封装在Docker容器中,使得应用程序可以在任何环境中运行,从而简化了应用部署过程。

  • 提高开发效率:Docker容器可以快速地创建和销毁,因此可以提高开发人员的测试和调试效率。

  • 提高系统安全性:Docker提供了沙箱环境来隔离容器,从而避免了应用程序之间的干扰和攻击。

总之,Docker是一个强大的工具,可以帮助开发人员快速构建、发布和管理应用程序,并提高应用程序的可移植性和安全性。

4.2、Docker相关指令

可以参考这篇博客:SpringCloud之微服务实用篇3-docker_nuist__NJUPT的博客-CSDN博客

下面是常用的Docker指令,并按照功能分类:

镜像相关

  • docker build: 根据Dockerfile构建镜像
  • docker images: 列出本地主机上的所有镜像。
  • docker rmi: 删除一个或多个本地镜像。
  • docker tag: 给镜像打标签

容器相关操作

  • docker run: 运行一个新的容器。可以指定镜像名称、容器名称、以及其他选项,例如挂载数据卷、端口映射等。
  • docker ps: 列出正在运行的容器。
  • docker stop: 停止一个或多个运行中的容器。
  • docker start: 启动一个或多个已经停止的容器。
  • docker restart: 重启一个或多个容器。
  • docker rm: 删除一个或多个已停止的容器。
  • docker exec: 在一个运行中的容器中执行命令。
  • docker logs: 查看一个容器的日志。
  • docker inspect: 查看容器的详细信息。

仓库相关操作

  • docker login: 登录到Docker Hub或者私有仓库。
  • docker push: 将本地镜像推送到远程仓库。
  • docker pull: 从远程仓库拉取镜像。

网络相关操作

  • docker network create: 创建一个新的Docker网络。
  • docker network ls: 列出Docker网络。
  • docker network inspect: 查看Docker网络的详细信息。
  • docker network connect: 将一个容器连接到指定的Docker网络。
  • docker network disconnect: 从Docker网络中断开一个容器。

数据卷相关操作

  • docker volume create: 创建一个新的Docker数据卷。
  • docker volume ls: 列出Docker数据卷。
  • docker volume inspect: 查看Docker数据卷的详细信息。
  • docker volume rm: 删除一个或多个Docker数据卷。
  • docker run -v: 挂载Docker数据卷到容器中。

以上是常用的Docker指令,还有很多其他的指令和选项,可以通过docker --help或者Docker官方文档来了解。

Docker中的数据卷是一种持久化存储的机制,用于在容器和主机之间共享数据。数据卷可以将主机文件系统中的目录或文件挂载到容器中,也可以将一个容器的数据卷挂载到另一个容器中。

使用数据卷的好处在于:

  • 与容器分离:容器可以被删除和重新创建,而数据卷可以保留下来,实现了数据的持久化。
  • 共享数据:多个容器可以使用同一个数据卷,从而实现数据的共享和协作。
  • 数据备份:数据卷可以备份到远程存储或者云端存储,从而实现数据的可靠性和容灾能力。

数据卷有两种类型:

  • 主机挂载:主机文件系统中的目录或文件会被挂载到容器中,容器中的文件修改会直接反映在主机上。
  • 容器挂载:一个容器的数据卷可以挂载到另一个容器中,从而实现容器之间的数据共享。

五、K8s

5.1、Docker与K8s

 Docker 是一个容器化平台,而 k8s 是 Docker 等容器平台的协调器。

Kubernetes(K8s)和Docker是两个不同的概念。Docker是一种容器化技术,用于将应用程序及其依赖项打包到一个可移植的容器中,并在不同的环境中运行。Kubernetes是一个容器编排平台,可以自动化部署、扩展和管理容器化应用程序。

尽管这两者是不同的概念,但它们之间有密切的关系。Kubernetes可以使用Docker或其他容器化技术来创建和运行容器。在Kubernetes中,Docker通常被用作默认的容器运行时。

Kubernetes与Docker的另一个关系是,它可以充分利用Docker的功能和特性,例如应用程序打包、镜像管理、容器网络、数据卷等。Kubernetes也提供了自己的功能和特性,例如集群管理、自动伸缩、健康检查、负载均衡等,以帮助用户更好地管理容器化应用程序。

总之,Kubernetes和Docker是互相补充的技术,通过它们的结合,可以实现高效、灵活和自动化的容器化应用程序部署和管理。

5.2、K8s概述

Kubernetes(通常称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Kubernetes最初由Google开发,并捐赠给了Cloud Native Computing Foundation(CNCF)来维护和推广。

Kubernetes提供了一系列的功能和特性,包括:

  • 自动化部署:Kubernetes可以自动地将容器部署到集群中,并对它们进行运行时环境的配置和管理。
  • 自动化扩展:Kubernetes可以根据负载情况自动伸缩应用程序,从而保证应用程序的可靠性和性能。
  • 健康检查和自愈机制:Kubernetes会定期检查应用程序的健康状态,并在出现故障时自动恢复容器。
  • 负载均衡:Kubernetes支持多种负载均衡方式,包括Round Robin、Session Affinity等。
  • 网络管理:Kubernetes可以自动管理容器网络,允许多个容器之间进行通信和数据共享。
  • 存储管理:Kubernetes可以管理持久化存储和数据卷,从而实现数据的持久化和共享。
  • 配置管理:Kubernetes可以通过ConfigMap和Secrets来管理应用程序的配置信息和敏感信息。

Kubernetes采用了分层架构,其中包括:

  • Kubernetes API Server:负责提供API服务和接收来自客户端的请求。
  • etcd:一个分布式键值存储,用于存储Kubernetes集群的状态信息。
  • Kubernetes Controller Manager:负责管理控制器并监视Kubernetes集群的状态。
  • Kubernetes Scheduler:负责将容器调度到可用的节点上运行。
  • Kubernetes Kubelet:负责在节点上启动容器并与Kubernetes API Server进行通信。
  • Kubernetes Container Runtime:负责运行容器,通常使用Docker或者rkt等容器运行时。

总之,Kubernetes是一个非常强大和灵活的容器编排平台,可以帮助用户实现高可用、弹性、可扩展和自动化的应用程序部署和管理。

5.3、Kubernetes指令

下面列举了一些常用的Kubernetes指令,涉及到Kubernetes的基本操作、应用部署、资源管理等方面:

基本操作

  • kubectl version: 查看Kubectl和Kubernetes Server的版本信息。
  • kubectl config get-contexts: 列出所有可用的上下文(Context)。
  • kubectl config use-context <context-name>: 切换到指定的上下文。
  • kubectl cluster-info: 查看当前集群的信息。

应用部署

  • kubectl create deployment <deployment-name> --image=<image-name>: 创建一个Deployment,用于部署容器化应用程序。
  • kubectl expose deployment <deployment-name> --port=<port-number> --type=LoadBalancer: 将Deployment暴露为服务(Service),并将其绑定到负载均衡器(Load Balancer)上。
  • kubectl scale deployment <deployment-name> --replicas=<num-replicas>: 扩展或缩小Deployment中Pod的数量。
  • kubectl rollout status deployment/<deployment-name>: 查看Deployment的滚动升级状态。
  • kubectl rollout undo deployment/<deployment-name>: 撤消最近的滚动升级。

资源管理

  • kubectl get pods: 列出所有正在运行的Pod。
  • kubectl describe pod <pod-name>: 查看指定Pod的详细信息。
  • kubectl logs <pod-name>: 查看指定Pod的日志。
  • kubectl exec -it <pod-name> -- /bin/bash: 在指定Pod中运行一个bash shell。
  • kubectl get services: 列出所有服务(Service)。
  • kubectl describe service <service-name>: 查看指定服务的详细信息。
  • kubectl delete <resource-type> <resource-name>: 删除指定类型和名称的资源。

以上仅是部分Kubernetes指令,Kubernetes还有很多其他指令和选项,具体使用方法可以通过kubectl --help或者Kubernetes官方文档来了解。

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/129851083
今日推荐