首先介绍下,redis 有五大数据结构, String , List , Hash , Zset (有序集) , Set (无序)
利用Zset的有序性 , 无重复 的特性, 正好适用于搜索记录等场景.
redisson提供的api
/**
* 添加缓存Set
*
* @param key 缓存Key
* @param value 缓存内容
*/
public static void setScoreSortedSet(String key, Object value, long expireTime) {
RScoredSortedSet<String> set = redissonClient.getScoredSortedSet(key);
// 序列化
if (value instanceof String) {
set.remove(value);
set.add(System.currentTimeMillis(), (String) value);
} else {
set.remove(JSON.toJSONString(value));
set.add(System.currentTimeMillis(), JSON.toJSONString(value));
}
// 存入缓存
redissonClient.getKeys().expire(key, expireTime, TimeUnit.SECONDS);
}
/**
* 获取缓存Set
*
* @param key 缓存Key
* @return 缓存内容
*/
public static List<String> getScoreSortedSet(String key) {
RScoredSortedSet<String> set = redissonClient.getScoredSortedSet(key);
if (!set.isExists()) {
return null;
}
// 取出RScoredSortedSet的值
List<String> strings = (List<String>) set.readAll();
// 翻转list 默认顺序是根据score 从小到大
Collections.reverse(strings);
return strings;
}
ScoreSortedSet 是redisson提供的实现了Zset的数据类型, 相较于set, 在添加元素进集的时候, 需要给定一个score, score决定了该元素的在集里的顺序.
小tips:
1.可以使用时间戳来作为score.
2.在添加时, 先remove该元素, 否则add失败. 这样即使之前add过了, 重新add时, 也会重置score.
3.查询时, 顺序为score 从小到大, 所以根据使用场景, 可以将结果反转.