Redis的应用以及Redis工具类的封装

在前后端分离的项目中,通过session和cookie的通信一般就失去效益了,即使这么做了也会产生著名的漏洞问题CSRF(Cross-site request forgery), 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。因为cookie依赖于sessionid,我们可以在浏览器中f12看到具体情形,恶意攻击者就可以伪造这个id进行跨域请求,会产生非常严重的后果。
所以目前后端分离的项目如果传递信息,一般有两种思路,一种是在后端开启共享存储的内存,前端后端都可以存数据进去,常见的方式是线程间通信的一种实现即Threadlocal,但这种方式虽然优雅仍然避免不了内存泄漏的问题,简单来讲hashmap的key没了但是value在导致这块内存无法被回收。第二种是使用token,之前几乎所有的前后端项目都采用了这种交互方式,后端生产token,前端缓存token,同一个用户每次请求都是拿着同一个token去后端验证,但是token有一个很大的问题,那就是签名问题,很难标注token的具体信息,项目如果后端分布式,token的验证问题也十分繁琐。所以引入jwt做中介。Jwt解决了身份校验的问题,但后端如果分布式,jwt的验证总是要请求认证服务也是非常繁琐的,为了解决这个问题引入了RSA非对称加密的思路,只有认证服务有私钥其余的服务都是公钥,公钥加密私钥解密,其余服务不需要验证内容是否正确只需要使用公钥验证格式是否符合RSA的规范。
Jwt这样看来是一个非常好的信息传递包裹,但是知道了共享内存不够优秀,只有另一种方式来进行前后端通信了,那就是第三方数据库。
我们常说的缓存redis就可以作为很好的工具。
但是redis并不能存储对象,redis已经应用相当广泛了,但redis本身并没有直接存储对象的方法,我们可以通过转换对象的方式来存储对象。
如果redis存储对象需要序列化:
方案一:序列化对象为二进制
使用redis接口:

jedis.get(byte[] key)
jedis.set(byte[] key, byte[] value)

至于序列化方式,我们有很多种选择,比如:Java serialize,Protobuf,或者自己手动序列化都行

public byte[] serialize(Object obj);public Object unSerialize(byte[] bytes);

方案二:序列化为字符串
使用redis接口:
jedis.get(String key);

jedis.set(String key, String value);
序列化为字符串,我们也有很多选择:Json(Jackson,FastJson),Xml等方式
方案三:转换对象为map
使用redis接口:
jedis.hgetAll(String key);

jedis.hmset(String key, Map<String,String> values);
知道了只有序列化后才能使用redis存储对象,实际生产中可以使用第三方工具进行序列化,比如fastjson,jackson等。
本例中使用fastjson封装成生产中的redis工具:
 

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {
@Bean("redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
//使用fastjson序列化
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
// value值的序列化采用fastJsonRedisSerializer
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
// key的序列化采用StringRedisSerializer
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer()); 
template.setConnectionFactory(redisConnectionFactory);
return template;
} 
@Bean
@ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
} 
}


当我们在项目中进行应用时只需要@Autowired就可以了,非常方便。
当然如果用redis工具取对象还需要反序列化,fastjson举例即JSON.pareObject(rts.opsForValue().get(key).toString(),xxx.class).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 11 24H2版本有哪些新功能_Windows 11 24H2十四大新功能介绍

距离上次发布的23H2版本已经过去了一年时间&#xff0c;现在&#xff0c;Win 11的24H2版本终于等到了&#xff0c;微软已经全面公开发布Win11 24H2版本&#xff0c;版本号为26100.1742&#xff0c;此次官宣的版本包括了消费者版、商业版、LTSC 2024版等&#xff0c;各种语言版本…

H.264视频,HEVC视频,VP9视频,AV1视频小知识

H.264、HEVC&#xff08;H.265&#xff09;、VP9和AV1是不同的视频编码格式&#xff0c;它们的主要区别在于压缩效率、支持的分辨率、编码技术以及专利和授权费用等方面。以下是这些编码格式的主要区别&#xff1a; H.264&#xff08;AVC&#xff09;&#xff1a; 压缩效率&…

STM32中的RAM和ROM分别是什么

RAM&#xff08;Random Access Memory&#xff0c;随机存取存储器&#xff09;和ROM&#xff08;Read-Only Memory&#xff0c;只读存储器&#xff09;是计算机系统中的两种常见存储器类型&#xff0c;它们各自有不同的功能和用途。 1. RAM&#xff08;内存&#xff09; 定义…

如何启动hive

检查mysql是否启动 通过Navicat测试mysql是否可以连接 找打hive配置文件所在目录 检查连接mysql的账号密码是否正确,如果不正确就要修改为正确的 初始化hive元数据存储的库:schematool -dbType <database_type> -initSchema 检查mysql中是否创建hive数据库,这里看到hive数…

zookeeper客户端

启动单机版的zookeeper 配置Maven环境 (1) IDEA自带maven (2) 更新Maven库镜像地址&#xff1a; ① 拷贝D:\Program Files\JetBrains\IntelliJ IDEA 2018.3.5\plugins\maven\lib\maven3\conf\settings.xml [IntelliJ的安装目录]到 C:/用户/username/.m2 (如果.m2文件不存在&…

Android屏幕旋转流程(2)

