Bootstrap

使用Redis来实现查询历史搜索记录的功能

使用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();

你可以根据实际需求进行优化和扩展

;