当前位置:网站首页>Redis学习
Redis学习
2022-08-01 07:58:00 【joy妹妹是菜鸟】
Redis的引入
随着网络请求量越来越大,服务器存在各种压力

解决CPU及内存压力
解决IO压力
分布式集群遇到的问题是
当一个客户端多次请求时,可能每次请求被分到了不同的服务器
但每次都需要验证该客户端是否登录
于是我们可以选择将sessionID和它的值存为key-value对存入数据库(数据库将内容记录在硬盘)中
但是本来数据库查询都是很慢需要优化的过程
于是我们引入Redis
NoSQL数据库
NoSQL数据库
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。
不遵循SQL标准。
不支持ACID。
远超于SQL的性能。
NoSQL适用场景
对数据高并发的读写
海量数据的读写
对数据高可扩展性的
NoSQL不适用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询。
(用不着sql的和用了sql也不行的情况,请考虑用NoSql)
Redis
Remote Dictionary Server远程字典系统
单线程的内存级别的NoSQL缓存数据库
非常之快(内存比硬盘快)
概述
Redis是一个开源的key-value存储系统。
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,Redis支持各种不同方式的排序。
与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
并且在此基础上实现了master-slave(主从)同步。
应用场景
配合关系型数据库做高速缓存
高频次,热门访问的数据,降低数据库IO
分布式架构,做session共享
多样的数据结构存储持久化数据

数据类型
(后继学习之后再补充)
- string
- list
- set
- hash
- Zset(带权set)
实例演示
不同服务器使用redis实现session同步(spring-session-redis)
未使用Redis
开启两个项目,controller层测试代码如下:
@RequestMapping("/test.do")
@ResponseBody
public ResultObject test(HttpSession session){
if (session.getAttribute("test")!=null){
System.out.println("exam server"+session.getAttribute("test"));
}else {
System.out.println("没有session");
session.setAttribute("test","this is exam server");
}
return ResultObject.ERROR("数据失败");
}
@RequestMapping("/test.do")
@ResponseBody
public ResultObject test(HttpSession session){
if (session.getAttribute("test")!=null){
System.out.println("springboot server"+session.getAttribute("test"));
}else {
System.out.println("没有session");
session.setAttribute("test","this is springboot server");
}
return ResultObject.ERROR("数据失败");
}
开启Nginx(任务管理器中会有两个nginx.exe)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fl67Gwgz-1659267161893)(C:\Users\pon18\AppData\Roaming\Typora\typora-user-images\image-20220731190232693.png)]](/img/7c/477d307242d6d3ab5fbfdd084c0672.png)
启动两个项目(记得修改其中一个的端口号)
在地址栏中输入项目中方法的地址映射
(Nginx相关原理及操作见Nginx相关内容)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jQ9KJjgC-1659267161896)(C:\Users\pon18\AppData\Roaming\Typora\typora-user-images\image-20220731190040969.png)]](/img/86/9022c73a49fac3819221d71f0bab87.png)
没有导入redis,启动两个项目时,他们的session会被切换,所以控制台中每次都会提示没有session

在项目中导入Redis

即添加两个依赖:redis和spring-session
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
在配置文件中引入
spring.session.store-type=redis
随后重新启动,并在浏览器中输入映射可以发现:
exam起初没有session,创建session后,exam保存的session可以在springboot server同步
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uSYxkL66-1659267161903)(C:\Users\pon18\AppData\Roaming\Typora\typora-user-images\image-20220731191840128.png)]](/img/76/56318e2a1e08ced0dab4d20f295f01.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4mGIKtq2-1659267161904)(C:\Users\pon18\AppData\Roaming\Typora\typora-user-images\image-20220731191828615.png)]](/img/af/b474918656fb5e53310a0adf4e1d96.png)
至此,我们通过redis缓存存储session,实现了用户的请求操作执行在不同的服务器上
补充:想要保存用户对象,就要实现序列化
要想反序列化出来要确保在同一个包下
所以,开发过程中,创建实体类都要序列化,对象序列化之后方能存入到redis缓存中
边栏推荐
猜你喜欢
随机推荐
微信小程序请求封装
配置我的kitty
Data Analysis 5
C语言学习概览(二)
VSCode 快捷键及通用插件推荐
LabVIEW RT中的用户界面更新速度
pytest interface automation testing framework | pass in parameter values in the form of function return values
力扣每日一题-第44天-290. 单词规律
案例实践 --- Resnet经典卷积神经网络(Mindspore)
Generate pictures based on the content of the specified area and share them with a summary
Electromagnetic compatibility introductory tutorial (6) test project
企业数据虚拟化综合指南
nodetype中值1、2、3分别代表什么意思
网络基础学习
22 Grab the Seat 1 C.Grab the Seat (Geometry + Violence)
pytest接口自动化测试框架 | 单个/多个参数
mysql查看cpu使用情况
Shell执行SQL发邮件
How to generate and configure public key certificate in Alipay
13 - JUC CountDownLatch concurrent programming









