失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Redis面试之传统五大数据类型的落地应用详解

Redis面试之传统五大数据类型的落地应用详解

时间:2023-10-14 17:43:11

相关推荐

Redis面试之传统五大数据类型的落地应用详解

前提:安装redis6.0.8

Redis官网:https://redis.io/

Redis中文网:/

redis基本类型:

stringlistsetzset(sorted set)hash

注意1:命令不区分大小写,但是key是区分大小写的。

127.0.0.1:6379> set K1 V1OK127.0.0.1:6379> set k1 v2OK127.0.0.1:6379> get K1"V1"127.0.0.1:6379> get k1"v2"127.0.0.1:6379>

K1和k1的值是不同的。

注意2:help @+类型名词,查询命令。例如help @list

127.0.0.1:6379> help @listBLPOP key [key ...] timeoutsummary: Remove and get the first element in a list, or block until one is availablesince: 2.0.0BRPOP key [key ...] timeoutsummary: Remove and get the last element in a list, or block until one is availablesince: 2.0.0BRPOPLPUSH source destination timeoutsummary: Pop a value from a list, push it to another list and return it; or block until one is availablesince: 2.2.0LINDEX key indexsummary: Get an element from a list by its indexsince: 1.0.0LINSERT key BEFORE|AFTER pivot valuesummary: Insert an element before or after another element in a listsince: 2.2.0LLEN keysummary: Get the length of a listsince: 1.0.0LPOP keysummary: Remove and get the first element in a listsince: 1.0.0

1.string类型使用场景?

常规用法:

SET key value

GET key

127.0.0.1:6379> set k1 ct1OK127.0.0.1:6379> set k2 ct2OK127.0.0.1:6379> get k1"ct1"

同时设置/获取多个键值

MSET key value [key value…]

MGET key [key…]

127.0.0.1:6379> mset k3 ct3 k4 ct4OK127.0.0.1:6379> mget k3 k41) "ct3"2) "ct4"

数值增减

1.递增数字: INCR key(可以不用预先设置key的数值。如果预先设置key但值不是数字,则会报错)

127.0.0.1:6379> incr d1(integer) 1127.0.0.1:6379> incr d1(integer) 2127.0.0.1:6379> incr d1(integer) 3127.0.0.1:6379> incr d1(integer) 4127.0.0.1:6379>

增加指定的整数: INCRBY key increment

127.0.0.1:6379> incrby d1 2(integer) 6127.0.0.1:6379> incrby d1 2(integer) 8

递减数值: DECR key

127.0.0.1:6379> decr d1(integer) 7127.0.0.1:6379> decr d1(integer) 6127.0.0.1:6379> decr d1(integer) 5

减少指定的整数: DECRBY key decrement

127.0.0.1:6379> decrby d1 2(integer) 3127.0.0.1:6379> decrby d1 2(integer) 1

获取字符串长度:STRLEN key

127.0.0.1:6379> strlen d1(integer) 1

分布式锁

SETNX key value

SET key value [EX seconds] [PX milliseconds] [NX|XX]

EX:key在多少秒之后过期

PX:key在多少毫秒之后过期

NX:当key不存在的时候,才创建key,效果等同于setnx

XX:当key存在的时候,覆盖key

127.0.0.1:6379> set k1 v1 EX 20OK127.0.0.1:6379> ttl k1(integer) 17127.0.0.1:6379> get k1"v1"127.0.0.1:6379> ttl k1(integer) 11127.0.0.1:6379> get k1"v1"127.0.0.1:6379> ttl k1(integer) 6127.0.0.1:6379> get k1"v1"127.0.0.1:6379> ttl k1(integer) -2

应用场景

假如电商网站,某种商品,喜欢这个商品的人就点一下赞,不喜欢的就踩一下,分别记录喜欢和不喜欢的人数。

还有假如发布博客的点赞数,收藏的文章数据,商品编号,订单号的生成等等。

我们都可以这么写

127.0.0.1:6379> incr items:10(integer) 1127.0.0.1:6379> incr items:10(integer) 2127.0.0.1:6379> incr items:10(integer) 3127.0.0.1:6379> incr items:10(integer) 4127.0.0.1:6379> get items:10"4"

2.hash类型使用场景?

Redis的Hash类型相当于Java中Map<String, Map<key, value>>

一次设置一个字段值 HSET key field value

127.0.0.1:6379> hset user id 110(integer) 1127.0.0.1:6379> hset user name ct(integer) 1

一次获取一个字段值 HGET key field

127.0.0.1:6379> hget user id"110"127.0.0.1:6379> hget user name"ct"127.0.0.1:6379>

一次设置多个字段值 HMSET key field value [field value …]

127.0.0.1:6379> hmset user age 18 sex manOK

一次获取多个字段值 HMGET key field [field …]

127.0.0.1:6379> hmget user age sex1) "18"2) "man"

