Redis中的List 、Set、 Hash使用场景,用Redis写一个抽奖程序

Redis中的List、Set、Hash实际使用场景

List 结构

常见的操作:

  • LRANGE : LRANGE key start stop

# 从头到尾取出key为:testlist 的元素
LRANGE testlist 0 -1
  • LPUSH : LPUSH key element [element ...] 从上个元素左侧添加元素,或者说从头部添加。

LPUSH testlist 1 2 3 4
# 这里容易理解成摆放顺序为 1 2 3 4,实则不然。
LRANGE testlist 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
  • LPOP:LPOP key 从集合的最左侧弹出一个元素。

LTRIM:LTRIM key start stop,截取元素,类似 java List 的 subList(),截取的下标包前不包后。

  • LLEN:LLEN key 获取 list 元素个数。

  • LREM:LREM key count element删除 count 个 element 元素。当 count 为负数,从后往前删指定的 |count| 个元素

  • BLPOP/BRPOP:BLPOP key [key ...] timeout,阻塞式地从左右侧弹出一个元素,当key里没有元素能弹出时一直阻塞等待,或者重试等待timeout秒,没有元素弹出则返回nil。

Redis value存放List类型使用场景:

  1. 基于 redis 反向命令实现先进后出的队列结构:like:lpush,lpop,基于Redis的消息队列其实就是这个原理。

  2. 基于 redis 同向命令实现后进先出的栈结构:like:lpush,lpop

  3. 基于下标操作的数组结构

  4. 阻塞队列

  5. 推荐文章列表的分页查询。

Set 结构

常用命令操作:

  • SADD 添加元素:SADD key member [member ...]

  • SISMEMBER 是否是这个集合的子集:SISMEMBER key member

  • SMEMBERS 获取集合的所有元素:SMEMBERS key

  • SMOVE 从source移动元素到destination:SMOVE source destination member

  • SPO 从集合中取出count个元素并移除:SPOP key [count]

  • SRANDMEMBER 从集合中查询(并不移除)一个随机元素出来。

  • SUNION 求N个集合的并集:SUNION key [key ...]

  • SINTER 求N个集合的交集:SINTER key [key ...]

  • SDIFF 求N个集合的差集:SDIFF key [key ...]

Set结构的使用场景:

  • 取集合的交并差运算:共同好友

  • 用户随机抽奖

    准备key为prizevalue为:存放每位参与用户ID的Set集合。每次抽count个名额。

    • a:奖品多人少:srandmember prize count,count为负数时单人可以重复中奖。

    • b:奖品少人多:spop prize count,

    • c:抽取之后,奖品仍在奖池,下次还能重复中。srandmember prize count

    • d: 抽取之后,奖品直接从奖池拿走,不能重复中同一个奖,公司年会场景。spop prize count

  • 用户系统:用户打标签。某两位用户有相同的关注内容,那么后期用来做内容精准推荐。

Hash 结构

常用命令操作:

  • HSET设置key的field值:HSET key field value [field value ...]

  • HGET获取key的field值:HGET key field

  • HINCRBY 自增一个field 的int/folat,增幅为:increment HINCRBY/HINCRBYFLOAT key field increment

Hash结构的使用场景:

  • 存放商品明细信息,商品的浏览量,收藏量,下单量,可以通过field的自增来累计。

  • 用户的购物车信息。

    • 以客户id作为key,每位用户创建一个hash存储结构存储对应的购物车信息。

    • 将商品编号作为field,购买数量作为value进行存储

    • 添加商品:追加全新的field与value

    • 浏览:遍历hash

    • 更改数量:自增/自减,设置value值

    • 删除商品:删除field

    • 清空:删除key

    • 全选:hgetall

    • 购物车总数量:hlen

    • 增加某件商品的数量:hincrby

userId1:{
  “productId1”:2
  “productId2”:3
}

但是购物车商品明细数据并没有得到加速,商品信息还要二次查询数据库,面向对象再优化一把。把商品信息和购买数量再包装一层呗。

userId1:
{
  {
  “count_productId1”:2,
  “info_productId1”:"{}"
},
  {
  “count_productId2”:3,
  “info_productId2”:"{}"
},
}

好了今日 Redis的List、Set、Hash到此结束。

下期规划:

Redis中的消息订阅以及pipeline,敬请期待。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值