面试官:Redis什么这么快?     面试官:你说说Redis五大基本数据类型?     面试官:有利用过有序集合开发过什么功能吗?     面试官:有序集合用什么数据结构来实现?     面试官:那有序集合为什么要使用字典和跳跃表?     面试官:压缩列表呢?          大家好,我是南哥。   一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。   文章目录            Redis快的秘密     Redis数据类型             Redis五大基本数据类型       有序集合业务场景       有序集合数据结构       为什么使用字典和跳跃表           压缩列表          1. Redis快的秘密       面试官:Redis什么这么快?      相信大部分Redis初学者都会忽略掉一个重要的知识点,Redis其实是单线程模型。我们按直觉来看应该是多线程比单线程更快、处理能力更强才对,比如单线程一次只可以做一件事情,而多线程却可以同时做十件事情。   但Redis却可以做到每秒万级别的处理能力,主要是基于以下原因:   (1)Redis是基于内存操作的,Redis所有的数据库状态都保存在内存中。而内存的响应时长是非常快速的,大约在100纳秒。大家可以对比下其他服务器磁盘,固态硬盘(SSD)、机械硬盘(HDD)响应时长大约几十微秒,很明显远远没有基于内存的响应时长快速。   (2)Redis采用I/O多路复用技术,这种I/O模型是非阻塞I/O,应用程序在等待I/O操作完成的过程中不需要阻塞。   (3)最后一点也是我开头提到的,Redis采用了单线程模型。单线程模型避免了多线程产生的线程切换和锁竞争带来的资源消耗,这两种消耗对性能影响是很大的。另外一点是单线程相比多线程来说实现更简单高效,如果引入多线程设计相信Redis实现起来会更加复杂不易优化。   2. Redis数据类型   2.1 Redis五大基本数据类型       面试官:你说说Redis五大基本数据类型?      Redis基本数据类型一共有五种,这也是面试官重点考查的基础,大家要重点关注下。   (1)字符串。   字符串是Redis最基础,也是业务开发中最常见的一种数据类型。在业务上一般使用MySQL作为实际存储层,而Redis字符串作为缓冲层对象。   127.0.0.1:6379> set name JavaGetOfferOK127.0.0.1:6379> get name"JavaGetOffer"   (2)哈希。   哈希的键值本身是一个键值对结构,类似于key = {{field, value}, {field, value}}。   我们可以使用hset命令设置哈希键值,而hget命令可以获取哈希对象中某个field的值。   127.0.0.1:6379> hset msg name JavaGetOffer(integer) 1127.0.0.1:6379> hset msg avator 思考的陈(integer) 1127.0.0.1:6379> hget msg name"JavaGetOffer"127.0.0.1:6379> hget msg avator"思考的陈"   (3)列表。   Redis的列表是一个有序列表,但大家注意一点,此处所说的有序不是按数据大小排序的有序,而是按插入顺序的有序。另外一点特殊之处是我们可以往列表的左右两边添加元素。   # 从右边添加127.0.0.1:6379> rpush number 1 2 3(integer) 3# 从左边添加127.0.0.1:6379> lpush number 4 5 6(integer) 6127.0.0.1:6379> lrange number 0 51) "6"2) "5"3) "4"4) "1"5) "2"6) "3"   (4)集合。   集合类型和列表不同之处在于它是无序的,同时也不支持保存重复的元素。   另外两个集合之间可以获得交集、并集、差集。利用这一点,如果在业务上要求得两个用户相同的兴趣标签,可以使用Redis集合存储用户兴趣标签,再使用交集命令来查询。   127.0.0.1:6379> sadd user:1:like game bask run(integer) 3127.0.0.1:6379> sadd user:2:like game basketball fitness(integer) 3# 求交集127.0.0.1:6379> sinter user:1:like user:2:like1) "game"   (5)有序集合。   有序集合算是Redis中比较特殊的一种数据类型,有序集合里的每个元素都带有一个score属性,通过该score属性进行排序。如果我们往有序集合插入元素,此时它就不像列表对象一样是插入有序,而是根据score进行排序的。   127.0.0.1:6379> zadd 100run:ranking 13 mike(integer) 1127.0.0.1:6379> zadd                                 
点赞 7
评论 0
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务