redis zset转set 反序列化失败_Redis只往zset有序集合添加不存在的数据:关键字索引查询构建+源码分析...
Redis的有序集合Sorted Set(zset),可以很方便地用來構(gòu)建關(guān)鍵字索引表,可以很方便地實(shí)現(xiàn)支持超大規(guī)模并發(fā)的關(guān)鍵字組合條件查詢。
比如有套博客系統(tǒng),博客文章存放在 hash 類型 article:* 中,其中的每個(gè)關(guān)鍵字對(duì)應(yīng)的文章存放在 keyword:* 中,則可以用關(guān)鍵字連接查詢 ZINTERSTORE 找到文章ID列表:
添加文章
方便起見,以node-redis添加hash為例:
client.hmset('article:001', { title: 'test1', content: '....', keywords: 'redis,技術(shù)' })
client.hmset('article:002', { title: 'test2', content: '..', keywords: 'redis' })
client.hmset('article:003', { title: 'test3', content: '....', keywords: 'redis,技術(shù)' })
client.hmset('article:004', { title: 'test4', content: '..', keywords: '技術(shù)' })
創(chuàng)建索引
zadd keyword:redis 1540736588833 001 1540736588833 002 1540736588833 003
zadd keyword:技術(shù) 1540736588833 001 1540736588833 003 1540736588833 004
1540736588833是權(quán)重值,是當(dāng)前時(shí)間的毫秒值,代表什么時(shí)侯添加的這些關(guān)鍵字。
連接查詢
ZINTERSTORE out 2 keyword:技術(shù) keyword:redis
此時(shí)out中就會(huì)存放包含有技術(shù)和redis兩個(gè)關(guān)鍵字的文章ID,即 001 和 003
只更新不存在的索引
有時(shí)侯,我們可能在構(gòu)建索引時(shí)不影響原有索引的權(quán)重值,以此來保留每個(gè)關(guān)鍵字最初添加時(shí)的時(shí)間(權(quán)重分?jǐn)?shù))。以此來統(tǒng)計(jì)某個(gè)時(shí)間段添加此關(guān)鍵字的文章。
比如article:004添加了新的關(guān)鍵字redis,而且是和“技術(shù)”關(guān)鍵字一起提交的,此時(shí)會(huì)更新索引:
zadd keyword:技術(shù)? 1550736588800 004
zadd keyword:redis 1550736588800 004
但是我們不希望 keyword:技術(shù) 的權(quán)重更新,因?yàn)榇岁P(guān)鍵字已經(jīng)存在了,則直接使用 NX 即可:
zadd keyword:技術(shù)? ?nx? 1550736588800 004
zadd keyword:redis? nx? 1550736588800 004
然后比如說現(xiàn)在想提取昨天之前添加的“技術(shù)“文章ID,則直接按score權(quán)重查詢即可:
zrangebyscore?keyword:技術(shù) 0 1550736588800
這在某些場(chǎng)景中非常有用,比如說銷售給某些客戶添加了“無意向客戶“標(biāo)簽,后來在銷售的努力下將其轉(zhuǎn)化成了“潛在客戶“,之后又轉(zhuǎn)化成了“簽單客戶”,為了考核銷售員業(yè)績(jī),?需要統(tǒng)計(jì)每周/每月的轉(zhuǎn)化個(gè)數(shù),可以用此種方法可計(jì)算某個(gè)時(shí)間段內(nèi)添加該標(biāo)簽的客戶ID。
還有一些其他的參數(shù):
XX: 僅僅更新存在的成員,不添加新成員。
NX: 不更新存在的成員。只添加新成員。
CH: 修改返回值為發(fā)生變化的成員總數(shù),原始是返回新添加成員的總數(shù) (CH 是 changed 的意思)。更改的元素是新添加的成員,已經(jīng)存在的成員更新分?jǐn)?shù)。 所以在命令中指定的成員有相同的分?jǐn)?shù)將不被計(jì)算在內(nèi)。注:在通常情況下,ZADD返回值只計(jì)算新添加成員的數(shù)量。
INCR: 當(dāng)ZADD指定這個(gè)選項(xiàng)時(shí),成員的操作就等同ZINCRBY命令,對(duì)成員的分?jǐn)?shù)進(jìn)行遞增操作。
同樣可以使用XX來更新只存在的成員,可在一些特殊場(chǎng)景中使用。
分析 t_zset.c 的源碼可知,這些參數(shù)是可以一起使用的,比如incr和XX/NX同時(shí)使用:
/* Parse options. At the end 'scoreidx' is set to the argument position
* of the score of the first score-element pair. */
scoreidx = 2;
while(scoreidx < c->argc) {
char *opt = c->argv[scoreidx]->ptr;
if (!strcasecmp(opt,"nx")) flags |= ZADD_NX;
else if (!strcasecmp(opt,"xx")) flags |= ZADD_XX;
else if (!strcasecmp(opt,"ch")) flags |= ZADD_CH;
else if (!strcasecmp(opt,"incr")) flags |= ZADD_INCR;
else break;
scoreidx++;
}
/* Turn options into simple to check vars. */
int incr = (flags & ZADD_INCR) != 0;
int nx = (flags & ZADD_NX) != 0;
int xx = (flags & ZADD_XX) != 0;
int ch = (flags & ZADD_CH) != 0;
總結(jié)
以上是生活随笔為你收集整理的redis zset转set 反序列化失败_Redis只往zset有序集合添加不存在的数据:关键字索引查询构建+源码分析...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软计划在 Win11 开始菜单中引入小
- 下一篇: mysql5.7.18压缩包下载_Cen