获取所有字段值 HGETALL key

127.0.0.1:6379> hgetall user1) "id"2) "110"3) "name"4) "ct"5) "age"6) "18"7) "sex"8) "man"

获取某个key内的全部数量 HLEN

127.0.0.1:6379> hlen user(integer) 4

删除一个key HDEL

127.0.0.1:6379> hdel user age(integer) 1127.0.0.1:6379> hgetall user1) "id"2) "110"3) "name"4) "ct"5) "sex"6) "man"

应用场景:

电商项目里的购物车,订餐等

购物车编号:shopcar:01

新增商品:shop001

127.0.0.1:6379> hset shopcar:01 shop001 1(integer) 1

新增商品 :shop002

127.0.0.1:6379> hset shopcar:01 shop002 1(integer) 1

增加商品数量:shop001

127.0.0.1:6379> hincrby shopcar:01 shop001 1(integer) 2

商品总数

127.0.0.1:6379> hlen shopcar:01(integer) 2

查看购物车信息

127.0.0.1:6379> hgetall shopcar:011) "shop001"2) "2"3) "shop002"4) "1"

3.list类型使用场景

向列表左边添加元素 LPUSH key value [value …]

127.0.0.1:6379> lpush list1 1 2 2 3 3 4 5(integer) 7127.0.0.1:6379> lrange list1 0 -1 //全部遍历1) "5"2) "4"3) "3"4) "3"5) "2"6) "2"7) "1"

有序有重复

向列表右边添加元素 RPUSH key value [value …]

127.0.0.1:6379> rpush list1 6(integer) 8127.0.0.1:6379> rpush list1 7(integer) 9127.0.0.1:6379> rpush list1 8(integer) 10127.0.0.1:6379> lrange list1 0 -11) "5"2) "4"3) "3"4) "3"5) "2"6) "2"7) "1"8) "6"9) "7"10) "8"

查看列表 LRANGE key start stop

lrange list1 0 -1 //全部遍历

获取列表中元素的个数 LLEN key

127.0.0.1:6379> llen list1(integer) 10

应用场景:

微信文章订阅公众号:一个人可以订阅多个公众号,假如用户【likeauthor:L001 】分别订阅了【11】和【22】作者的文章,就把【11】和【22】放到用户【likeauthor:L001 】list里,然后展示给用户。

127.0.0.1:6379> lpush likeauthor:L001 11 22(integer) 2127.0.0.1:6379> lrange likeauthor:L001 0 -11) "22"2) "11"

4.set类型使用场景

无序无重复

添加元素 SADD key member [member …]

127.0.0.1:6379> sadd set1 2 3 3 5 4 1 5(integer) 5127.0.0.1:6379> smembers set11) "1"2) "2"3) "3"4) "4"5) "5"

删除元素 SREM key member [member …]

127.0.0.1:6379> srem set1 5(integer) 1127.0.0.1:6379> smembers set11) "1"2) "2"3) "3"4) "4"

获取集合中的所有元素 SMEMBERS key

127.0.0.1:6379> smembers set11) "1"2) "2"3) "3"4) "4"

判断元素是否在集合中 SISMEMBER key member

127.0.0.1:6379> sismember set1 2(integer) 1

获取集合中的元素个数 SCARD key

127.0.0.1:6379> scard set1(integer) 4

从集合中随机弹出一个元素,元素不删除 SRANDMEMBER key [数字]

127.0.0.1:6379> srandmember set1//不写默认是1个,写几个就是几个"4"127.0.0.1:6379> srandmember set1"2"127.0.0.1:6379> scard set1(integer) 4

从集合中随机弹出一个元素,出一个删一个 SPOP key[数字]

127.0.0.1:6379> spop set1 //不写默认是1个,写几个就是几个"1"127.0.0.1:6379> scard set1(integer) 3

集合运算

集合的差集运算A - B

属于A但不属于B的元素构成的集合

SDIFF key [key …]

127.0.0.1:6379> sadd set1 1 2 3(integer) 3127.0.0.1:6379> sadd set2 2 3 4(integer) 3127.0.0.1:6379> sdiff set1 set21) "1"

集合的交集运算A ∩ B

属于A同时也属于B的共同拥有的元素构成的集合

SINTER key [key …]

127.0.0.1:6379> sinter set1 set21) "2"2) "3"

集合的并集运算A U B

属于A或者属于B的元素合并后的集合

SUNION key [key …]

127.0.0.1:6379> sunion set1 set21) "1"2) "2"3) "3"4) "4"

应用场景1:

微信小程序抽奖,发布某个抽奖活动,点击【立即参与】,就会把当前用户的ID存到set里,然后用spop命令

10个人,抽3个二等奖,1个一等奖

