redis基本类型及微博微信中是如何应用的

2021年4月7日 8点热度 0条评论 来源: 逍遥生石敢当

目录

类型图

String

String 应用场景

session token 等

对象缓存

分布式锁

点赞次数-计数器

Hash

Hash 应用场景:

缓存对象

购物车

List

List 应用场景:

常用数据结构

微博消息

Set

Set应用场景:

支付宝天天抽奖

微信点赞

微博关注模型

ZSet

ZSet 应用场景:

微博热搜排行榜

 

类型图

redis基本类型及类型结构如下图:

以下api只是一部分,可以在官网 https://redis.io/topics/data-types-intro 进行查看全部api,下面只介绍几种常用api的及案例

String

 String redis 常用api:

  • set  key  value                              //存值
  • get  key                                         //取值
  • mset  key  value [key value ...]     //批量存储多个值
  • mget  key  [key ...]                        //批量获取多个值
  • keys pattern                                 //按照规则获取键
  • setnx  key  value                          //存入一个不存在的值,多之前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

String redis api 命令:

127.0.0.1:6379> set xiaolinzi 666
OK
127.0.0.1:6379> get xiaolinzi
"666"
127.0.0.1:6379> mset guojing 1 huangrong 2 laowantong 3 tuolei 4
OK
127.0.0.1:6379> mget guojing huangrong laowantong tuolei
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> keys *
1) "laowantong"
2) "xiaolinzi"
3) "huangrong"
4) "tuolei"
5) "guojing"
127.0.0.1:6379> del laowantong
(integer) 1
127.0.0.1:6379> keys *
1) "xiaolinzi"
2) "huangrong"
3) "tuolei"
4) "guojing"
127.0.0.1:6379> expire tuolei 3
(integer) 1
127.0.0.1:6379> keys *
1) "xiaolinzi"
2) "huangrong"
3) "guojing"
127.0.0.1:6379> get tuolei
(nil)
127.0.0.1:6379> get guojing
"1"
127.0.0.1:6379> incr guojing
(integer) 2
127.0.0.1:6379> get guojing
"2"
127.0.0.1:6379> decr guojing
(integer) 1
127.0.0.1:6379> get guojing
"1"
127.0.0.1:6379> incrby guojing 3
(integer) 4
127.0.0.1:6379> get guojing
"4"
127.0.0.1:6379> decrby guojing 2
(integer) 2
127.0.0.1:6379> get guojing
"2"

String 应用场景

session token 等

使用 set  key  value  和 get  key   放一些token和session(SpringSession)            操作                                

对象缓存

比如我们放一些对象,像商品,订单,用户等,可以先将对象Json化,然后将Json后的字符串放入redis,操作如下

127.0.0.1:6379> set product_1139 "{'brand':'xiaolinzi','color':'yello','price':'666'}"
OK
127.0.0.1:6379> get product_1139
"{'brand':'xiaolinzi','color':'yello','price':'666'}"

分布式锁

使用setnx来获取redis的分布式锁:

setnx token_123 123  返回1标识获取锁成功  返回0标识获取失败

127.0.0.1:6379> setnx token_123 123
(integer) 1
127.0.0.1:6379> setnx token_123 123
(integer) 0

点赞次数-计数器

比如上图,英雄联盟手游发了篇文章,其中的阅读量就可以用redis来实现,怎么实现呢,使用 incr key 这条命令,假如这篇文件的key为 mobilelol_article_20200425001,每当一个人来阅读这边文章时候就执行 incr mobilelol_article_20200425001 命令,来一次执行一次,然后使用 get mobilelol_article_20200425001 来取出它的值,就可以实现此功能

127.0.0.1:6379>  incr mobilelol_article_20200425001
(integer) 1
127.0.0.1:6379>  incr mobilelol_article_20200425001
(integer) 2
127.0.0.1:6379>  incr mobilelol_article_20200425001
(integer) 3
127.0.0.1:6379>  incr mobilelol_article_20200425001
(integer) 4
127.0.0.1:6379>  incr mobilelol_article_20200425001
(integer) 5
127.0.0.1:6379>  incr mobilelol_article_20200425001
(integer) 6
127.0.0.1:6379> get mobilelol_article_20200425001
"6"

Hash

Hash redis 常用api:

  • HSET  key  field  value                               //存储值
  • HGET  key  field                                          //获取值
  • HMSET  key  field  value [field value ...]     //存储多个值
  • HMGET  key  field  [field ...]                        //获取多个值
  • HSETNX  key  field  value                          //存储一个不存在的键,若之前已经存在,则存储失败 返回 0
  • HLEN  key                                                  //获取feld的数量
  • HGETALL  key                                           //返回key中所有的键值对
  • HDEL  key  field  [field ...]                          //删除值
  • HINCRBY  key  field  increment                //为key中field键的值加上增量increment

