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; } }