利用redis来存储数据,优先访问redis,再访问数据库,提高查询效率。
实际开发中有单节点,哨兵进程管理主从,两两相连的cluster.
而redis-cluster是通过key连接槽道,槽道连接指定节点。若节点宕机,可以通过迁移槽道,做到key的迁移。
主节点和从节点做备份,集群各节点之前两两相连。
进入任意节点,查看状态
]# redis-cli -c -h [host] -p [port] //进入指定节点
]# cluster nodes //获取节点状态
集群中有3个master,3个slave, 各节点之间两两相连。每个master有一个slave备份。
上述信息的含义是:
1.节点ID 2.节点IP:端口号 3.节点角色 4.当前主节点ID 5.创建时间 6.操作时间 7.在集群中的编号 8.状态 9.所属于的槽道
application.properties添加配置:
# redis配置
# 单节点
#spring.redis.host=
#spring.redis.port=9000
# 哨兵集群
#spring.redis.sentinel.nodes=10.9.9.9:26379,10.10.0.0:26380
#spring.redis.sentinel.master=zbmaster
# redis-cluster集群
spring.redis.cluster.nodes=10.42.154.11:8000,10.42.154.11:8001,10.42.154.11:8002
pom.xml配置
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-redisartifactId>
dependency>
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
dependency>
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-redisartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-pool2artifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-redisartifactId>
dependency>
编写一个登陆接口,将登陆信息存放在cookie和redis中,读取显示一下
controller
将ticket存入cookie
@RequestMapping("/user/manage/login")
public SysResult doLogin(User user, HttpServletRequest request, HttpServletResponse response) {
String ticker = iuser.doLogin(user);
if ("".equals(ticker) || ticker == null) {
return SysResult.build(201, "登录失败", null);
}else {
CookieUtils.setCookie(request, response, "EM_TICKER", ticker);
return SysResult.ok();
}
}
先查询redis是否已经存在key,存在则删除
再计算新的(ticket, 用户信息json)写入redis.
@Override
public String doLogin(User user) {
String ticket="";
//数据库中查询的操作忽略了,这里只是一个演示,不重要
ticket="EM_TICKET_"+user.getUser_name()+System.currentTimeMillis();
String loginKey="login_"+user.getUser_name();
if(template.hasKey(loginKey)){
//登录过,取ticket
String ticketLaster=template.opsForValue().get(loginKey);
//删除ticket记录
template.delete(ticketLaster);
}
try {
String userJson=mapper.writeValueAsString(user);
template.opsForValue().set(ticket,userJson,
60*60*2, TimeUnit.SECONDS);
template.opsForValue().set(loginKey,ticket,
60*60*2,TimeUnit.SECONDS);
return ticket;
} catch (JsonProcessingException e) {
e.printStackTrace();
return "";
}
}