在很多平台都可以看到自己的最近商品或文章的浏覽記錄,要麼保持最近1000條記錄(如知乎的最近浏覽記錄),要麼是100條,那如何在不創建多餘的表的情況下而直接用緩存達到這個目标呢?
基礎要求極其思路1.技術選型:redis2.在每次浏覽的時候去緩存中記錄這條記錄的ID3.确保記錄最大條數隻能達到設置的阈值,比如10004.記錄不能重複且按照時間倒序排序,舉例:昨天浏覽的記錄,今天再次浏覽時之前的記錄删除,隻保留今天浏覽的記錄和時間5.持久化,浏覽記錄持久存在
1.使用redis的zset,用戶唯一ID作為key,用戶訪問記錄ID作為value,訪問時間作為分數score2.每次浏覽記錄向該用戶集合中插入一條記錄,插入前判斷是否有舊的記錄,有則删除,然後添加,每次插入的記錄時間戳遞增,借助zset本身的有序性,很容易實現查詢排序翻轉3.插入後獲取總記錄,如果大于阈值,則删除阈值之外更舊的記錄,時間倒序
實現步驟
Stringkey="wangsr0001";
for(inti=0;i<200;i ){
TimeUnit.SECONDS.sleep(1L);
StringrandomChineseName=RandomPersonInfoUtil.getRandomTelephoneNumber();
redisTemplate.opsForZSet().add(key,randomChineseName,System.currentTimeMillis());
}
/**
*新閱讀記錄插入
*@authorwjl
*/
@Test
publicvoidinsertTest(){
//key
Stringkey="wangsr0001";
//阈值
longtop=200;
//新訪問記錄ID
Stringvalue="15646051140";
Doublescore=redisTemplate.opsForZSet().score(key,value);
//檢索是否有舊記錄1.無則插入記錄值2.有則删除再次插入
if(null!=score){
//删除舊的
redisTemplate.opsForZSet().remove(key,value);
}
//加入新的記錄,設置當前時間戳為分數score
redisTemplate.opsForZSet().add(key,value,System.currentTimeMillis());
//獲取總記錄數
LongaLong=redisTemplate.opsForZSet().zCard(key);
if(aLong>top){
//獲取阈值200之後的記錄(0,1]并移除
redisTemplate.opsForZSet().removeRange(key,0,aLong-top-1);
}
}
/**
*列表查詢
*@authorwjl
*/
@Test
publicvoidscanTest(){
Stringkey="wangsr0001";
longstart=1;
longsize=10;
Set<ZSetOperations.TypedTuple>scoreWithScores=redisTemplate.opsForZSet().reverseRangeWithScores(key,start-1,size-1);
Iterator<ZSetOperations.TypedTuple>iterator=scoreWithScores.iterator();
BigDecimalbigDecimal=null;
while(iterator.hasNext()){
ZSetOperations.TypedTuplenext=iterator.next();
bigDecimal=BigDecimal.valueOf(next.getScore());
System.out.println("==》ID:" next.getValue() "時間:" bigDecimal.toPlainString());
}
}
最後
#程序員##知乎##曆史記錄##緩存#
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!