Jedis 是直连模式,在多个线程间共享⼀个 Jedis 实例时是线程不安全的,需要使⽤连接池
其API提供了⽐较全⾯的Redis命令的⽀持,相⽐于其他Redis 封装框架更加原⽣Jedis中的⽅法调⽤是⽐较底层的暴露的Redis的API,Java⽅法基本和Redis的API保持着⼀致使⽤阻塞的I/O,⽅法调⽤同步,程序流需要等到socket处理完I/O才能执⾏,不⽀持异步操作。
lettuce:⾼级Redis客户端,⽤于线程安全同步,异步响应基于Netty的的事件驱动,可以在多个线程间并发访问,通过异步的⽅式可以更好的利⽤系统资源
springboot 底层使用的是lettuce。
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
// 同时还需要导入web的依赖
2、在application中配置好连接
server:
port:
spring:
redis:
host:
port:
password:
存入redis里面的内容必须先实现序列化\
RedisTemplet 的序列化配置
@Configuration
public class RedisTemplateConfiguration {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使⽤Jackson2JsonRedisSerialize 替换认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置key和value的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置hashKey和hashValue的序列化规则
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
// 设置⽀持事物
redisTemplate.setEnableTransactionSupport(true);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
使用连接池配置
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
lettuce:
pool:
# 连接池最⼤连接数(使⽤负值表示没有限制)
max-active: 10
# 连接池中的最⼤空闲连接
max-idle: 10
# 连接池中的最⼩空闲连接
min-idle: 0
# 连接池最⼤阻塞等待时间(使⽤负值表示没有限制)
max-wait: -1ms
Kaptcha 框架介绍
⾕歌开源的⼀个可⾼度配置的实⽤验证码⽣成⼯具
验证码的字体/⼤⼩/颜⾊
验证码内容的范围(数字,字⺟,中⽂汉字!)
验证码图⽚的⼤⼩,边框,边框粗细,边框颜⾊
验证码的⼲扰线 验证码的样式(⻥眼样式、3D、普通模糊)
<!--kaptcha依赖包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
/** * 模拟在浏览器中生成一个验证码的过程 * */ @RestController @RequestMapping("/api/v1/captcha") public class CaptchaController { @Autowired private StringRedisTemplate redisTemplate; @Autowired // 将conf里面的captChaProducer注入 ,实现验证码的配置 private Producer captChaProducer; @GetMapping("get_captcha") public void getCaptcha(HttpServletRequest request, HttpServletResponse response){ String text = captChaProducer.createText(); // 获取验证码 String key = getCaptchaKey(request); // 设置string类型的key和value,并且过期时间是10min ---> 后面两个参数是过期时间和单位 redisTemplate.opsForValue().set(key,text,10, TimeUnit.MINUTES); // 将文本类型的验证码转换成图片类型 BufferedImage image = captChaProducer.createImage(text); ServletOutputStream outputStream =null; try { outputStream = response.getOutputStream(); ImageIO.write(image,"jpg",outputStream); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } private String getCaptchaKey(HttpServletRequest request){ String ip = CommonUtil.getIpAddr(request); String userAgent = request.getHeader("user-Agent"); // md5 是为了防止加起来的过长 String key = "user-service:captcha"+CommonUtil.MD5(ip+userAgent); return key; } }
@RequestParam(value = "to",required = true) 将请求映射到路径上
压力测试jmeter