manker 2016-05-17 07:51 采纳率: 0%
浏览 1798

shiro reids session 集群问题

shiro 实现 sessionDAO保存到redis里,通过日志,shiro不断的去doUpdate或doReadSession。一个普通的JSP页面,标签for循环,导致几十次读写,影响性能?
有这方面解决办法没有?
public class RedisSessionDAO extends AbstractSessionDAO {

private static Logger logger = Logger.getLogger(RedisSessionDAO.class);
/**

  • shiro-redis的session对象前缀 */ private RedisManager redisManager;

/**

  • The Redis key prefix for the sessions */ private String keyPrefix = "shiro_redis_session:";

@Override
public void update(Session session) throws UnknownSessionException {
logger.debug("update:" + JSON.toJSONString(session));
this.saveSession(session);
}

/**

  • save session
  • @param session
  • @throws UnknownSessionException / private void saveSession(Session session) throws UnknownSessionException { if(session == null || session.getId() == null){ logger.error("session or session id is null"); return; } logger.debug("******save session key="+session.getId()+"--->"+ redisManager.getExpire()); byte[] key = getByteKey(session.getId()); byte[] value = SerializeUtils.serialize(session); session.setTimeout(redisManager.getExpire()*1000); this.redisManager.set(key, value, redisManager.getExpire()); }

@Override
public void delete(Session session) {
if(session == null || session.getId() == null){
logger.error("session or session id is null");
return;
}
logger.debug("*******remove session key="+session.getId()+"--->"+ redisManager.getExpire());
redisManager.del(this.getByteKey(session.getId()));

}

//用来统计当前活动的session
@Override
public Collection getActiveSessions() {
Set sessions = new HashSet();

Set<byte[]> keys = redisManager.keys(this.keyPrefix + "*");
if(keys != null && keys.size()>0){
    for(byte[] key:keys){
        Session s = (Session)SerializeUtils.deserialize(redisManager.get(key));
        sessions.add(s);
    }
}

return sessions;

}

@Override
protected Serializable doCreate(Session session) {
Serializable sessionId = this.generateSessionId(session);
this.assignSessionId(session, sessionId);
this.saveSession(session);
logger.debug("doCreate\n"+ JSON.toJSONString(session));
return sessionId;
}

@Override
protected Session doReadSession(Serializable sessionId) {
if(sessionId == null){
logger.error("session id is null");
return null;
}
Session session = (Session)SerializeUtils.deserialize(redisManager.get(this.getByteKey(sessionId)));
logger.debug("doReadSession:"+ JSON.toJSONString(session));
return session;
}

/**

  • 获得byte[]型的key
  • @param sessionId
  • @return */ private byte[] getByteKey(Serializable sessionId){ String preKey = this.keyPrefix + sessionId; return preKey.getBytes(); }

public RedisManager getRedisManager() {
return redisManager;
}

public void setRedisManager(RedisManager redisManager) {
this.redisManager = redisManager;

/**
 * 初始化redisManager
 */
this.redisManager.init();

}

/**

  • Returns the Redis session keys
  • prefix.
  • @return The prefix */ public String getKeyPrefix() { return keyPrefix; }

/**

  • Sets the Redis sessions key
  • prefix.
  • @param keyPrefix The prefix */ public void setKeyPrefix(String keyPrefix) { this.keyPrefix = keyPrefix; } }
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 19:30
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器