微信接口返回的access_token默认有效期应该是7200秒(2小时)。你可以在接收到access_token后把它存储到Redis中,并设置过期时间为微信接口给的7200秒(或者稍微少一点以提供安全余量,比如7000秒)。然后在每次需要access_token时,先从Redis中获取,如果获取不到(等于null或者空字符串)就向微信接口请求新的access_token并把新的access_token存回Redis。
以下是一个简单的例子:
以下是适用RedisTemplate<Object, Object>
的改动后的例子:
java
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
// ...
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
public static final int EXPIRATION = 7000; // access token 过期时间
public static final String ACCESS_TOKEN_KEY = "wx_access_token"; // 存储到redis时的key值
@Override
public String getWXAccessToken() {
// 从Redis获取
ValueOperations<Object, Object> ops = redisTemplate.opsForValue();
String accessToken = (String) ops.get(ACCESS_TOKEN_KEY);
// 如果为空,重新拉取
if (StringUtils.isEmpty(accessToken)) {
RestTemplate restTemplate = new RestTemplate();
String apiURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiURL, String.class);
JSONObject jsonObject = JSONObject.parseObject(responseEntity.getBody());
accessToken="";
if (jsonObject.get("access_token") != null) {
accessToken= (String) jsonObject.get("access_token");
// 存入Redis并设置过期时间
ops.set(ACCESS_TOKEN_KEY, accessToken, EXPIRATION, TimeUnit.SECONDS);
}
}
return accessToken;
}
除了存储和获取access_token,还有哪些场景可以使用`RedisTemplate<Object, Object>`?
可以使用RedisTemplate<Object, Object>
来操作Redis中的各种类型的数据结构,例如String、List、Set、Hash和ZSet(sorted set)。因为它的泛型是<Object, Object>,所以在序列化和反序列化时可以处理任何数据类型,包括自定义的对象。只需要确保在序列化和反序列化时使用的是一个统一的数据类型。
以下是一些RedisTemplate可以用来处理的常见场景:
-
缓存:Redis常被用作缓存,可以缩短数据获取的时间。例如,将数据库查询的结果缓存到Redis中,在下一次需要这些数据时,先从Redis中获取,如果Redis中没有,再去数据库查询。
-
Session共享:在多服务器环境下,可以将用户的Session存储到Redis中,实现Session共享。
-
消息队列:Redis的List结构可以用作简单的消息队列,使用rpush命令(对应
RedisTemplate.opsForList().rightPush()
)可将消息添加到队列的末尾,使用lpop命令(对应RedisTemplate.opsForList().leftPop()
)可从队列的头部获取消息。 -
排行榜:Redis的ZSet(有序集合)非常适合做排行榜,ZSet中的每个元素都关联着一个double类型的分数,Redis会根据这个分数对元素进行排序。例如,可以将用户的ID作为元素,用户的积分作为分数,存入一个ZSet,就可以实现一个积分排行榜。
-
计数器:Redis的String类型的值可直接进行加减操作,可以作为各种计数器使用。例如,用于记录网站访客数,或者商品的库存数量。
以上只是Redis的部分使用场景,Redis的用途非常广泛,可以灵活根据需求选择合适的数据结构和命令。