前提:安装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面试之传统五大数据类型的落地应用详解》对你有帮助,请点赞、收藏,并留下你的观点哦!