Spring Data Redis(二)-- 序列化
默认序列化方案
在上一篇文章《Spring Data Redis(一)》中,我们执行了这样一个操作:
1 | redisTemplate.opsForValue().set("student:1","kirito"); |
在上一篇文章《Spring Data Redis(一)》中,我们执行了这样一个操作:
1 | redisTemplate.opsForValue().set("student:1","kirito"); |
谈及系统优化,缓存一直是不可或缺的一点。在缓存中间件层面,我们有 MemCache,Redis 等选择;在系统分层层面,又需要考虑多级缓存;在系统可用性层面,又要考虑到缓存雪崩,缓存穿透,缓存失效等常见的缓存问题… 缓存的使用与优化值得我们花费一定的精力去深入理解。《Spring Data Redis》这个系列打算围绕 spring-data-redis 来进行分析,从 hello world 到源码分析,夹杂一些不多实战经验(经验有限),不止限于 spring-data-redis 本身,也会扩展谈及缓存这个大的知识点。
至于为何选择 redis,相信不用我赘述,redis 如今非常流行,几乎成了项目必备的组件之一。而 spring-boot-starter-data-redis 模块又为我们在 spring 集成的项目中提供了开箱即用的功能,更加便捷了我们开发。系列的第一篇便是简单介绍下整个组件最常用的一个工具类:RedisTemplate。
该系列介绍一些 java 开发中常用的一些小技巧,多小呢,从不会到会只需要一篇文章这么小。这一篇介绍如何使用 jdk 自带的扩展包配合 Intellij IDEA 实现远程 debug。
项目中经常会有出现这样的问题,会令程序员抓狂:关键代码段没有打印日志,本地环境正常生产环境却又问题… 这时候,远程 debug 可能会启动作用。
准备一个 RestController 用于接收请求,最后可以通过本地断点验证是否成功开启了远程 debug
在前面的章节,并发操作要么发生在单个应用内,一般使用基于 JVM 的 lock 解决并发问题,要么发生在数据库,可以考虑使用数据库层面的锁,而在分布式场景下,需要保证多个应用实例都能够执行同步代码,则需要做一些额外的工作,一个最典型分布式同步方案便是使用分布式锁。
分布式锁由很多种实现,但本质上都是类似的,即依赖于共享组件实现锁的询问和获取,如果说单体式应用中的 Monitor 是由 JVM 提供的,那么分布式下 Monitor 便是由共享组件提供,而典型的共享组件大家其实并不陌生,包括但不限于:Mysql,Redis,Zookeeper。同时他们也代表了三种类型的共享组件:数据库,缓存,分布式协调组件。基于 Consul 的分布式锁,其实和基于 Zookeeper 的分布式锁大同小异,都是借助于分布式协调组件实现锁,大而化之,这三种类型的分布式锁,原理也都差不多,只不过,锁的特性和实现细节有所差异。
控制并发的方法很多,从最基础的 synchronized,juc 中的 lock,到数据库的行级锁,乐观锁,悲观锁,再到中间件级别的 redis,zookeeper 分布式锁。特别是初级程序员,对于所谓的锁一直都是听的比用的多,第一篇文章不深入探讨并发,更多的是一个入门介绍,适合于初学者,主题是“根据并发出现的具体业务场景,使用合理的控制并发手段”。
由一个大家都了解的例子引入我们今天的主题:并发
在开始这篇文章之前,我们似乎应该思考下为什么需要搞清楚 Spring Security 的内部工作原理?按照第二篇文章中的配置,一个简单的表单认证不就达成了吗?更有甚者,为什么我们不自己写一个表单认证,用过滤器即可完成,大费周章引入 Spring Security,看起来也并没有方便多少。对的,在引入 Spring Security 之前,我们得首先想到,是什么需求让我们引入了 Spring Security,以及为什么是 Spring Security,而不是 shiro 等等其他安全框架。我的理解是有如下几点:
1 在前文的介绍中,Spring Security 支持防止 csrf 攻击,session-fixation protection,支持表单认证,basic 认证,rememberMe… 等等一些特性,有很多是开箱即用的功能,而大多特性都可以通过配置灵活的变更,这是它的强大之处。
2 Spring Security 的兄弟的项目 Spring Security SSO,OAuth2 等支持了多种协议,而这些都是基于 Spring Security 的,方便了项目的扩展。
3 SpringBoot 的支持,更加保证了 Spring Security 的开箱即用。
4 为什么需要理解其内部工作原理? 一个有自我追求的程序员都不会满足于浅尝辄止,如果一个开源技术在我们的日常工作中十分常用,那么我偏向于阅读其源码,这样可以让我们即使排查不期而至的问题,也方便日后需求扩展。
5 Spring 及其子项目的官方文档是我见过的最良心的文档!~~ 相比较于 Apache 的部分文档 ~~
这一节,为了对之前分析的 Spring Security 源码和组件有一个清晰的认识,介绍一个使用 IP 完成登录的简单 demo。
前面的部分,我们关注了 Spring Security 是如何完成认证工作的,但是另外一部分核心的内容:过滤器,一直没有提到,我们已经知道 Spring Security 使用了 springSecurityFillterChian 作为了安全过滤的入口,这一节主要分析一下这个过滤器链都包含了哪些关键的过滤器,并且各自的使命是什么。
由于过滤器链路中的过滤较多,即使是 Spring Security 的官方文档中也并未对所有的过滤器进行介绍,在之前,《Spring Security(二)–Guides》入门指南中我们配置了一个表单登录的 demo,以此为例,来看看这过程中 Spring Security 都帮我们自动配置了哪些过滤器。
1 | Creating filter chain: o.s.s.web.util.matcher.AnyRequestMatcher@1, |
就在最近,项目组开始强调开发规范了,今天分享一个变量名命名不规范的小案例,强调一下规范的重要性。例子虽小,但却比较有启发意义。
16 年底,阿里公开了《Java 开发规范手册》,其中有一条便是“布尔类型不能以 is 为前缀”。规范中没有举出例子,但是给出了原因:会导致部分序列化框架的无法解析。
看看错误的示范,会导致什么问题,以 Spring 中的 jdbcTemplate 来进行实验。
上一篇文章《Spring Security(一)–Architecture Overview》,我们介绍了 Spring Security 的基础架构,这一节我们通过 Spring 官方给出的一个 guides 例子,来了解 Spring Security 是如何保护我们的应用的,之后会对进行一个解读。
[TOC]
1 | <dependencies> |
由于我们集成了 springboot,所以不需要显示的引入 Spring Security 文档中描述 core,config 依赖,只需要引入 spring-boot-starter-security 即可。
上一篇文章《Spring Security(二)–Guides》,通过 Spring Security 的配置项了解了 Spring Security 是如何保护我们的应用的,本篇文章对上一次的配置做一个分析。
[TOC]
Update your browser to view this website correctly.&npsb;Update my browser now