这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
1、常用的 Redis 客户端介绍
在 Spring Boot 2.x 之后,对Redis连接的支持,默认采用了 lettuce。
Jedis api 在线网址:tool.oschina.net/uploads/api…
lettuce 官网地址:lettuce.io
概念:
Jedis:是老牌的Redis的Java实现客户端,提供了比较全面的Redis命令的支持;
Redisson:实现了分布式的可扩展的Java数据结构;
Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。
优点:
Jedis:比较全面的提供了Redis的操作特性;
Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列;
Lettuce:基于Netty框架的时间驱动的通信层,其方法调用是异步的,Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。
2、Spring Boot 整合 Jedis
我们在使用Spring Boot搭建微服务的时候,在很多时候还是需要 redis 的高速缓存来缓存一些数据,存储一些高频率访问的数据,如果直接使用redis的话又比较麻烦,这里使用jedis来实现redis缓存来达到高效缓存的目的。
2.1 引入 Jedis 依赖
1 | xml复制代码 <dependency> |
2.2 配置 application.yml
1 | yaml复制代码 spring: |
Spring Boot 没有整合 Jedis,所以需要自己写配置类,配置 JedisPool
2.3 编写Config
1 | kotlin复制代码 @Configuration |
2.4 测试1: String 类型
需求:用户输入一个key 先判断Redis中是否存在该数据 如果存在,在Redis中进行查询,并返回 如果不存在,在MySQL数据库查询,将结果赋给Redis,并返回
1 | typescript复制代码 // UserService.java |
2.5 工具类
1 | typescript复制代码 // JedisUtil.java |
2.6 测试2 :String类型
需求:用户输入一个redis数据,该key的有效期为 30 秒
1 | typescript复制代码 // UserService.java |
2.7 测试3 :Hash类型
需求:根据用户 ID 查询用户信息
先判断是否在 Redis 中存在:
如果存在,直接从 Redis 中取出;
如果不存在,从 MySQL中取出,并存入 Redis 中
1 | typescript复制代码 // User.java |
3、Spring Boot 2.x 整合 lettuce
Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。
基于Netty框架的时间驱动的通信层,其方法调用是异步的,Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。
3.1 导入依赖
1 | xml复制代码 <!-- 默认是lettuce客户端--> |
3.2 配置文件
1 | yaml复制代码 spring: |
3.3 配置类
1 | scss复制代码 // 添加使用RedisTemplate模板,不书写,使用Spring Boot 默认 |
3.3.1 配置类问题
1 | scss复制代码 @Bean |
hash 数据类型
- 原始配置文件得出结果(RedisDesktopManager显示的):
1 | css复制代码 ["com.xiaojian.pojo.User",{"id":"1103","name":"修心","age":22}] |
- 改 1
1 | json复制代码 {"id":"1105","name":"修心","age":22} |
- 改 2
1 | less复制代码 {"@class":"com.xiaojian.pojo.User","id":"1106","name":"修心","age":22} |
3.4 测试
1 | typescript复制代码 ======== |
PS: linux中查询到的中文以十六进制显示,可以通过在 redis-cli 后加 –raw,登录客户端
1 | css复制代码 [root@xiaojian bin]# ./redis-cli -a 2436 --raw |
3.5 测试1:String 类型
需求:用户输入一个key 先判断Redis中是否存在该数据 如果存在,在Redis中进行查询,并返回 如果不存在,在MySQL数据库查询,将结果赋给Redis,并返回
1 | kotlin复制代码 @Service |
3.6 测试2:String 类型
需求:用户输入一个redis数据,该key的有效期为 30 秒
1 | typescript复制代码 @Service |
3.7 测试3:Hash类型,(id必须为字符串)
需求:根据用户 ID 查询用户信息
先判断是否在 Redis 中存在:
如果存在,直接从 Redis 中取出;
如果不存在,从 MySQL 中取出,并存入 Redis 中
1 | scss复制代码 // 首先,在 RedisConfig 类中添加hash的序列化配置 |
PS: 问题
问题1:出现了许多相同的字符串 —- > 提取出来
解1:工具类
解2:实体Bean声明一个返回该本类字符串的方法
问题2:强制类型转换问题 以及 重复书写很长一段 redisTemplate.opsForHash()
解:在业务类上方声明一下变量,用变量名替换 redisTemplate.opsForHash()
1 | typescript复制代码 @Resource(name = "redisTemplate") |
4、Redis 常见应用
4.1 手机验证功能
需求:
用户在客户端输入手机号,点击发送后随即生成四位数字码,有效期60秒
输入验证码,点击验证,返回成功或者失效,且每个手机号在5分钟内只能验证3次。并给相应信息提示
4.2 限制登录功能
需求:
用户在2分钟内,仅允许输入错误密码5次;
如果超过次数,限制其登录1小时。(要求每登录失败时,都要给相应提示)
本文转载自: 掘金