前提:
配置SpringBoot,见此地址:
JavaEE:SpringBoot基本配置_a526001650a的专栏-CSDN博客
JavaEE:Redis集群搭建(真)_a526001650a的专栏-CSDN博客
一、配置Redis信息:
1.导入Redis依赖包,在工程/pom.xml中:
<dependencies>
<!-- 导入redis依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
</dependencies>
2.配置Redis服务IP和端口(在工程/src/main/resources/application.yml中):
spring:
redis:
#方式一:配置连接单台Redis服务器地址
database: 0 #redis中数据库序号
password: yyh12345 #Redis连接密码,没设密码可以不写
host: 192.168.233.129 #IP地址
port: 6379 #端口
timeout: 5000 #超时时间,单位:毫秒
poolMaxTotal: 100 #允许的最大连接数
poolMaxIdle: 10 #最大空闲连接数
poolMaxWait: -1 #最大等待时间,值小于0为没有限制
#方式二(配置Redis哨兵):
#database: 0 #选择第0个数据库
#password: yyh12345 #redis密码
#sentinel: #配置Redis哨兵,有了此配置,不用再单独配置Redis的host+port了
#master: mymaster #配置master名称
#nodes: 192.168.233.133:26379, 192.168.233.134:26379, 192.168.233.135:26379 #配置所有哨兵节点
#方式三:配置连接Redis集群服务器地址
#database: 0 #选择第0个数据库
#password: yyh12345 #redis密码
#cluster:
#nodes: 192.168.233.133:6379, 192.168.233.136:6379,192.168.233.137:6379,192.168.233.138:6379,192.168.233.139:6379,192.168.233.140:6379
server: #当前服务端口
port: 8080
二、创建数据存储与获取业务类:
StringRedisTemplate操作字符串类型,继承RedisTemplate。
1.使用RedisTemplate存储/获取数据:
@Component
public class RedisBiz {
@Autowired
private RedisTemplate<String, String> redisTemplate; //Redis数据操作类
//从redis获取数据
public String getValue(String key) {
if(redisTemplate.hasKey(key)){
return redisTemplate.boundValueOps(key).get();
//(String) return redisTemplate.opsForValue().get(key); //同上
}
return null;
}
//将数据存入redis
public void setValue(String key, String value) {
redisTemplate.boundValueOps(key).set(value);
//return redisTemplate.opsForValue().set(key, value); //同上
}
//从redis中删除数据
public void delete(String key) {
return redisTemplate.delete(key);
}
//批量查询,mget方式
public List<Object> batchQuery1(List<String> keys) {
return redisTemplate.opsForValue().multiGet(keys);
}
//批量查询,pipeline方式
public List<Object> batchQuery2(final List<String> keys) {
List<Object> list = redisTemplate.executePipelined(new RedisCallback<String>() {
@Override
public String doInRedis(RedisConnection conn) throws DataAccess {
StringRedisConnection src = (StringRedisConnection) conn;
for (String key: keys) {
src.get(key);
}
return null;
}
});
return list;
}
}
2.测试效果:
@Controller
public class UserController {
@Autowired
private RedisBiz redisBiz;
@RequestMapping("/setValue")
@ResponseBody
public String setValue() {
redisBiz.setValue("key2", "value2");
return "成功";
}
@RequestMapping("/getValue")
@ResponseBody
public String getValue() {
return redisBiz.getValue("key2");
}
}
三、使用Redis存储token(分布式session):
1.使用redis存储用户token:
@PostMapping("/login")
public String login(String phone, String code, String redirectUrl, HttpServletRequest request, HttpServletResponse response) {
//...省略验证手机号/验证码逻辑
//1.根据手机号从库中查出用户信息
User user = ...;
//2.生成token,并缓存到redis+cookie中
String token = jwtUtil.genToken(String userNo, String phone);
user.setToken(token);
redisTemplate.opsForValue().set("USER_" + token, gson.toJson(user));;
Cookie c = new Cookie("USER", gson.toJson(user));
c.setDomain("yyh.com");
c.setPath("/");
response.addCookie(c);
return String.format("redirect:%s", redirectUrl);
}
2.退出登录时删除redis中token:
@PostMapping("/logout")
public String logout(HttpServletRequest request, HttpServletResponse response) {
//...省略获取/验证token逻辑
//1.清除redis中的token
redisTemplate.delete("USER_" + token);
//2.清除cookie中token
Cookie c = new Cookie("USER", null);
c.setDomain("yyh.com");
c.setPath("/");
c.setMaxAge(-1);
response.addCookie(c);
return "login";
}