前面我们已经完成了入门项目的开发,有提到有关于redis的内容,但是并没有深入的对redis进行讲解/说明,那么今天这篇文章就来重点来讲一下redis
redis入门介绍:
既然要讲到redis,那么难免要提到MySQL。因为redis的引入就是为了解决MySQL访问量过大的问题,为了缓解MySQL的访问/查询压力,从而引入了redis的缓存技术,来实现数据的快速访问和读写操作
对比
MySQL用到的操作语言主要是SQL语言,而redis主要是nosql语言,接下来进行两者的对比:
首先是结构上
- SQL语言是结构化的语言,按照一定的语法来组织对应的SQL语句,需要结合业务开发的需求来插入对应的数据,在整个的数据库表中进行相对应的操作,每个字段需要什么样的数据,怎么插入,插入的关键字是什么,这些都是规定好的,不能发生更改!
- nosql语句则没有固定的语法结构,只需要根据实际的业务需求来引入对应的键值对/文件/图,能够清晰的表达其代表的含义即可!

接着是关联性
- 在SQL当中,如果给出一张用户表,和一张订单表,一般是需要一张中间表来关联两张表的信息 ;【补充:在实际的业务开发当中,不建议使用外键,因为外键的使用,会导致数据库访问性能下降,可以结合自己的实际开发需求来决策!】

- 在nosql语句当中,一般可以用一个文件,文件内部的数据格式类似于JSON文件的格式,来进行数据的存储,里面会记录关联的信息有哪些,但是很明显,这样子会造成内存的浪费问题,而且可视化也比较差,结合自身需要来选择对应的存储方式

查询数据
- SQL语句的查询,一般都会采用select固定格式来进行数据的查询操作,需要结合业务开发的实际需求来编写对应SQL语句,格式一般都是固定的。
- nosql语句的查询,就没有固定的格式了,可以采用直接访问关键字的方式,也可以访问类似于函数的格式,也可以访问对应的url来实现对数据的访问,格式并不是单一的!

事务:注意,这里的事务指的是实现业务需求的一组SQL语句哦,不是日常生活中需要处理的事务
- MySQL事务 ,一般是在增删改上会加上事务,来实现对应的业务功能,同时也保证了操作的安全性,保证了数据的同步性!
- nosql语句就没有这么严格的要求,根据对应的业务需求来实现对应的业务功能即可,对安全性的要求不高

总的对比

认识Redis
主要是有以下的一些特征:
需要补充的是,对于现在最新版的redis,有的友友会觉得,redis已经不是变成多线程了吗?这里怎么写的还只是单线程。最新版的redis的多线程指的是网络请求访问部分,实现了多线程 。但是对于具体的业务处理,采用的仍然是单线程方式!
为什么redis访问的速度快?因为redis是基于内存来进行工作的,MySQL的存储方式是磁盘,磁盘的访问速度肯定是要比内存的访问速度要慢的!!!
但是基于内存的话,会面临一个问题,如果用户电脑关机了,那么对应的数据不就丢失了吗 ,所以我们会进行数据持久化操作来将对应的数据保存到磁盘当中

redis执行
执行命令行客户端,可以结合业务需求来设置对应的值,提到设置对应的值,一般是在spring boot的yml文件当中进行对应功能的配置!
- 配置好对应的ip地址,但是对于初学者,一般会采用默认的ip地址,直接联机到本地的ip地址即可
- 端口。结合业务开发的需要以及避免端口的占用问题,开发者需要结合业务的实际需求来进行端口的设置工作
- 密码。如果设置了密码的话,则需要输入对应的密码来进行登录操作!

案例:
下面展示的是一些具体的小案例

redis数据结构介绍:
redis是一个key-value的数据库,key一般情况下是string类型,不过value的类型却是多种多样的
在实际开发当中,我们用的最多的是前面五种的基本类型,每一种数据结构都有不同的操作命令,但是这些命令之间都是相通的,可以深入学习其中的一种数据结构,然后其他的四种用类比的方式进行深入的学习

可以参考官方提供的数据访问方式:

redis命令
redis通用命令:
- 可以通过命令KEYS来查看所有符合模板的key,但是不建议在生产环境上使用,因为你想想嘛,如果一个redis里面有很多很多的key,然后通过这种方式去查找所有符合模板的key,系统需要访问所有的key,然后还需要到key里面进行比对的操作,会导致访问/查找的效率下降!
- DEL,对数据进行删除操作。
- EXISTIS,是为了判断key是否存在!
- EXPIRE,是为了设置对应的缓存的有效期,到时间后对应的KEY会自动删除,毕竟这些数据都是存在内容当中的,因此需要考虑对应的有效期的问题,保证系统的高效运行!
- TTL,查看一个key的有效期
- help,这个关键字会给出一个命令的具体用法!
string类型


需要注意,如果进行批量查询的话,查出来的value是和key一一对应的!

key的结构

需要根据实际的业务需求来设置对应的key结构:
保证了数据间不会因为id相同,而导致对应的查询数据出现异常,只需要到指定的包里面去查找对应的key即可!

但是我们接着想想,如果用上面JSON的格式来存储每一个key的value,在后续需要进行修改的时候放不方便?对字符串进行相对应的修改,肯定是不方便的,因此我们需要思考有没有其他的方式来优化
Hash类型



List类型



set类型


SortedSet类型


Redis的Java客户端
根据实际的业务需求,来选择对应的Java客户端来实现对应的功能

Jedis的使用
- 需要引入对应的依赖/对应的工具包
- 然后是需要建立连接,参照上面提到的redis配置信息,建立对应的连接和对应的端口号,redis默认选择的数据库是0,可以手动进行修改
- 接着是redis的测试工作
- 最后记得进行资源的释放操作


Jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会造成性能的损耗,因此会采用Jedis连接池的方式
接着是需要对Jedis连接池进行相对应的配置操作,结合系统的硬件性能和具体的开发业务来进行综合考虑,来对Jedis进行系统的配置工作

SpringDataRedis
springdataredis的介绍+操作
需要注意的是,不要忘记对应的依赖注入!!!





改进


改进后存在的问题

进一步改进



