【大厂必备】系列之Redis基础

如果你想进大厂,做一个享受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最基础的东西,后面我会加快更新《大厂必备》系列,如果你有什么想知道的,也可以私戳留言给我,我会抽空写出来,期待你的来撩!

如果觉得不错,求再看、关注加转发,你的支持,就是我创作的最大动力,我们下期见!


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值