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<Session> getActiveSessions() {
Set<Session> sessions = new HashSet<Session>();
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;
}
}