Redis主从复制 如果某个服务器程序,只有一个节点(物理服务器),那我们就称为单点这种情况下会有很多问题:1)我们用户访问量比较大的时候,我们的服务器有可能会承受不住(支持的并发量有限)2)如果这一个服务器挂了。服务就全部中断了那为了解决单点问题我们就引入了分布式系统,在分布式系统,我们引入了不止一个物理服务器来部署服务器程序,这样就可以提供更稳定和并发量更大的服务。
Redis上的事务 提到事务,我们第一个想到的应该就是mysql,这里我们先来回顾一下mysql事务的特性:1) 原子性:用户的多个操作打包执行,要么正确执行,要么出现错误全部回滚2)一致性:事务执行前后,数据都不能离谱3)持久性:我们mysql的事务一旦提交了,那一定就是存储在硬盘上4)隔离性:这里又涉及到mysql的隔离级别(对写加锁,对读加锁等)那redis对比mysql,他的事务就简单很多了。
Redis持久化 我们都知道redis在内存中存储数据的,但是内存中的数据是不持久的,如果想要让数据持久,就需要把数据存储到硬盘上,但是如果直接存到硬盘上,那我们redis就和mysql没有什么区别了,所以为了保证自身快的特点,我们还是要把数据存放到内存中,但是为了持久化硬盘上也要存。当我们插入一个新的数据时,我们就把数据同时写入到内存和硬盘中,当查询某个数据的时候,就直接从内存读取,当我们redis重启时,我们从硬盘中取数据来恢复内存中的数据这里我们会有疑问,那存储了两遍会不会导致我们的效率变低?
Jwt令牌验证在代码中的使用 这个问题是我在实现项目中遇到的一个问题,之前我们登录都是在验证密码正确后,在服务端创建session,并且把sessionId放到cookie中,在cookie中储存,但是到后面我发现,这个方法在一些情况下不是很合理 比如在集群环境下,我们就无法使用session(集群环境我们在redis中说过,我们这里可以简单理解为多个机器) 我们在redis中说我们的项目通常会部署在多个服务器上,然后通过负载均衡,将用户分配到不同的服务器,就类似于这个图: 那如果我们使用session的话,我们来设想一下,我们
Spring 事务 首先事务我们在Mysql阶段已经了解过了,事务就是一组操作的集合,是不可分割的,详细说就是事务会把所有的操作作为一个整体,一起向数据库提交或者撤销操作,所以这一组操作会一起成功或者失败。
Spring AOP的概念与使用 excution表达式中作用的路径都是有规则的,那如果我们要匹配多个无规则的方法呢?这时我们要使用excution切点表达式就要写多个,描述起来也不是很方便,这时候我们就可以使用自定义注解的方式和另一种切点表达式@annotation来描述首先我们要创建一个注解类,在创建前我们看看spring中的注解都有那些信息(这个之前我们也说过)我们也可以多点开几个看一下,我们会发现@Target和@Retention每个注解中都有那我们来看一下这两个注解有什么用。
Mybatis补充和标签的使用 mybatis中参数赋值有两种方式,我们之前都是使用#{}来进行赋值,那这两种方式肯定也是有区别的,接下来我们就来看看两者间的区别首先我们来看一下使用#{}来赋值一个intrger类型的参数我们发现我们的sql请求是有一个?去占位的,然后我们传的参数给到这个问号占的位置,这种sql我们称为预编译sql那我们使用${}再来看一下我们发现sql请求没有?,而是直接id=3,也就是参数直接拼接在sql语句中了接下来我们看一下传String类型使用#{}来赋值依然没有问题。
MyBatis 首先我们来回顾一下我们之前说过的应用分层,也就是三层架构模型:Controller,Service,Dao,我们说一般是由浏览器发起请求后,先请求到Controller这层,然后由Controller调用Service进行业务逻辑处理,如果需要我们数据库中的数据,就需要让Service来调用Dao,Dao层来从数据库中读取数据我们之前学习mysql,使用的是jdbc来操作数据库,很麻烦。
redis集成到spring boot中使用 redis服务器在官网中公开了自己使用的协议--RESP,所以我们可以使用这个协议来访问redis服务器,但是如果我们要自己实现库,那肯定是非常麻烦的,所以我们可以使用网上的库,我们直接调用接口,不需要关注redis协议的细节,我们这里使用的是jedis。本身我们这里是需要通过windows主机,来访问云服务器的6379端口的,于是我们就构造一个特殊的ssh数据包,把要访问6379端口的请求,放到数据报里,此时我们的数据报就变成了这样。查询key对应的value(注意这里的返回值为set类型)
SpringBoot日志 我们说spring使用了slf4j框架,但是整个框架也不是一个真正的日志实现,而是一个抽象层,他对现有的一些日志框架制定了一种规范标准,也就是slf4j就是个接口,所以slf4j,需要和具体的日志框架配合使用slf4j就是其他日志框架的门面,可以理解为提供日志服务的统一API接口,并不涉及到具体日志逻辑实现。
Redis中一些其他的数据类型&渐进式遍历 我们之前说了redis中的五个类型 分别是:String List Hash Set ZSet,那除了这五个redis文档中还给我们提供了一些其他的数据类型。
redis中的数据类型(Set与ZSet) set在我们目前有两个意思,首先就是这里使用的集合,第二个是我们的set和get方法因为set是一个集合,所以他具有集合的一些特点:1.集合中的元素无序 2.集合中的元素是不可重复的 3.集合间是可以取交集,并集,差集。
SpringBoot的配置文件 配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动程序时,应用程序会从配置文件中读取数据,加载并运行,这样更方便我们去管理数据。我们来说一下什么是硬编码,简单理解就是将数据直接写到我们代码中,也就是我们说的代码写死同时使用配置文件可以使程序完成用户和应用程序的交互,或者应用程序与其他应用程序的交互。
Redis中数据类型的使用(hash和list) 我们知道redis中的数据都是以键值对的方式存储的,key全部都是string类型,而value可以是不同的数据结构,其中就包括hash,也就是说,key这一层组织完成后到了value仍然是hash。
Spring ioc&DI 我们上面说了五大类注解,但是类注解存在两个问题:1.如果我们使用外部包中的类,没办法添加类注解2.一个类,如果需要多个对象,那就需要用到我们的方法注解我们先来看如何去使用我们会发现报错了,找不到这个类型的bean,这是因为spring根本没有去看我们加载了@Bean注解的这个类,因为我们进程中有很多的类,有内部的有外部的,Spring不可能把所有的都加载一遍,所以他只会把添加了五大注解的类,存储到spring容器中我们发现为什么我这次使用了类注解,也报错了啊。
Redis的一些数据类型(一) 我们说redis是key value键值对的方式存储数据,key是字符串,而value是一些数据结构,那今天就来说一下value存储的数据。我们数据结构包含,String,hash,list,set和zest但是在redis内部真的就是按这些数据结构存储的嘛?很明显上面的图告诉我们不是,我们在内部是由不同的内存编码来保存数据的,但是时间复杂度是跟我们的数据结构一样的,那我们先来看一下第一个。