Hash redis api 命令:

127.0.0.1:6379> hset shediao guojing 1
(integer) 1
127.0.0.1:6379> hget shediao guojing
"1"
127.0.0.1:6379> hmset shediao huangrong 2 huazheng 3
OK
127.0.0.1:6379> hmget shediao huangrong huazheng
1) "2"
2) "3"
127.0.0.1:6379> hlen shediao
(integer) 3
127.0.0.1:6379> hgetall shediao
1) "guojing"
2) "1"
3) "huangrong"
4) "2"
5) "huazheng"
6) "3"
127.0.0.1:6379> hsetnx shediao laowantong 1
(integer) 1
127.0.0.1:6379> hsetnx shediao laowantong 1
(integer) 0
127.0.0.1:6379> hgetall shediao
1) "guojing"
2) "1"
3) "huangrong"
4) "2"
5) "huazheng"
6) "3"
7) "laowantong"
8) "1"
127.0.0.1:6379> hdel shediao laowantong
(integer) 1
127.0.0.1:6379> hgetall shediao
1) "guojing"
2) "1"
3) "huangrong"
4) "2"
5) "huazheng"
6) "3"
127.0.0.1:6379> hincrby shediao guojing 5
(integer) 6
127.0.0.1:6379> hget shediao guojing
"6"

 

Hash 应用场景:

缓存对象

和上面使用String缓存一个product_1345对象,如果我们使用Hash类型的话使用product加商品id作为key,他的各个属性作为field进行赋值的话,比String就方便多了,我们可以对他的任意一个属性就行修改,而String就不具有修改某个字段属性的特性,比如我们某件商品的颜色一开始是“red”,需要改成“white”,Hash就可以根据field来修改值,String就不太方便,如下面所示:

127.0.0.1:6379> hmset product_1345 product_brand iphoneXR product_price 3888 product_color red
OK
127.0.0.1:6379> hgetall product_1345
1) "product_brand"
2) "iphoneXR"
3) "product_price"
4) "3888"
5) "product_color"
6) "red"
127.0.0.1:6379> hset product_1345 product_color white
(integer) 0
127.0.0.1:6379> hgetall product_1345
1) "product_brand"
2) "iphoneXR"
3) "product_price"
4) "3888"
5) "product_color"
6) "white"

购物车

如上图购物车,我们来分析一下他是否可以使用redis的Hash类型类实现:

  1. 以用户的id为key的后缀: key = cart_10010
  2. 商品id作为field: field =  Midea_10010  SKG_10010
  3. 商品数量为value: value = 1

我们在购物车基本操作如下:

  • 添加购物车:hset
  • 增加数量:hincrby
  • 商品总数:hlen
  • 删除商品:hdel
  • 获取所有商品:hgetall cart_10010
127.0.0.1:6379> hset cart_10010 Midea_10010 1     //放入美的空调
(integer) 1
127.0.0.1:6379> hset cart_10010 SKG_10010 1       //放入按摩器 
(integer) 1
127.0.0.1:6379> hget cart_10010 Midea_10010       //看一下美的空调的数量
"1"
127.0.0.1:6379> hincrby cart_10010 Midea_10010 1  // 美的空调增加1
(integer) 2
127.0.0.1:6379> hget cart_10010 Midea_10010		  //美的空调的数量
"2"
127.0.0.1:6379> hlen cart_10010 				  //商品的总数
(integer) 2
127.0.0.1:6379> hgetall cart_10010				  //获取所有商品
1) "Midea_10010"
2) "2"
3) "SKG_10010"
4) "1"
127.0.0.1:6379> hdel cart_10010 SKG_10010       //删除商品
(integer) 1
127.0.0.1:6379> hgetall cart_10010              //再次看一下商品
1) "Midea_10010"
2) "2"

我们可以看到使用Hash比使用String是有一定优势的:可以对属性进行分类,方便管理,比String更节省空间,消耗CPU更小,但是也是有一定缺点的,不日过期功能只能使用在key上,不能使用在field上,而且集群架构下不适合大规模使用。

List

