




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务6.完成数据缓存实现任务描述Redis是一种高性能的非关系型数据库。redis作用在内存,性能极高。本任务首先安装好Redis服务,然后通过SpringBoot把Redis整合到项目中,然后编写Redis缓存工具类实现用户数据缓存提高系统性能。知识准备1.JWT介绍Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。2.JWT的token的认证和传统的session认证的区别(1)传统的session认证http协议本身是一种无状态的协议,而这就意味着如果用户向应用提供了用户名和密码来进行用户认证,那么下一次请求时,用户还要再一次进行用户认证才行,因为根据http协议,应用并不能知道是哪个用户发出的请求,所以为了让应用能识别是哪个用户发出的请求,只能在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给应用,这样应用就能识别请求来自哪个用户了,这就是传统的基于session认证。但是这种基于session的认证使应用本身很难得到扩展,随着不同客户端用户的增加,独立的服务器已无法承载更多的用户,而这时候基于session认证应用的问题就会暴露出来.基于session认证所显露的问题①Session:每个用户经过应用认证之后,应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。②扩展性:用户认证之后,服务端做认证记录,如果认证的记录被保存在内存中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。③CSRF:因为是基于cookie来进行用户识别的,cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。(2)基于token的鉴权机制基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。流程上是这样的:①用户使用用户名密码来请求服务器②服务器进行验证用户的信息③服务器通过验证发送给用户一个token④客户端存储token,并在每次请求时附送上这个token值⑤服务端验证token值,并返回数据这个token必须要在每次请求时传递给服务端,它应该保存在请求头里,另外,服务端要支持CORS(跨来源资源共享)策略,一般在服务端这么做就可以了Access-Control-Allow-Origin:*。3.Redis介绍Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。(1)Redis特点:①Redis数据库完全在内存中,使用磁盘仅用于持久性。②相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。--*③Redis可以将数据复制到任意数量的从服务器。(2)Redis优势介绍:①异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。②支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。③操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。④多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。任务实施步骤1:搭建Redis开发环境(1)下载并解压Redis下载地址:/microsoftarchive/redis/releases/tag/win-3.2.100下载页面,如图4-34所示:图4-34Redis下载页面(2)运行Redis解压到F:\Redis-x64-3.2.100双击运行F:\Redis-x64-3.2.100\redis-server.exe,默认启动端口号为6379,启动成功显示,如图4-35所示:图4-35启动Redis服务步骤2:实现用户数据缓存(1)增加项目依赖修改pom.xml文件,增加下列依赖配置:<!--redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
<!--springboot集成redis所需common-pool2--><dependency><groupId>mons</groupId><artifactId>commons-pool2</artifactId><version>2.5.0</version></dependency>(2)增加redis配置修改src/main/resources/application.yml文件,在spring属性下增加redis配置:spring:redis:database:0host:port:6379timeout:2000lettuce:pool:max-active:8max-wait:-1max-idle:8min-idle:0(3)在“com.chinasofti.ordersys.util”包下创建RedisCache.java工具类。Ø代码如下:packagecom.chinasofti.ordersys.util;
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.*;importorg.springframework.stereotype.Component;
importjava.util.*;importjava.util.concurrent.TimeUnit;
/***springredis工具类**/@SuppressWarnings(value={"unchecked","rawtypes"})@ComponentpublicclassRedisCache{@AutowiredpublicRedisTemplateredisTemplate;/***缓存基本的对象,Integer、String、实体类等**@paramkey缓存的键值*@paramvalue缓存的值*@return缓存的对象*/public<T>ValueOperations<String,T>setCacheObject(Stringkey,Tvalue){ValueOperations<String,T>operation=redisTemplate.opsForValue();operation.set(key,value);returnoperation;}
/***缓存基本的对象,Integer、String、实体类等**@paramkey缓存的键值*@paramvalue缓存的值*@paramtimeout时间*@paramtimeUnit时间颗粒度*@return缓存的对象*/public<T>ValueOperations<String,T>setCacheObject(Stringkey,Tvalue,Integertimeout,TimeUnittimeUnit){ValueOperations<String,T>operation=redisTemplate.opsForValue();operation.set(key,value,timeout,timeUnit);returnoperation;}
/***获得缓存的基本对象。**@paramkey缓存键值*@return缓存键值对应的数据*/public<T>TgetCacheObject(Stringkey){ValueOperations<String,T>operation=redisTemplate.opsForValue();returnoperation.get(key);}
/***删除单个对象**@paramkey*/publicvoiddeleteObject(Stringkey){redisTemplate.delete(key);}
/***删除集合对象**@paramcollection*/publicvoiddeleteObject(Collectioncollection){redisTemplate.delete(collection);}
/***缓存List数据**@paramkey缓存的键值*@paramdataList待缓存的List数据*@return缓存的对象*/public<T>ListOperations<String,T>setCacheList(Stringkey,List<T>dataList){ListOperationslistOperation=redisTemplate.opsForList();if(null!=dataList){intsize=dataList.size();for(inti=0;i<size;i++){listOperation.leftPush(key,dataList.get(i));}}returnlistOperation;}/***获得缓存的list对象**@paramkey缓存的键值*@return缓存键值对应的数据*/public<T>List<T>getCacheList(Stringkey){List<T>dataList=newArrayList<T>();ListOperations<String,T>listOperation=redisTemplate.opsForList();Longsize=listOperation.size(key);
for(inti=0;i<size;i++){dataList.add(listOperation.index(key,i));}returndataList;}
/***缓存Set**@paramkey缓存键值*@paramdataSet缓存的数据*@return缓存数据的对象*/public<T>BoundSetOperations<String,T>setCacheSet(Stringkey,Set<T>dataSet){BoundSetOperations<String,T>setOperation=redisTemplate.boundSetOps(key);Iterator<T>it=dataSet.iterator();while(it.hasNext()){setOperation.add(it.next());}returnsetOperation;}
/***获得缓存的set**@paramkey*@return*/public<T>Set<T>getCacheSet(Stringkey){Set<T>dataSet=newHashSet<T>();BoundSetOperations<String,T>operation=redisTemplate.boundSetOps(key);dataSet=operation.members();returndataSet;}/***缓存Map**@paramkey*@paramdataMap*@return*/public<T>HashOperations<String,String,T>setCacheMap(Stringkey,Map<String,T>dataMap){HashOperationshashOperations=redisTemplate.opsForHash();if(null!=dataMap){for(Map.Entry<String,T>entry:dataMap.entrySet()){hashOperations.put(key,entry.getKey(),entry.getValue());}}returnhashOperations;}
/***获得缓存的Map**@paramkey*@return*/public<T>Map<String,T>getCacheMap(Stringkey){Map<String,T>map=redisTemplate.opsForHash().entries(key);returnmap;}/***获得缓存的基本对象列表**@parampattern字符串前缀*@return对象列表*/publicCollection<String>keys(Stringpattern){returnredisTemplate.keys(pattern);}}(4)在“com.chinasofti.ordersys.model”包下修改UserInfo.java类并实现Serializable接口。Ø代码如下:packagecom.chinasofti.ordersys.model;importjava.io.Serializable;publicclassUserInfoimplementsSerializable{//...}(5)在“com.chinasofti.ordersys.util.security”包下修改UserHandleUtils.java类并把HashMap替换为RedisCache实现用户数据缓存。Ø代码如下:packagecom.chinasofti.ordersys.util.security;
importmon.security.LoginUser;importcom.chinasofti.ordersys.util.RedisCache;
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;@Compo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公寓租赁标准合同样本
- 某银行牡丹贷记卡动产质押合同范本
- Module 1 Unit 2 Changes in our lives Listen and say Listen and enjoy (教学设计)-2024-2025学年沪教牛津版(深圳用)英语六年级下册
- 沿街商铺购房合同范本
- 艺术家合作合同模板大全
- 企业融资成立合同:出资细节
- 房屋买卖合同真实案例解析
- 企业整体出售合同范本
- 10000以内数的读写(教学设计)-2023-2024学年二年级下册数学人教版
- 11《爸爸妈妈在我心中 爱父母在行动》(教学设计)-部编版道德与法治三年级上册
- 2025年四川司法警官职业学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 山东省德州市2024-2025学年高三上学期1月期末生物试题(有答案)
- 本人报废车辆委托书
- 双减政策与五项管理解读
- 2025年道德与法治小学六年级下册教学计划(含进度表)
- 过桥资金操作流程
- 货物学 课件1.2货物的特性
- 新时代中国特色社会主义理论与实践2024版研究生教材课件全集2章
- 2024年公路水运工程施工企业主要负责人和安全生产管理人员安全生产考核试题库(含答案)
- 2025年军队文职考试《公共科目》试题与参考答案
- 辅导员入职培训课件
评论
0/150
提交评论