Redis 可以通过以下方式实现分布式session:
- 使用哈希表存储每个session,键为session ID,字段为session属性:
- 每个客户端将session ID发送至服务端,服务端根据session ID在Redis中读取或修改对应session。
- 该方法使用简单,但session ID可能重复的概率较高,需要考虑如何避免冲突。
例如:
// 设置session
Jedis jedis = new Jedis("localhost");
jedis.hset("session:1", "username", "user1");
jedis.hset("session:1", "password", "pwd1");
// 获取session属性
String username = jedis.hget("session:1", "username");
- 使用有序集合存储每个session,元素为session属性,分数为时间戳:
- 每次修改session时,使用ZADD命令更新 session 对应元素的分数为当前时间戳。
- 获取session时,使用ZRANGEBYSCORE命令获取指定session ID且分数最新的元素,就可以得到最新session数据。
- 这种方法可以避免重复session ID,并且每个session只保留一次修改,实现了session的轻量更新。
例如:
// 设置session
jedis.zadd("session:1", System.currentTimeMillis(), "username", "user1");
jedis.zadd("session:1", System.currentTimeMillis(), "password", "pwd1");
// 获取session
Set<Tuple> session = jedis.zrangeByScoreWithScores("session:1", 0, System.currentTimeMillis());
String username = null;
for (Tuple tuple : session) {
String key = tuple.getElement();
if (key.equals("username")) {
username = tuple.getElement();
break;
}
}