加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Redis存储总用String?你大概错过了更优的使用方法

发布时间:2019-01-28 15:42:48 所属栏目:MySql教程 来源:王清培(沪江)
导读:副标题#e# Redis为我们提供了5种数据类型,基本上我们使用频率最高的就是String,而对其他四种数据类型使用的频次稍弱于String。原因在于: String使用起来比较简单,可以方便存储复杂的对象,使用场景比较多; 由于Redis expire time只能设置在key上,像Lis

Set集合在使用场景上还是比较多和自由的。举个简单的例子,在应用系统中比较常见的就是商品、活动类场景。用一个Set缓存有效商品集合,再用一个Set缓存活动商品集合。如果商品出现上下架操作只需要维护有效商品Set,每次获取活动商品的时候需要过滤下是否有下架商品,如果有就需要从活动商品中剔除。

当然,下架的时候可以直接删除缓存的活动商品,,但是活动是从marketing系统中load出来的,就算我将cache里的活动商品删除,当下次再从marketing系统中load活动商品时候还是会有下架商品。

当然这只是举例,一个场景有不同的实现方法。

下图中左右两边是两个不同的集合:

Redis存储总用String?你大概错过了更优的使用方法

左边是营销域中的可用商品ids集合,右边是营销域中活动商品ids集合,中间计算出两个集合的交集。

  1. SADD set:marketing:product:available:ids 1000100 1000120 1000130 1000140 1000150 1000160  
  2.  
  3. SMEMBERS set:marketing:product:available:ids  
  4. 1) "1000100"  
  5. 2) "1000120"  
  6. 3) "1000130"  
  7. 4) "1000140"  
  8. 5) "1000150"  
  9. 6) "1000160"   
  10. SADD set:marketing:activity:product:ids 1000100 1000120 1000130 1000140 1000200 1000300  
  11.  
  12. SMEMBERS set:marketing:activity:product:ids  
  13. 1) "1000100"  
  14. 2) "1000120"  
  15. 3) "1000130"  
  16. 4) "1000140"  
  17. 5) "1000200"  
  18. 6) "1000300"  
  19.  
  20. SINTER set:marketing:product:available:ids set:marketing:activity:product:ids  
  21. 1) "1000100"  
  22. 2) "1000120"  
  23. 3) "1000130"  
  24. 4) "1000140" 

在一些复杂的场景中,也可以使用SINTERSTORE命令将交集计算后的结果存储在一个目标集合中。这在使用pipeline命令管道中特别有用,将SINTERSTORE命令包裹在pipeline命令串中可以重复使用计算出来的结果集。

由于Redis是Signle-Thread单线程模型,基于这个特性我们就可以使用Redis提供的pipeline管道来提交一连串带有逻辑的命令集合,这些命令在处理期间不会被其他客户端的命令干扰。

5)Zset

Zset排序集合与Set集合类似,但是Zset提供了排序的功能。在介绍Set集合的时候我们知道Set集合中的成员是无序的,Zset填补了集合可以排序的空隙。

Zset最强大的功能就是可以根据某个score比分值进行排序,这在很多业务场景中非常急需。比如,在促销活动里根据商品的销售数量来排序商品,在旅游景区里根据流入人数来排序热门景点等。基本上人们在做任何事情都需要根据某些条件进行排序。

其实Zset在我们应用系统中能用到地方到处都是,这里我们举一个简单的例子,在团购系统中我们通常需要根据参团人数来排序成团列表,大家都希望参加那些即将成团的团。

下图是一个根据团购code创建的Zset,score分值就是参团人数累加和:

Redis存储总用String?你大概错过了更优的使用方法

  1. ZADD zset:marketing:groupon:group:codes 5 G_PXYJY9QQFA 8 G_4EXMT6NZJQ 20 G_W7BMF5QC2P 10 G_429DHBTGZX 8 G_KHZGH9U4PP  
  2. ZREVRANGEBYSCORE zset:marketing:groupon:group:codes 1000 0  
  3. 1) "G_W7BMF5QC2P"  
  4. 2) "G_ZMZ69HJUCB"  
  5. 3) "G_429DHBTGZX"  
  6. 4) "G_KHZGH9U4PP"  
  7. 5) "G_4EXMT6NZJQ"  
  8. 6) "G_PXYJY9QQFA"   
  9.  
  10. ZREVRANGEBYSCORE zset:marketing:groupon:group:codes 1000 0 withscores  
  11.  1) "G_W7BMF5QC2P"  
  12.  2) "20"  
  13.  3) "G_ZMZ69HJUCB"  
  14.  4) "10" 
  15.  5) "G_429DHBTGZX"  
  16.  6) "10"  
  17.  7) "G_KHZGH9U4PP"  
  18.  8) "8"  
  19.  9) "G_4EXMT6NZJQ"  
  20. 10) "8"  
  21. 11) "G_PXYJY9QQFA"  
  22. 12) "5" 

Zset本身提供了很多方法用来进行集合的排序,如果需要score分值,可以使用withscore字句带出每一项的分值。

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读