redis五种数据类型

1. 字符串类型

1.1 常用API

SET key value                       //存入字符串键值对  

MSET key value [key value ..]..     //批量存储字符串键值对  

SETNX key value                     //存入-个不存在的字符串键值对  

GET key                             //获取一个字符串键值  

MGET key [key ...]                  //批量获取字符串键值  

DEL key [key ..]                    //删除一个键  

EXPIRE key seconds                  //设置一个键的过期时间(秒)  

INCR key                            //将key中储存的数字值加1  

DECR key                            //将key中储存的数字值减1  

INCRBY key increment                //将key所储存的值加上increment  

DECRBY key decrement                //将key所储存的值减去decrement  

1.2 应用场景

单值设置和获取不在过多赘述,相信大家都已经掌握哦

SET key value                       //单值缓存设置
GET key                             //单值缓存获取       

对象缓存(以mysql数据表结构和内容为例)

idnamebalance
1xz122
2xm445
3xf32112
4xg44
5xb55656
SET  user:1 value                                 //value为json格式数据
MSET user:1:name xz user: 1:balance 122           //设置缓存内容
MGET user:1:name user:1:balance                   //获取缓存内容  

存储上述mysql表中用户详情内容大家一般会用以上那种方法去操作?当然,了解hash数据结构的,以下方式都不太适合,这里只是拿SET和MSET做一个对比,方便大家理解记忆。

1. 使用json方式缓存,这样更新比较麻烦,每次更新都需要json序列化和反序列化等操作
2. 方式二更新就很简单了,直接设置用户单个属性字段即可

(以mysql数据表结构和内容为例)

分布式锁

SETNX product:10001 true                    //返回1代表获取锁成功,返回0代表获取锁失败
DEL product:10001                           //执行完业务释放锁
SET product:10001 true ex 10 nx             //防止程序意外终止导致死锁

计数器(我们经常会看到某篇文章被阅读了多少次之类的,就可以用下面API实现)

INCR article:readcount:{文章id} 
GET article:readcount:{文章id}

其他

  • Web集群session共享

    • spring session + redis实现session共享
  • 分布式系统全局序列号

    • INCRBY orderld 1000 //redis批量生成序列号提升性能

      2. Hash类型

      2.1 常用API

      HSET key field value                       //存储个哈希表key的键值  
      
      HSETNX key field value                     //存储一个不存在的哈希表key的键值  
      
      HMSET key field value [field value ..]     //在一个哈希表key中存储多个键值对  
      
      HGET key field                             //获取哈希表key对应的field键值  
      
      HMGET key field [field ..]                 //批量获取哈希表key中多个field键值  
      
      HDEL key field [field .]                   //删除哈希表key中的field键值  
      
      HLEN key                                   //返回哈希表key中field的数量  
      
      HGETALL key                                //返回哈希表key中所有的键值  
      
      HINCRBY key field increment                //为哈希表key中field键的值加上增量increment

      2.2 应用场景

      对象缓存(以mysql数据表结构和内容为例)

      idnamebalance
      1xz122
      2xm445
      3xf32112
      4xg44
      5xb55656
      HMSET user {userld}:name xz {userld}:balance 122        //格式
      HMSET user 1:name xz 1:balance 122                      //缓存设置
      HMGET user 1:name 1:balance                             //缓存获取

      以电商购物车商品用hash实现一下(如下图)

      hash.png

      电商购物车

      以用户id为key
      商品id为field
      商品数量为value

      购物车操作

      添加商品                 hset cart:1001 10088 1
      增加数量                 hincrby cart:1001 10088 1
      商品总数                 hlen cart:1001
      删除商品                 hdel cart:1001 10088
      获取购物车所有商品        hgetall cart:1001
      当然,有了商品的id,其他数据均可以用ajax去动态获取即可,这里不再过多赘述

      字符串类型与hash类型对比

  • 优点

    • 同类数据归类整合储存,方便数据管理
    • 相比string操作消耗内存与qpu更小
    • 相比string储存更节省空间
  • 缺点

    • Redis集群架构下不适合大规模使用
    • Redis集群架构下不适合大规模使用
      Redis集群架构

3. list类型

3.1 常用API

list类型图

LPUSH  key value [value...]                       //将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key value [value...]                       //将一个或多个值value插入到key列表的表头(最右边)
LPOP   key                                        //移除并返回key列表的头元素
RPOP   key                                        //移除并返回key列表的尾元素
LRANGE key start stop                             //返回列表key中指定区间内的元素,区间以偏移量start和stop指定

BLPOP  key [key ...] timeput                      //以key列表表头弹出一个元素,若列表中没有元素,阻塞等待,timeout秒如果timeout=0,一直阻塞等待
BRPOP  key [key ...] timeout                      //Mkey列表表尾弹出一个元素,若列表中没有元素,阻塞等待,timeout秒如果timeout=0,一直阻塞等待

常用数据结构

Stack(栈) = LPUSH + LPOP                   //FILO  先进后出
Queue(队列) = LPUSH + RPOP                 //FIFO  先进先出
Blocking MQ(阻塞队列) = LPUSH + BRPOP

3.2 应用场景

以微信公共号推送文章给其粉丝为例(若小明(id=117)关注了"男港萌图"和"Java架构师编程"等公共号)

微信公共号推送文章列表

男港萌图 和 Java架构师编程分别给粉丝推送一篇文章。

