如果你想进大厂,做一个享受996福报的搬砖打工仔,那么,Redis就是你不得不拥有的板砖之一了。因为Redis是如此之屌,以致于大厂几乎所有的后端技术都不得不它。想想每年疯狂的双十一,618,各种秒杀活动,流量爆棚的场景,如果让你去设计这些系统,你会怎么做?想想就很刺激。
Redis是个啥
如果你不知道Redis是个啥,那么建议亲出门左拐,慢走,不送哈!
Redis是由意大利大神Salvatore Sanfilippo在搞副业的时候,不小心写的一个Key-Value存储系统。哎,大神就是大神,搞副业的过程一不小心就搞出个这么吊炸天的项目,这里献上我的膝盖骨。
平时普通程序员接触最多的就是MySQL这个关系型数据库了(不要告诉我你不知道MySQL是个啥哈),一些小公司小项目基本上用MySQL就能轻松搞定了。
但是咱们都是有理想的年轻人啊,当然要进大厂嘛,之所以大,就是因为他们用户多,流量高啊,也意味着钱多嘛!哈哈哈哈……而且逢年过节喜欢搞个秒杀了,促销了,这种高并发,高可用场景,如果直接进入MySQL,就很容易把数据库打崩咯,打崩了,意味着系统挂了,系统挂了意味着你没砖可搬了,没砖可搬意味着你就要滚蛋了,所以,就问你慌不慌?
所以,就需要引入缓存中间件。这时候,你翻了翻网络,发现目前市面上用的最多的就是Redis和Memcached了
综合对比和考虑了一下,觉得还是Redis更适合我们的业务场景。至于更细节的对比有时间再写吧,其实这个网上一大堆,随便找找就清楚了,主要是因为我懒,哈哈哈……
基本的数据结构
下面五个是Redis最基础的数据结构:
String
字符串是Redis中最简单的数据类型
基本使用:
set key value
get key
SET和GET是设置和检索字符串值的方式,注意,SET执行的是一个赋值操作,意味着如果键已经存在,它会替换已存储的现有值。
应用场景:
1)值可以是各种字符串(包括二进制数据),例如缓存jpeg图像、HTML片段或页面,但是值不能大于512M。
List
一个有序元素的序列,底层实现是链表;这意味着即使列表中有数百万个元素,也可以很快的添加元素,但是查找元素就不是那么快了,但是可以解决的。
基本使用:
rpush mylist myvalue1
lpush mylist myvalue2
lrange mylist 0 -1
rpop mylist
rpush将一个新元素添加到列表尾部
lpush将一个新元素添加到列表头部
lrange从列表中获取指定范围内的元素,-1指最后一个元素
rpop从列表尾部弹出元素,弹出意味着检索并删除元素的操作
应用场景:
1)将用户发布的最新的朋友圈动态存储在Redis列表;
2)当用户访问某宝首页的时候,使用lrange获取最新的10个产品广告;
3)实现异步队列,即消费者-生产者模式,生产者将内容lpush到列表中,消费者rpop内容进行消费操作;不过要注意当没有消息消费时,消费者会被迫等待一段时间并使用rpop重试,这时候我们可以添加一个sleep操作,使它等待一段时间,也可以用Redis提供的brpop和blpop命令,阻塞他们,直到新的消息到来;
Hash
由与值关联的字段组成的映射;
基本使用:
hmset user:1000 name mortal birthday 1996
hget user:1000 name
hgetall user:1000
hmset设置散列的多个字段;
hget获取某个字段值;
hmget获取多个字段值;
hgetall获取指定键的所有值;
应用场景:
1)由于散列中的字段数量存储没有实际限制(当然必须在可用内存之内),所以可以根据应用场景随机使用;
Set
唯一的、无序的字符串集合;底层实现是哈希表,所以添加、删除、查找的复杂度都是常数时间内。
基本使用:
sadd myset 1 2 3
smembers myset
sismember myset 3
sadd向集合添加一个或多个元素;
smembers返回集合中的所有元素;
sismember判断元素是否是集合的成员;
应用场景:
1)实现标签功能;
2)实现棋牌游戏;
Sorted Set
有序集合,和集合一样也是string类型元素的集合,且不允许重复的元素;而且每个元素都会关联一个double类型的分数,从而实现元素的排序。底层实现是跳跃表和哈希表;
基本操作:
zadd mortal 1996 "Alan Kay"
zrange mortal 0 -1
zrange mortal 0 -1 withscores
zrangebyscore mortal -inf 1950 # 返回分数在负无穷到1950间的所有元素
zadd向有序集合添加一个或多个元素;如果存在则更新元素分数;
zrange通过索引区间返回有序集合指定区间内的成员;
zrangebyscore通过分数返回有序集合指定区间内的成员;
应用场景:
1)排行榜问题;
2)实现延时队列;使用时间戳作为score,消息内容作为key雕有zadd来生产消息,消费者用zrangebyscore命令获取指定区间内的数据进行轮询处理。
进阶数据结构
但是上面五个只是最基本的数据结构,大部分打工仔都知道,如果你想成为更高级的打工仔,那么还需要知道以下几个:
HyperLogLog
这是Redis中用来做基数统计的算法;其优点是,在输入元素的数量或体积非常非常大时,计算基数所需空间总是固定的,并且很小。想想就很刺激,每个HyperLogLog键只需要12kb的内存,就能计算接近2^64个不同元素的基数。
注:基数一个数据集中不重复元素的个数;
应用场景:
1)统计在线用户数;
2)统计注册IP数;
3)统计PV/UV数;
Geo
主要用户存储地理位置信息,想想用这个功能来做一些地图相关的产品就很刺激;比如打车软件中某一范围内的司机数,计算不同位置之间的距离等;
Pub/Sub
发布订阅是一种消息通信方式,发送者发送消息,订阅者接收消息;而且可以实现1:N的消息队列,但是,在消费者下线的情况下,生产的消息会丢失,这时候就需要使用专业的消息队列如Kafka、RocketMQ等。
Stream
这是Redis5.0新增的数据结构,主要用于消息队列,实现信息的持久化;
到这里基本上Redis你就可以玩的很溜了,而且你会发现之前纯靠编码和MySQL组合极难实现的一些功能,用Redis就可以轻松搞定。
当然这里只是一个基础的入门,想要深入掌握还需要不断学习。
高手
如果你还想玩点更高级的东西,可以去玩Redis Module,像什么BloomFilter,RedisSearch,Redis-ML这些,意味着你可以通过开发扩展功能来增强Redis的能力。
你要知道大厂的需求有些是特定的业务场景,你根本找不到现成的轮子,所以,就需要你通过扩展模块来实现一些吊炸天的能力。
这也是进阶高手的必经之路。
总结
OK,这就是这篇文章的全部内容了,中间我穿插了一些大厂面试经常会问的问题,如果你能将这些知识消化并吸收,那你的板砖又会强大不少啦!
当然,这只是Redis最基础的东西,后面我会加快更新《大厂必备》系列,如果你有什么想知道的,也可以私戳留言给我,我会抽空写出来,期待你的来撩!
如果觉得不错,求再看、关注加转发,你的支持,就是我创作的最大动力,我们下期见!