前言
最近工作完成的差不多了,想着进行再复习一下之前学的知识,虽然经常用,原理什么的忘得差不多了,希望捡起来
一、session共享问题引入redis
1. 传统方式登录
1.1 用户填写用户名密码,点击提交,建立会话发送请求
1.2 服务器验证登录数据用户名密码,成功后写入域对象session对象
1.3 本次请求的相应里会存在一个sessionid的值,保存在本次会话客户端cookie中
1.4 后续访问 cookie中总能通过sessionid告诉服务器使用哪个session对象,从而在session域属性中获取数据username
2. session共享问题
2.1 由于使用session对象存储用户数据,导致服务器集群节点之间没法共享session对象,导致使用session解决的业务逻辑全部失败,其中包含登录逻辑
3. session共享解决方案
1.1 服务器之间同步session
缺点:大量占用服务器资源,session对象一旦过多,导致使用所有服务器内存溢出
1.2 负载均衡采用ip_hash
客户端ip地址不变,永远访问同一个后端服务器
缺点:客户端很难实现高可用的使用
1.3 引入第三方存储
将session里存储的数据,提取到网络系统的一个存储容器,比如数据库,redis
缺点:多占用了网络带宽
redis作为一个稳定的,性能速度高的存储技术,不二的选择
二、redis介绍
1. redis是什么
redis是一个能存储数据的容器,相当于跟数据库是一样的,能实现对数据的增删改查
2. 特性
2.1 nosql : not only structured query language 不仅结构化查询语言,一类操作命令的统称sql
2.2 key - value : 为了处理非结构化数据,使用key - value的数据结构存储数据,处理结构化数据的技术 - 关系型数据库,处理非结构化数据 - redis, mongdb,hdfs
2.3 内存运行 : redis在运行过程中,数据在内存中处理
redis使用结构 : 包含两个 服务端运行数据的进程、登录redis服务端操作数据的客户端
优点 : 速度快
缺点 : 1.内存容量相对于磁盘较小,redis存储空间资源稀缺 2. 内存断电数据丢失情况,数据容错性比较低
2.4 分布式 : 一个redis节点内存容量小,可以多启动几个redis,形成分布式集群解决容量小的问题,相对于单个redis进程,处理容量形成线程增长(总量还是不如磁盘多),分布式结构中就要解决分布式问题 - 数据分片问题
2.5持久化 : redis数据虽然是在内存中处理的,但是redis提供持久化功能,可以按照持久化机制,将内存数据保存在磁盘一份,即使内存数据断点丢失了,也可以保证数据依然存在继续被使用 - 提高redis容错性