我们最常使用的电商应用全都是使用数据库来进行数据的存储。尤其是在接入互联网网民越来越多的情况下,业务系统经常会面临大量的数据请求,在一些大促场景,更会面临突然间的请求量剧增,需要系统在极短的时间内完成上万次的读/写操作,单个数据库、传统数据库也难以承受该数据量,因此需要多类型的数据库一起使用,充分利用数据库的优点实现高并发,保障用户体验。
而众多数据库中,Redis便是程序员们最亲睐、使用最多的数据库,在各大企业招聘中也要求受聘者掌握redis的使用,疫情逐渐稳定,大量的招聘机会袭来,赶快来查漏补缺Redis(定义、特征、原理、数据结构、常用场景),看看还有哪块儿不太熟悉,赶紧恶补,拿下心仪的offer吧~
Redis是什么?
Redis是一种内存数据库,Nosql非关系型数据。
按照数据存储的位置在磁盘还是内存,可以把数据库分为磁盘数据库(如Mysql、Oracle)、内存数据库(如Redis)。对于磁盘数据库来说,数据库的事务操作机制成熟可靠,但是因为数据存储在磁盘上,占用消耗的系统资源比较多、数据存取的速度比较慢、数据存取时间不一致且难以预测,所以当数据量比较大时就产生了新的解决方案,即把数据存储在内存上,内存数据库存取速度很快、数据一致、存取时间也易于预测,缺点就是内存比较贵,所以目前互联网企业是内存数据库与磁盘数据库搭配在用。
按照存储的数据关系模型把数据库又拆分为关系型数据库(如Mysql、Oracle)、非关系型数据库(Redis、MongoDB)、大数据(HIve、Hbase、Clickhouse)。早期的时候,应用数据量不大,只使用数据库就可以存储所有数据并且保障良好的性能,但后来随着业务的快速发展,应用数据量蹭蹭蹭的剧增导致于一个数据库也不够用了,运维们开始把数据库进行主从复制,读写分离,分库分表,并且在应用访问和数据库之间加了缓存层,把常调用的热数据都放在缓存层,这缓存层就是Nosql非关系型数据库。
Redis典型特征
Redis的典型特征便是单线程。在互联网业务高并发的情况下,大部分应用程序、算法都是采用多线程思想,提高执行的并发度,然而redis却是使用单线程模型进行设计,并且能承受住每秒几百万的请求量,那么为什么redis采用单线程设计呢?
Redis采用单线程模型来设计的原因主要有三个:
单线程模型维护性更好,便于开发和调试;
单线程模型也能很好的处理用户请求;
Redis运行的操作性能瓶颈都不是CPU。
首先我们需要对齐一个概念,无论单线程还是多线程模型,设计的初衷都是保障系统的高性能。但是在采用了多线程模型后。就必须要同时引入并发控制来保证多个线程同时访问程序的正确性,需要程序员额外去维护并发控制的代码,加锁,处理死锁问题等,这样提高了研发成本。
其次使用单线程模型也不等于系统不能并发的处理任务。在Redis中采用了I/O多路复用机制来并发处理客户端的多个请求,并同时等待多个连接发送的请求。使用I/O多路复用技术可以减少系统的开销,并且不需要额外创建和维护线程监听客户端的大量连接,减少了服务器的开发和维护成本。并且使用多线程也会带来性能的下降,因为操作系统在执行任务时需要去保存加载线程的上下文从而带来额外的开销。
最后因为Redis是内存型数据库,所以它的瓶颈一般不在CPU上,而多线程模型主要是在于并发的使用CPU资源,所以并不需要多线程去充分利用CPU资源。只需要管控好网路I/O来处理网络传输带来的延迟和等待客户端的数据传输即可。
Redis基础数据结构
Redis有五种基本的数据结构,分别是strings字符串,hashes散列,lists列表,sets集合,sortedsets有序集合。
strings字符串类型支持setkey vaule设置值、getkey获取某个key的值、msetkey1 value1 key2 value2批量设置值、mgetkey1 key2批量获取值、incrkey自增指定的值、decrkey自减指定的值。
Hash支持hsetkey field value设置字典中某个key的值、hmsetkey field1 value1 field2 value2批量设置值、hget.
Keyfield获取字典中某个key的值、hgetallkey获取全部值、hmsetkey field1 field2 批量获取值。
List即列表,支持lpushkey item1 item2 item3 从左往右入栈、rpushkey item1 item2 item3从右入栈、lpopkey从左出栈、rpopkey从右出栈、linsert key before|after item newitem在指定元素的前面或后面添加元素、lremkey count value删除指定个数值为value的元素。
Set类型里面的元素不能重复,还可以对集合取交集和并集,通过Set可以实现取不同用户之间的共同好友、沟通爱好等。saddkey value添加某个元素、sdelkey value删除某个元素、sismemberkey value判断是否是集合中的元素、srandmemberkey value随机获取指定个数的元素、stopkey count从集合中随机弹出元素、scardkey获取集合个数、sinterset1 set2获取所有集合的交集、skiffset1 set2获取所有集合的差集、sunionset1 set2获取所有集合中的并集。
Zset是一个有序集合,通过它可以实现比如学生成绩排行榜、视频播放量排行榜等功能。
Redis使用场景
Redis基于内存存储数据,并且底层由C语言开发,因此可以极大的提高查询性能。Redis常用的场景包括缓存、时效性控制、计数器、社交列表、记录用户判定信息、热门列表与排行榜、最新动态、消息队列等。
缓存-对于热点数据,用户可能需要经常访问,把数据放在Redis后,用户就可以快速获取数据。
时效性控制-我们注册某个app或网站时,经常都是需要验证码,并且超过多少分钟后就不能使用。
计数器-我们经常看的点赞数、浏览数、收藏数、分享数,利用redis递增便可实现。
社交列表-我们经常看的用户点赞列表、用户分享列表、用户收藏列表、用户粉丝列表使用redis的hash类型数据结构便可实现。
记录用户判定信息-我们有时候需要知道用户是否点赞、是否收藏、是否分享等,使用redis便可实现。
排行榜-根据某个value进行排序,可以获取最新、最热、点击率最高的排名列表。
最新动态-按照时间顺序排列获取最新动态。
消息队列-通过redis的list类型中的push、POP功能,可以实现消息中间件功能.
今天带大家复(xue)习(xi)了redis,包含定义、典型特征及背后原因、常用的数据结构、使用场景等。在找实习、找工作的过程中,如果再有面试官问到你Redis,再也不用心慌慌啦!
添加VX13125006136进行python,JAVA,大数据学习在线咨询,获取更多免费学习资料