使用Redis的有序集合(Sorted Set)来存储搜索记录,以时间戳作为分数,实现按时间倒序查询;
1、在Java项目中,添加Jedis依赖。如果使用Maven构建项目,可以在pom.xml文件中添加以下依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.5.2</version>
</dependency>
2、定义一个SearchRecord类来表示搜索记录,包含以下属性:
import java.time.LocalDateTime;
public class SearchRecord {
private int userId;
private String searchContent;
private LocalDateTime createTime;
// getter and setter methods
}
3、定义一个SearchRecordDao类,用于对搜索记录进行增删改查操作,具体代码如下:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class SearchRecordDao {
private final Jedis jedis;
public SearchRecordDao(Jedis jedis) {
this.jedis = jedis;
}
public void addRecord(SearchRecord searchRecord) {
String key = "search_history:" + searchRecord.getUserId();
double score = searchRecord.getCreateTime().toEpochSecond(ZoneOffset.UTC);
String value = searchRecord.getSearchContent();
jedis.zadd(key, score, value);
}
public List<SearchRecord> queryRecords(int userId) {
String key = "search_history:" + userId;
Set<Tuple> tuples = jedis.zrevrangeWithScores(key, 0, -1);
List<SearchRecord> records = new ArrayList<>();
for (Tuple tuple : tuples) {
String value = tuple.getElement();
double score = tuple.getScore();
LocalDateTime createTime = LocalDateTime.ofInstant(Instant.ofEpochSecond((long) score), ZoneOffset.UTC);
SearchRecord record = new SearchRecord();
record.setUserId(userId);
record.setSearchContent(value);
record.setCreateTime(createTime);
records.add(record);
}
return records;
}
}
4、在业务代码中,创建SearchRecordDao对象,并调用其方法来实现搜索记录的增加和查询操作。以下是示例代码:
// 创建SearchRecordDao对象
Jedis jedis = new Jedis("localhost", 6379);
SearchRecordDao searchRecordDao = new SearchRecordDao(jedis);
// 添加搜索记录
SearchRecord searchRecord1 = new SearchRecord();
searchRecord1.setUserId(1);
searchRecord1.setSearchContent("Java");
searchRecord1.setCreateTime(LocalDateTime.now());
searchRecordDao.addRecord(searchRecord1);
SearchRecord searchRecord2 = new SearchRecord();
searchRecord2.setUserId(1);
searchRecord2.setSearchContent("Redis");
searchRecord2.setCreateTime(LocalDateTime.now());
searchRecordDao.addRecord(searchRecord2);
// 查询搜索记录
List<SearchRecord> records = searchRecordDao.queryRecords(1);
for (SearchRecord record : records) {
System.out.println(record.getSearchContent() + " - " + record.getCreateTime());
}
// 关闭Jedis连接
jedis.close();
你可以根据实际需求进行优化和扩展