在Redis中缓存用户Token的推荐方法
推荐使用字符串(String)数据结构
字符串数据结构在Redis中用于存储简单的键值对,是最基本的数据类型。由于Token本质上是键(用户ID或会话ID)和值(Token字符串)的映射,字符串类型非常适合这一用途。
演示代码:
import redis.clients.jedis.Jedis; // 导入Jedis类,用于操作Redis
import redis.clients.jedis.exceptions.JedisException; // 导入Jedis异常类
public class TokenCacheExample {
private final Jedis jedis; // 创建一个Jedis对象用于Redis操作
public TokenCacheExample(String host, int port) {
try {
jedis = new Jedis(host, port); // 尝试创建一个Jedis实例连接到指定的Redis服务器
} catch (JedisException e) {
throw new RuntimeException("Could not connect to Redis", e); // 如果连接失败,抛出运行时异常
}
}
// 缓存用户的Token
public void cacheToken(String userId, String token) {
try {
jedis.set(userId, token); // 使用Jedis的set方法将Token缓存到Redis
// 设置Token过期时间,例如1小时
jedis.expire(userId, 3600); // 使用Jedis的expire方法为Token设置过期时间
} catch (JedisException e) {
System.err.println("Error caching token: " + e.getMessage()); // 如果发生异常,打印错误信息
}
}
// 从Redis获取用户的Token
public String getToken(String userId) {
try {
return jedis.get(userId); // 使用Jedis的get方法从Redis获取Token
} catch (JedisException e) {
System.err.println("Error retrieving token: " + e.getMessage()); // 如果发生异常,打印错误信息
return null; // 返回null
}
}
// 删除用户的Token
public void removeToken(String userId) {
try {
jedis.del(userId); // 使用Jedis的del方法从Redis删除Token
} catch (JedisException e) {
System.err.println("Error removing token: " + e.getMessage()); // 如果发生异常,打印错误信息
}
}
// 查看Redis的内存使用情况
public void viewMemoryUsage() {
try {
// 获取内存使用信息
String memoryInfo = jedis.info("memory"); // 使用Jedis的info方法获取Redis的内存使用信息
System.out.println(memoryInfo); // 打印内存使用信息
} catch (JedisException e) {
System.err.println("Error viewing memory usage: " + e.getMessage()); // 如果发生异常,打印错误信息
}
}
// 关闭Redis连接
public void close() {
jedis.close(); // 使用Jedis的close方法关闭与Redis的连接
}
public static void main(String[] args) {
TokenCacheExample tokenCache = new TokenCacheExample("localhost", 6379); // 创建TokenCacheExample实例,连接到本地的Redis服务器
// 缓存Token
tokenCache.cacheToken("123", "token_value_here"); // 缓存一个用户的Token
// 从Redis获取Token
String token = tokenCache.getToken("123"); // 从Redis获取刚才缓存的Token
System.out.println("Cached Token: " + token); // 打印获取到的Token
// 查看Redis的内存使用情况
tokenCache.viewMemoryUsage(); // 打印Redis的内存使用情况
// 删除Token
tokenCache.removeToken("123"); // 从Redis删除这个用户的Token
// 关闭Redis连接
tokenCache.close(); // 关闭与Redis的连接
}
}
- 数据在redis中的存储情况
Redis数据库
|
└── keyspace (假设所有的键都存储在默认的db 0中)
|
└── "123" (用户ID作为键)
|
└── Value: "token_value_here" (Token字符串作为值)
127.0.0.1:6379> GET 123
"token_value_here"
使用string类型与使用Hash类型的对比表格
数据结构类型 | Redis命令 | Java方法 | 存储结构示例 |
---|---|---|---|
字符串(String) | SET, EXPIRE, GET | jedis.set, jedis.expire, jedis.get | "123" => "token_value_here" (用户ID: “123”, Token: "token_value) |
哈希(Hash) | HSET, HGET | jedis.hset, jedis.hget | user_tokens:123 => {token => "token_value", issue_time => "1632800400"} |