List redis 常用api:

  • lpush  key  value [value ...]       //将值放到表头(最左边)
  • rpush  key  value [value ...]      //将值放到表尾(最右边)
  • lpop  key                                  //弹出并返回key列表的头元素
  • rpop  key                                 //弹出并返回key列表的尾元素
  • lrange  key  start  stop            //遍历表中元素
  • blpop  key  [key ...]  timeout    //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 , timeout秒,如果timeout=0,一直阻塞等待
  • brpop  key  [key ...]  timeout   //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待, timeout秒,如果timeout=0,一直阻塞等待

List redis 命令:

127.0.0.1:6379> lpush shediao guojing huangrong huazheng
(integer) 3
127.0.0.1:6379> lrange shediao 0 2
1) "huazheng"
2) "huangrong"
3) "guojing"
127.0.0.1:6379> lpush shediao tuolei
(integer) 4
127.0.0.1:6379> lrange shediao 0 -1
1) "tuolei"
2) "huazheng"
3) "huangrong"
4) "guojing"
127.0.0.1:6379> rpush shediao laowantong 
(integer) 5
127.0.0.1:6379> lrange shediao 0 -1
1) "tuolei"
2) "huazheng"
3) "huangrong"
4) "guojing"
5) "laowantong"
127.0.0.1:6379> lpop shediao
"tuolei"
127.0.0.1:6379> lrange shediao 0 -1
1) "huazheng"
2) "huangrong"
3) "guojing"
4) "laowantong"
127.0.0.1:6379> rpop shediao
"laowantong"
127.0.0.1:6379> lrange shediao 0 -1
1) "huazheng"
2) "huangrong"
3) "guojing"
127.0.0.1:6379> blpop shediao 3
1) "shediao"
2) "huazheng"
127.0.0.1:6379> lrange shediao 0 -1
1) "huangrong"
2) "guojing"
127.0.0.1:6379> brpop shediao 3
1) "shediao"
2) "guojing"
127.0.0.1:6379> lrange shediao 0 -1
1) "huangrong"

List 应用场景:

常用数据结构

  • 栈    :lpush + LPOP -->FILO
  • 队列 : lpush+rpop
  • 阻塞队列(Blocking MQ): LPUSH + BRPOP

微博消息

我点击微博的刷新功能,我关注了英雄联盟神吐槽和游戏赛事君两个人微博,假设我的微博id为10010

游戏赛事君发布微博,消息id为10000:         lpush  weibo_10010  game_10000

英雄联盟神吐槽发布微博,消息id是10086:  lpush  weibo_10010  lol_10086

点击刷新查看最新消息:                                 lrange weibo_10010 0  -1

Set

Set redis 常用api:

基本命令

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

Set redis 命令:

127.0.0.1:6379> sadd shediao guojing huangrong huazheng tuolei yangkang
(integer) 5
127.0.0.1:6379> smembers shediao
1) "huazheng"
2) "tuolei"
3) "huangrong"
4) "guojing"
5) "yangkang"
127.0.0.1:6379> scard shediao
(integer) 5
127.0.0.1:6379> sismember shediao guojing
(integer) 1
127.0.0.1:6379> sismember shediao zhangwuji
(integer) 0
127.0.0.1:6379> srem shediao yangkang
(integer) 1
127.0.0.1:6379> smembers shediao
1) "huangrong"
2) "tuolei"
3) "guojing"
4) "huazheng"
127.0.0.1:6379> spop shediao 2
1) "guojing"
2) "huazheng"
127.0.0.1:6379> smembers shediao
1) "huangrong"
2) "tuolei"

操作

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

127.0.0.1:6379> sadd shediao guojing huangrong huazheng yangkang
(integer) 4
127.0.0.1:6379> sadd shendiao guojing huangrong yangguo xiaolongnv
(integer) 4
127.0.0.1:6379> sinter shediao shendiao
1) "huangrong"
2) "guojing"
127.0.0.1:6379> sinterstore sheshendiao shediao shendiao
(integer) 2
127.0.0.1:6379> smembers sheshendiao
1) "huangrong"
2) "guojing"
127.0.0.1:6379> sunion shediao shendiao
1) "yangguo"
2) "xiaolongnv"
3) "yangkang"
4) "huangrong"
5) "guojing"
6) "huazheng"
127.0.0.1:6379> sunionstore shenshediao shediao shendiao
(integer) 6
127.0.0.1:6379> smembers shenshediao
1) "yangguo"
2) "xiaolongnv"
3) "yangkang"
4) "huangrong"
5) "guojing"
6) "huazheng"
127.0.0.1:6379> sdiff shediao shendiao 
1) "huazheng"
2) "yangkang"
127.0.0.1:6379> sdiffstore diaoshenshe shediao shendiao 
(integer) 2
127.0.0.1:6379> smembers diaoshenshe
1) "huazheng"
2) "yangkang"