&#xff08;1&#xff09;疑问 &#xff08;1&#xff09;settings put system user_rotation 1是什么意思&#xff1f; 答&#xff1a;设置用户期望的屏幕转向&#xff0c;0代表&#xff1a;Surface.ROTATION_0竖屏&#xff1b;1代表&#xff1a;Surface.ROTATION_90横屏&a…

cmake与c/c++拓展的关联

CMake和VSCode中的C扩展在项目管理和代码编辑中起到不同的作用。CMake用于构建系统配置&#xff0c;负责生成编译项目所需的Makefile或其他构建文件&#xff0c;而VSCode中的C扩展负责代码编辑、语法高亮、代码提示和调试等功能。 在VSCode中&#xff0c;即使CMake已经正确配置…

华宇携司法大模型亮相2024中国移动全球合作伙伴大会

2024中国移动全球合作伙伴大会于10月11日在广州琶洲保利世贸博览馆盛大开幕。本届大会以“智焕新生 共创AI时代”为主题&#xff0c;深入探讨数据、算力与人工智能如何深度融合&#xff0c;全力推进AI规模发展、规模应用&#xff0c;加快形成AI技术能力、经济效益上的规模效应&…

Android中有哪些布局方式?

Android中的布局方式是实现用户界面设计的基础&#xff0c;通过合理的布局&#xff0c;可以创建出美观且易用的应用程序界面。Android提供了多种布局方式&#xff0c;每种布局方式都有其特定的应用场景和特点。以下是对Android中主要布局方式的详细介绍&#xff1a; 一、线性布…

第十三章 RabbitMQ之消息幂等性

目录 一、引言 二、消息幂等解决方案 2.1. 方案一 2.2. 方案二 一、引言 幂等是一个数学概念&#xff0c;用函数表达式来描述是这样的&#xff1a;f(x) f(f(x)) 。在程序开发中&#xff0c;则是指同一个业务&#xff0c;执行一次或多次对业务状态的影响是一致的。有些业务…

react实现实时计时的最简方式

js中时间的处理&#xff0c;不借助于moment/dayjs这样的工具库&#xff0c;原生获取格式化的时间&#xff0c;最简单的实现方式可以参考下面这样。 实现效果 代码实现 封装hooks import { useState, useEffect } from "react";export function useCountTime() {c…

Python酷库之旅-第三方库Pandas(150)

目录 一、用法精讲 681、pandas.Timestamp.now方法 681-1、语法 681-2、参数 681-3、功能 681-4、返回值 681-5、说明 681-6、用法 681-6-1、数据准备 681-6-2、代码示例 681-6-3、结果输出 682、pandas.Timestamp.replace方法 682-1、语法 682-2、参数 682-3、…

MongoDB Shell的使用

下载地址&#xff1a;https://www.mongodb.com/try/download/shell 以下是关于如何使用 MongoDB Shell 的一些基本步骤和常见操作&#xff1a; 前提条件&#xff1a;确保已经安装并启动了 MongoDB 服务。 启动 MongoDB Shell&#xff1a;在命令行终端中输入mongosh命令。如果…

Java 拉取并解析Kafka的Topic,Insert到InfluxDB

Maven依赖 <dependencies><!-- Kafka Client --><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.4.0</version></dependency><!-- InfluxDB Client --&g…

删除 Docker 容器的日志文件

要删除 Docker 容器的日志文件,你可以通过以下几种方法来实现: 方法一:手动清理日志文件 单容器设置 1.查看容器日志文件位置: Docker 默认的日志文件存储在 /var/lib/docker/containers// 目录下。你可以通过以下命令找到具体位置: [root@BM01-cyzx-sqmygjpt-001 ~]# do…

单点登录Apereo CAS 7.1客户端登出配置及免认证页面问题

从上一篇博客中,我们已经实现了CAS客户端集成和服务端授权,能够通过统一认证登录访问系统资源了,接下来我们讲一下如何实现CAS客户端登出及免认证页面配置的问题,还有以个人见解讲一下CAS和Spring security的关系。 上一篇博客:单点登录Apereo CAS 7.1客户端集成教程-CSD…

VUE 开发——Vue学习(三)—— 智慧商城项目

目录 解释各个模块 api接口模块&#xff1a;发送ajax请求的接口模块utils工具模块&#xff1a;自己封装的一些工具方法模块components组件模块&#xff1a;全局通用的组件router路由模块&#xff1a;封装要所有路由views&#xff1a;各个页面assets&#xff1a;各种资源 van…

源码编译llama.cpp for windows on arm

源码编译llama.cpp for windows on arm 这里有编译好的&#xff0c;直接下载使用 https://github.com/turingevo/llama.cpp-build/releases 1 先编译openblas for windows on arm 查看我的文章 《源码编译 openblas for windows on arm》 2 启用OpenBlas加速 上一步openb…

Java+Jenkins实现自动化打包部署流程

目录 jenkins简介 前置依赖 1. jdk17 2.apache maven 3.8.6 3.git 4.docker 5.下载jenkins 启动配置jenkins 优缺点对比 Jenkins 的优点&#xff1a; Jenkins 的缺点&#xff1a; jenkins简介 Jenkins 是一个开源的自动化服务器&#xff0c;可以用于自动化各种任务&…