如何使用redis快取來實現使用者最近瀏覽的商品列表

2021-08-07 22:13:50 字數 3407 閱讀 7303

1,最近瀏覽的記錄肯定是需要失效時間的

確定使用快取,快取可以設定失效時間(最大設定為乙個月,但是這已經足夠了),如果使用mysql等資料庫,還需要定時任務清除,很明顯是不切合實際的,

2,最近瀏覽的記錄肯定是有個數限制的,不可能記錄所有的瀏覽記錄

目前使用的主流快取有 memached和redis兩種(原諒無知的我並不清楚其他的),redis有ltrm來修剪,保證儲存的瀏覽的條數;

3,我們需要在**新增儲存瀏覽商品的方法

使用者最近瀏覽的商品,肯定是再使用者最近開啟商品詳情頁的時候才算瀏覽,這點毋庸置疑;

4,怎麼保證每次新增的瀏覽的商品列表按著瀏覽的先後順序排序?

每次使用者的瀏覽商品的id,可以以使用者的id作為key,以list作為value,儲存在redis中,而list是有序的,而且,在使用lrange的時候能保證先進後出,後進先出的原則,已達到排列在最前面的商品始終是裡當前最近瀏覽的那個商品;

5,怎麼保證使用者在連續瀏覽同乙個商品的時候,不會重複儲存商品?

可以使用redis中lrem來移除列表中與引數 value(該商品id) 相等的元素。同時在使用lpush重新再list插入最新的瀏覽商品;

6,讀取快取的時候,又該如何保證分頁?

redis中的lrange可以指定獲取指定長度的元素,能夠滿足需要;

1,儲存使用者瀏覽的商品:

使用者在開啟詳情頁的時候,以使用者id作key,商品的id做值,以list存入redi快取中;

在加入新增快取之前,為了保證瀏覽商品的 唯一性,每次新增前,使用lrem將快取的list中該商品id去掉,在加入,以保證其瀏覽的最新的商品在最前面;

在lpush到redis的list中之後,根據產品需求還需要將該list的前60個資料之外的快取修剪掉;

最後新增快取失效時間30天;

2.獲取使用者最近瀏覽的商品列表:

根據使用者的id及當前的頁數和每頁的個數,來獲取商品快取;

1,根據使用者id和商品id存入到快取中:

public void addmemberresentgoods(long memberid, long templateid)
2,根據使用者的id,分頁獲取最近瀏覽的商品:

public mapquerymemberresentgoods(long memberid, int page, int pagesize)
補充:  下面是一些根據業務需要用 jedis 封裝的 上面的 redisservice 

public inte***ce  redisservice
redisserviceimpl 實現類,這裡沒有必要完全按照這個來,自己可以直接可以直接 看看 jedis 裡的 方法,自己封裝一些自己適合的方法

public class redisserviceimpl implements redisservice ";

private static final string subs_cmd = "local v=redis.call('incrby',keys[1],0);local r=argv[1]-v;redis.call('set',keys[1],argv[1]);return r;";

private volatile string cas_key;

private volatile string subs_key;

private string redisaddr;

private string addrinfo;

private pooljedispool;

private string sentinels;

private long redissubmaintaininterval = 10000;

private int maxactive = 10;

private int maxidle = 5;

private int timeout = 2000;

private string password;

public void setpassword(string password)

public void setredisaddr(string redisaddr)

public void setmaxactive(int maxactive)

public void setmaxidle(int maxidle)

public void setsentinels(string sentinels)

public void init()

jedispoolconfig cfg = new jedispoolconfig();

cfg.setmaxidle(maxidle);// 設定最大連線數

cfg.setmaxtotal(maxactive); //add by chenxinchao 20151016

if (!stringutil.isblank(sentinels))

if(stringutils.isnotblank(password))else

} else

// load cas scripts

jedis jedis = jedispool.getresource();

try finally

}public void stop()

}@override

public long llen(string key) catch (jedisconnectionexception e) finally }}

@override

public listlrange(string key, final long start, final long end) catch (jedisconnectionexception e) finally }}

@override

public boolean expire(string key, int seconds) catch (jedisconnectionexception e) finally }}

@override

public string ltrim(string key, long start, long end) catch (jedisconnectionexception e) finally }}

@override

public long lpush(string key, string string) catch (jedisconnectionexception e) finally }}

@override

public long lrem(string key, long count, string value) catch (jedisconnectionexception e) finally }}

}

如何實現用rsync來同步備份資料

我在安裝最新版本的opensolaris時,常是全新安裝。我比較不想用公升級的方式,主要原因是信不過程式設計師,哈哈,公升級產生的問題還蠻多的。由於是全新安裝,就涉及到資料的備份。這裡我用的是rsync。步驟如下 假設伺服器ip為 192.168.0.3,請在實際使用中相應修改。1。安裝 rsync...

使用Redis實現cookie快取

session 會話,儲存在伺服器端,一般可以用來記錄使用者的登入狀態,也可以用來存一些如購物車之類的資料。cookie 儲存在瀏覽器端,可以用來記錄身份,儲存sessionid有簽名cookie和令牌cookie。儲存使用者的瀏覽記錄,攜帶cookie訪問網頁完成身份校驗,並將瀏覽記錄與訪問時間一...

利用redis實現使用者簽到

很多 都提供了簽到功能 這裡不考慮資料落地事宜 並且需要展示最近乙個月的簽到情況,如果使用bitmap我們怎麼做?一言不合亮 redis new redis redis connect 127.0.0.1 使用者uid uid 1 記錄有uid的key cachekey sprintf sign d...