Set应用场景:

  • 支付宝天天抽奖

  1. 参与抽奖:sadd  choujiang userId
  2. 抽取count名中奖者:srandmember choujiang count /spop choujiang count
  • 微信点赞

  1. 点赞:sadd like_msg_10010  friend_1
  2. 取消点赞: srem like_msg_10010 friend_1
  3. 获取点赞用户列表:smembers like_msg_10010
  4. 获取点赞数量:scard like_msg_10010
  • 微博关注模型

说这个关注模型首先得说明几个前提

  xiaolinziSet(我关注的人): uzi  微博会员小秘书   lol无双小智    微博会员  55开 SDR 电竞练习生 不拉的P特

UZISet(UZI关注的人):        lol无双小智 55开 微博会员小秘书  微博会员 xiaohu

xiaozhiSet(小智关注的人): UZI 小莫

 

  • 我和UZI共同关注:sinter xiaolinziSet UZISet ----------》》uzi  微博会员小秘书   lol无双小智    微博会员
  • 我关注的人也关注UZI:sismember xiaozhiSet UZI
  • 我可能认识的人:sdiff UZISet xiaolinziSet -----------》》 xiaohu

ZSet

ZSet 常用api:

  • ZADD key score member [[score member]…]        //加入带分值元素
  • ZREM key member [member …]                            //删除元素
  • ZSCORE key member                                           //返回有序集合中元素member的分值
  • ZINCRBY key increment member                         //为有序集合中元素member的分值加上increment 
  • ZCARD key                                                           //返回有序集合中元素个数
  • ZRANGE key start stop [WITHSCORES]             //正序获取有序集合从start到stop的元素
  • ZREVRANGE key start stop [WITHSCORES]     //倒序获取有序集合从start到stop的元素
  • ZUNIONSTORE destkey numkeys key [key ...]   //并集计算
  • ZINTERSTORE destkey numkeys key [key …]   //交集计算
     

ZSet redis 命令:

7.0.0.1:6379> zadd shediao 2 huangrong 1 guojing  3 huazheng 5 yangguo 4 tuolei
(integer) 5
127.0.0.1:6379> zrange shediao 0 4
1) "guojing"
2) "huangrong"
3) "huazheng"
4) "tuolei"
5) "yangguo"
127.0.0.1:6379> zrevrange shediao 0 4
1) "yangguo"
2) "tuolei"
3) "huazheng"
4) "huangrong"
5) "guojing"
127.0.0.1:6379> zcard shediao
(integer) 5
127.0.0.1:6379> zincrby shediao 5 guojing 
"6"
127.0.0.1:6379> zrevrange shediao 0 4
1) "guojing"
2) "yangguo"
3) "tuolei"
4) "huazheng"
5) "huangrong"
127.0.0.1:6379> zscore shediao guojing
"6"
127.0.0.1:6379> zrem shediao yangguo 
(integer) 1
127.0.0.1:6379> zrevrange shediao 0 4
1) "guojing"
2) "tuolei"
3) "huazheng"
4) "huangrong"
127.0.0.1:6379> 
127.0.0.1:6379> zadd shendiao 1 guojing 2 huangrong 3 yangguo 4 xiaolongnv
(integer) 4
127.0.0.1:6379> zunionstore sheshendiao 2 shediao shendiao
(integer) 6
127.0.0.1:6379> zrange sheshendiao 0 -1
1) "huazheng"
2) "yangguo"
3) "huangrong"
4) "tuolei"
5) "xiaolongnv"
6) "guojing"
127.0.0.1:6379> zinterstore shenshediao 2 shediao shendiao
(integer) 2
127.0.0.1:6379> zrange shenshediao 0 1
1) "huangrong"
2) "guojing"

ZSet 应用场景:

微博热搜排行榜

  1. 每点击一次新闻,增加一次浏览量: zincrby hotSearch_20200426 1  接种疫苗7大建议
  2. 展示当日热搜前十: zrevrange hotSearch_20200426 0 9 withscores
  3. 七日搜索榜单计算: zunionstore hotSearch_20200420-20200426   7 hotSearch_20200420   hotSearch_20200421 hotSearch_20200422  hotSearch_20200423  hotSearch_20200424  hotSearch_20200425   hotSearch_20200426
  4. 展示七日排行版前十:zrevrange hotSearch_20200420-20200426 0 9 withscores

 

    原文作者:逍遥生石敢当
    原文地址: https://blog.csdn.net/qq_38630810/article/details/105742298
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。