LPUSH msg:117 10016                              //男港萌图 发文章 ,消息ID为10016
LPUSH msg:117 10015                              //Java架构师编程 发文章 ,消息ID为10015
LRANGE msg:117 0 5                               // 查看最新微博消息

考虑一个问题,如果某大V粉丝特别多,用上述方法推送给其每个粉丝显然是不可取的,可能导致redis直接挂掉, 这时候我们可以将某大V消息推送到一个公用的队列,然后粉丝去拉去文章

4. list类型

4.1 常用API

4.11 SET常用操作

SADD key member [member ..]                 //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member ..]                 //从集合key中删除元素
SMEMBERS key                                //获取集合key中所有元素
SCARD key                                   //获取集合key的元素个数
SISMEMBER key member                        //判断member元素是否存在于集合key中
SRANDMEMBER key [count]                     //从集合key中选出count个元素,元素不从key中删除
SPOP key [count]                            //从集合key中选出count个元素,元素从key中删除

4.12 SET常用运算操作

SINTER key [key ...]                         //交集运算
SINTERSTORE destination key [key ...]        //将交集结果存入新集合destination中
SUNION key [key .]                           //并集运算
SUNIONSTORE destination key [key ...]        //将并集结果存入新集合destination中
SDIFF key [key ...]                          //差集运算
SDIFFSTORE destination key [key ...]         //将差集结果存入新集合destination中

4.2 应用场景

4.2.1 微信抽奖小程序

抽奖

SADD key {userId}                            //点击去抽奖加入集合
SMEMBERS key                                 //查看参与抽奖所有用户
SRANDMEMBER key [count]                      //抽取count名中奖者(Srandmember则仅仅返回随机元素,而不对集合进行任何改动)
SPOP key [count]                             //抽取count名中奖者(将随机元素从集合中移除并返回)

4.2.2 微信点赞、收藏、标签

微信点赞

SADD like:{消息ID} {用户ID}                   //点赞
SREM like:{消息ID} {用户ID}                   //取消点赞
SISMEMBER like:{消息ID} {用户ID}              //检查用户是否点过赞
SMEMBERS like:{消息ID}                        //获取点赞的用户列表
SCARD like:消息ID}                            //获取点赞用户数

4.2.3 集合操作

set.png

SINTER set1 set2 set3            //交集{c}            
SUNION set1 set2 set3            //并集{a,b,c,d,e}   
SDIFF set1 set2 set3             //差集{a},相当于set1和(set2与set2)的并集的差集

4.2.4 集合操作实现微博微信关注模型

实现微博微信关注

{b,c,d}                                          //aSet用户关注的人
{a,c,d,e}                                        //bSet用户关注的人
{a,b,d,e,f}                                      //cSet用户关注的人
SINTER aSet bSet                                 //aSet用户和bSet用户共同关注{c,d} 
//aSet用户关注的人bSet用户也关注了
SISMEMBER bSet b                                 
SISMEMBER bSet c
SISMEMBER bSet d

SDIFF bSet aSet                                  //我可能认识的人{e}

4.2.5 集合操作实现京东参数筛选

京东.png

SADD screensize:>=78  RedmiMax98 Hisense85E7F TCL85Q6 KONKAT86 Huiwei87   //屏幕大于等于78寸的商品集合 
SADD brand:huiwei     Huiwei87
SADD brand:Hisense    Hisense85E7F    Hisense98E                          //海信品牌商品集合
SINTER brand:Hisense  screensize:>=78                                     //交集商品Hisense85E7F  

注意:当然你可以直接把商品的ID直接存进来,我这里是为了便于理解,用品牌加型号代替啦

5. ZSET类型

333333.png

5.1 常用API

5.11 ZSET常用操作

ZADD key score member [[score member]..]                            //往有序集合key中加入带分值元素
ZREM key member [member ..]                                         //从有序集合key中删除元素
ZSCORE key member                                                   //返回有序集合key中元素member的分值
ZINCRBY key increment member                                        //为有序集合key中元素member的分值加Eincrement
ZCARD key                                                           //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]                                  //正序获取有序集合key从start下标到stop下标的元素,
                                                                    其中成员的位置按分数值递增(从小到大)来排序,
                                                                    下标参数start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推.
                                                                    你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推.
ZREVRANGE key start stop [WITHSCORES]                               //倒序获取有序集合key从start下标到stop下标的元素

5.12 ZSET常用运算操作

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]   //并集计算,给定的一个或多个有序集的并集,
                                                                                                        其中给定key的数量必须以numkeys参数指定,并将该并集(结果集)储存到 destination.
//并集计算 
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]   //交集计算,给定的一个或多个有序集的交集,
                                                                                                      其中给定key的数量必须以numkeys参数指定,并将该交集(结果集)储存到destination.

5.2 应用场景

5.2.1 Zset集合操作实现排行榜

weibolist.png

ZINCRBY hotNews:20201202 1                                                                       //点击新闻(这是2020中国青年的样子articleId 100)
ZREVRANGE hotNews:20201202 0 10 WITHSCORES                                                       //展示当日排行前十
ZUNIONSTORE hotNews:20201129-20201202 4   hotNews:20201129 hotNews:20201130... hotNews:20201202  //4日搜索榜单计算          
ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES                                              //展示七日排行前十
Last modification:December 3, 2020
如果觉得我的文章对你有用,请随意赞赏