面试突击Redis:Redis都有哪些数据类型?分别适用于哪些场景?
Redis都有哪些数据类型?分别适用于哪些场景?
除非是面试官看你的简历,感觉你就是一个工作3年以内的、比较初级的一个同学,可能对技术没有很深入的研究,面试官才会问这类问题。
其实问这个问题主要就俩原因:
- 第一,看看你有没有全面的了解redis的功能,一般怎么来用。有没有认真思考过什么场景比较适合用什么数据类型,就怕你只会最简单的kv操作,平时也没思考过怎么设计才更好。
- 第二,看看你在实际项目里都怎么用Redis,是不是思考过Redis的这些数据类型,是不是爱学习的人。
要是你回答的不好,没说出几种数据类型,也没说什么场景,支支吾吾的你就完了,面试官对你印象肯定不好,觉得你平时就是做个简单的set和get。
看一下这道面试题怎么回答。
(1)string
这是Redis中最基本的类型了,也最常用,没啥可说的,就是普通的set和get,做简单的kv缓存。
(2)hash
这个是类似map的一种结构,一般可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在redis里,然后每次读写缓存的时候,可以就操作hash里的某个字段,而不是把整个对象都拿出来,这样节省了IO操作,效率更高。
使用HSET key field value命令存储一个对象,如我们有一个用户,key=user:id:1
hash类的数据结构,主要是用来存放一些对象,把一些简单的对象给缓存起来,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。
HGET user:id:1 age获取用户ID为1的age值。
(3)list
有序列表,这个是可以玩儿出很多花样的。
比如在微博里,有个大v的粉丝,就可以以list的格式放在Redis里去缓存。
key=某大v
value=[zhangsan, lisi, wangwu]
比如可以通过list存储一些列表型的数据结构,类似粉丝列表了、文章的评论列表了之类的东西。
还可以通过lrange命令,从某个元素开始读取多少个元素,还可以基于list实现分页查询,这个很棒的一个功能。基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能很高,一页一页的走。
比如还可以用来搞个简单的消息队列,从list头塞进去,从list尾巴那里弄出来。
(4)set
set无序集合,可以自动去重。
直接基于set将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于jvm内存里的HashSet进行去重。但是如果你的某个系统部署在多台机器上呢?就得基于Redis进行全局的set去重了。
当然还可以基于set玩儿交集、并集、差集的操作,比如交集吧,可以把两个人的粉丝列表整一个交集,看看俩人的共同好友是谁?对吧。
把两个大v的粉丝都放在两个set中,对两个set做交集,看到共同关注的人。
(5)sorted set
排序的set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序,这个可以玩儿很多的花样。这个数据类型的最大的特点是有个分数的概念,可以自定义排序规则。
比如说你要是想根据时间对数据排序,那么可以写入进去的时候用某个时间作为分数,人家自动给你按照时间排序了。
另外,这个数据类型很适合最排行榜这类的功能。
排行榜: 将每个用户以及其对应的分数写入进去命令zadd board score username如
接着使用命令zrevrange board start stop,就可以获取排名从start到stop的用户。
使用命令zrank board username,可以看到用户在排行榜里的排名。
如:zrevrange board 0 3获取排名前3的用户
查看排名zrank board Tom,返回4
首先,一起来瞄一眼Redis的学习路线图(xmind文件),看看怎么学习比较好
(注意:关于Redis怎么学?如何复习?这一块小编提供了一些学习复习笔记,有需要即可免费分享, 私信 小编 “Redis” 即可!!)
其次,说到复习,一起来看看我自己整理的一份Redis学习笔记
- 为什么要用 redis /为什么要用缓存(高性能、高并发)
- 为什么要用 redis 而不用 map/guava 做缓存?
- redis 常见数据结构以及使用场景分析(String、Hash、List、Set、Sorted Set)
- redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)
- redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)
- Redis 常见异常及解决方案(缓存穿透、缓存雪崩、缓存预热、缓存降级)
- 分布式环境下常见的应用场景(分布式锁、分布式自增 ID)
- Redis 集群模式(主从模式、哨兵模式、Cluster 集群模式)
- 如何解决 Redis 的并发竞争 Key 问题?
- 如何保证缓存与数据库双写时的数据一致性?
- … ..
最后,再来看一份Redis常备的面试题…
- 什么是 Redis?简述它的优缺点?
- Redis 与 memcached 相比有哪些优势?
- Redis 支持哪几种数据类型?
- Redis 主要消耗什么物理资源?
- Redis 有哪几种数据淘汰策略?
- 为什么 Redis 需要把所有数据放到内存中?
- Redis 集群方案应该怎么做?都有哪些方案?
- Redis 集群方案什么情况下会导致整个集群不可用?
- MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
- Redis 有哪些适合的场景?
- Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
- Redis 和 Redisson 有什么关系?
- Jedis 与 Redisson 对比有什么优缺点?
- Redis 集群的主从复制模型是怎样的?
- Redis 集群会有写操作丢失吗?为什么?
- 怎么理解 Redis 事务?
- Redis 如何做内存优化?
- Redis 回收进程如何工作的?
- watch dog 自动延期机制
- 锁互斥机制
- 释放锁机制|
- … ….
关于上面说的这些Redis学习笔记和复习大纲以及面试常备题目(附详细解析),皆可免费赠送给阅读此篇文章的你,转发+私信我 “Redis” 即可找小编免费分享下载!!
Java数据类型
Java的两大数据类型:
- 基本数据类型
- 引用数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte型:
- byte数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是-128(-2^7);
- 最大值是127(2^7-1);
- 默认值是0;
- byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short型(短整型):
- short数据类型是16位、有符号的以二进制补码表示的整数
- 最小值是-32768(-2^15);
- 最大值是32767(2^15 – 1);
- Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是0;
- 例子:short s = 1000,short r = -20000。
int型(整型):
- int数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是-2,147,483,648(-2^31);
- 最大值是2,147,483,647(2^31 – 1);
- 一般地整型变量默认为int类型;
- 默认值是0;
- 例子:int a = 100000, int b = -200000。
long(长整型):
- long数据类型是64位、有符号的以二进制补码表示的整数;
- 最小值是-9,223,372,036,854,775,808(-2^63);
- 最大值是9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是0L;
- 例子: long a = 100000L,long b = -200000L。
Java支持多种表示整型字面值的方式,包括十进制、八进制、十六进制和二进制
1. 十进制(Decimal)
十进制是最常见的表示方式,直接使用0到9的数字表示。
2. 八进制(Octal)
八进制使用前缀 0 表示,数字范围是0到7。
3. 十六进制(Hexadecimal)
十六进制使用前缀 0x 或 0X 表示,数字范围是0到9和A到F(或a到f)。
4. 二进制(Binary)
二进制使用前缀 0b 或 0B 表示,数字范围是0和1。
float(单精度浮点型):
- float数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float在储存大型浮点数组的时候可节省内存空间;
- 默认值是0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double(双精度浮点型):
- double数据类型是双精度、64位、符合IEEE 754标准的浮点数;
- 浮点数的默认类型为double类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是0.0d;
- 例子:double d1 = 123.4。
Java支持多种表示浮点型字面值的方式,包括十进制表示法、科学计数法、后缀表示法
1. 十进制表示法
- 直接写出一个带有小数点的数值。
- 例如:3.14, 0.5, -2.718
2. 科学计数法
- 使用 e 或 E 表示指数部分。
- 例如:3.14e2 表示 3.14 * 10^2 = 314.0
- 例如:1.23E-3 表示 1.23 * 10^-3 = 0.00123
3. 后缀表示法
- 使用 f 或 F 后缀表示 float 类型。
- 使用 d 或 D 后缀表示 double 类型(可选,因为默认就是 double)。
- 例如:3.14f 表示 float 类型的 3.14,3.14 或 3.14d 表示 double 类型的 3.14。
boolean(布尔型):
- boolean数据类型表示一位的信息;
- 只有两个取值:true和false;
- 这种类型只作为一种标志来记录true/false情况;
- 默认值是false;
- 例子:boolean one = true。
char(字符型):
- char类型是一个单一的16位Unicode字符;
- 最小值是’\\u0000’(即为0);
- 最大值是’\\uffff’(即为65,535);
- char数据类型可以储存任何字符;
- 例子:char letter = ‘A’。
***在 Java 中,字符型字面值(Character Literal)用于表示单个字符。字符型字面值通常用单引号 \’ 包围,并且可以包含一个字符或一个转义序列
1. 基本字符型字面值
- 字符型字面值表示一个 Unicode 字符,通常用单引号 \’ 包围。例如:
2. 转义序列
- Java 支持多种转义序列,用于表示一些特殊字符或不可打印字符。常见的转义序列包括:
- \\n:换行符(newline)
- \\t:制表符(tab)
- \\b:退格符(backspace)
- \\r:回车符(carriage return)
- \\f:换页符(form feed)
- \\\\:反斜杠(backslash)
- \\\’:单引号(single quote)
- \\\”:双引号(double quote)
- \\uXXXX:Unicode 字符,其中 XXXX 是四位十六进制数
- 示例:
- char newline = \’\\n\’; // 换行符 char tab = \’\\t\’; // 制表符 char backslash = \’\\\\\’; // 反斜杠 char singleQuote = \’\\\’\’; // 单引号 char unicodeChar = \’\\u03A9\’; // Unicode 字符 Ω
3. Unicode 字符
- Java 支持使用 Unicode 字符,可以通过 \\u 转义序列来表示。Unicode 字符可以表示任何语言的字符,包括中文、日文、希腊字母等。
示例:
类(Class):
- 类是对象的模板,定义了对象的属性和行为。例如:
接口(Interface):
- 接口定义了一组方法的签名,但没有实现。类可以实现接口。例如:
数组(Array):
- 数组是一种存储多个相同类型元素的数据结构。例如:
枚举(Enum):
- 枚举是一种特殊的数据类型,它允许一个变量成为一组预定义常量的集合。例如:
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。