127.0.0.1:6379> sadd set3 1 2 3 4 5 6 7 8 9 10(integer) 10127.0.0.1:6379> spop set3 31) "5"2) "7"3) "10"127.0.0.1:6379> spop set3 11) "1"127.0.0.1:6379> smembers set31) "2"2) "3"3) "4"4) "6"5) "8"6) "9"

应用场景2:

微信朋友圈点赞,发布一条朋友圈,好久点赞了,就把好友id放到set里

127.0.0.1:6379> sadd message:01 user1 user2(integer) 2127.0.0.1:6379> smembers message:011) "user2"2) "user1"

取消点赞

127.0.0.1:6379> srem message:01 user1(integer) 1127.0.0.1:6379> smembers message:011) "user2"

展现点赞过的用户

127.0.0.1:6379> smembers message:011) "user2"

点赞用户统计,就是常见红色数字

127.0.0.1:6379> scard message:01(integer) 1

判断某个朋友是否对你点赞过

127.0.0.1:6379> sismember message:01 user3(integer) 0

应用场景3:

微博好友共同关注的人

127.0.0.1:6379> sadd s1 1 2 3 4 5(integer) 5127.0.0.1:6379> sadd s2 3 4 5 6 7(integer) 5127.0.0.1:6379> sinter s1 s21) "3"2) "4"3) "5"

我关注的人也关注它(大家爱好相同)

127.0.0.1:6379> sadd s1 1 2 3 4 5(integer) 5127.0.0.1:6379> sadd s2 3 4 5 6 7(integer) 5127.0.0.1:6379> sismember s1 3(integer) 1127.0.0.1:6379> sismember s2 3(integer) 1

QQ内推,可能认识的人

127.0.0.1:6379> sadd s1 1 2 3 4 5(integer) 5127.0.0.1:6379> sadd s2 3 4 5 6 7(integer) 5127.0.0.1:6379> sdiff s1 s21) "1"2) "2"127.0.0.1:6379> sdiff s2 s11) "6"2) "7"

5.zset类型使用场景

向有序集合中加入一个元素和该元素的分数

添加元素 ZADD key score member [score member …]

127.0.0.1:6379> zadd zset1 100 mov1 80 mov2(integer) 2

按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素 ZRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zrange zset1 0 -11) "mov2"2) "mov1"

获取元素的分数 ZSCORE key member

127.0.0.1:6379> zscore zset1 mov1"100"

删除元素 ZREM key member [member …]

127.0.0.1:6379> zrem zset1 mov1(integer) 1127.0.0.1:6379> zrange zset1 0 -11) "mov2"

获取指定分数范围的元素 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

127.0.0.1:6379> zrange zset1 0 -11) "mov2"127.0.0.1:6379> zadd zset1 70 mov3(integer) 1127.0.0.1:6379> zadd zset1 60 mov4(integer) 1127.0.0.1:6379> zadd zset1 50 mov5(integer) 1127.0.0.1:6379> ZRANGEBYSCORE zset1 60 701) "mov4"2) "mov3"

增加某个元素的分数 ZINCRBY key increment member

127.0.0.1:6379> ZINCRBY zset1 5 mov5"55"

获取集合中元素的数量 ZCARD key

127.0.0.1:6379> zcard zset1(integer) 4

获得指定分数范围内的元素个数 ZCOUNT key min max

127.0.0.1:6379> zcount zset1 55 70(integer) 3

按照排名范围删除元素 ZREMRANGEBYRANK key start stop

127.0.0.1:6379> ZREMRANGEBYRANK zset1 3 4(integer) 1127.0.0.1:6379> ZRANGE zset1 0 -11) "mov5"2) "mov4"3) "mov3"

获取元素的排名

从小到大 ZRANK key member

127.0.0.1:6379> ZRANK zset1 mov3//索引从0开始的(integer) 2

从大到小 ZREVRANK key member

127.0.0.1:6379> ZREVRANK zset1 mov3//索引从0开始的(integer) 0

应用场景:

1.定义商品销售排行榜,key为goods,分数为销售量

商品编号1001销量9,商品编号1002销售15

127.0.0.1:6379> zadd goods 9 1001 15 1002(integer) 2

客户买了2件1001,销量+2

127.0.0.1:6379> zincrby goods 2 1001"11"

求商品销售量前10名

127.0.0.1:6379> zrange goods 0 9 withscores1) "1001"2) "11"3) "1002"4) "15"

2.抖音热搜

点击视频

127.0.0.1:6379> ZINCRBY hotvcr 1 mov1"1"127.0.0.1:6379> ZINCRBY hotvcr 1 mov2"1"127.0.0.1:6379> ZINCRBY hotvcr 5 mov1"6"127.0.0.1:6379> ZINCRBY hotvcr 11 mov2"12"

展示当日排行榜前10条

127.0.0.1:6379> ZREVRANGE hotvcr 0 9 withscores1) "mov2"2) "12"3) "mov1"4) "6"

如果觉得《Redis面试之传统五大数据类型的落地应用详解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。