如果面试问到你redis的常用数据类型,你怎么和面试官聊上十分钟?

news2024/10/6 20:32:42

在这里插入图片描述

最近组长把一些简历推到我这边让我帮他面试几份,问到这种基础题目时收到的回答总是不太理想

1、最简单的回答:

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string
  • 哈希 hash
  • 列表 list
  • 集合 set
  • 有序集合 sorted set / zset

一分钟答完,会让面试官觉得你牛逼吗?这种人人皆知的答案显然不是面试官想要的。

2、每种数据类型的详细解释

一、字符串类型(string)

字符串类型是Redis的最基本类型,它可以存储任何形式的字符串。其它的四种类型都是字符串类型的不同形式。

此类型和memcache相似,作为常规的key-value缓存应用。

注:一个键最大能存储512MB

二:散列类型(hash)

redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象(因为对象可能会包含很多属性)

三:列表类型(list)

内部使用双向链表实现,所以获取越接近两端的元素速度越快,但通过索引访问时会比较慢

四:集合类型(set)

集合类型值具有唯一性,常用操作是向集合添加、删除、判断某个值是否存在,集合内部是使用值为空的散列表实现的。

五:有序集合类型 zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。

redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。


这样就完事了吗?让我们再多卷一下

3、各数据类型的常用命令

String常用命令

命令格式功能案例
set key value将key-value缓存redis中set name dafei
get key从redis中获取key对应value值get name
incr key将key对应value值 + 1incr age
decr key将key对应value值-1decr age
setex key seconds value将key-value缓存到redis中,seconds 秒后失效setex sex 10 man
ttl key查看key存活时间 -1 永久有效,-2 过期了ttl sex
del key从redis中删除keydel name
setnx key value如果key已经存,不做任何操作,如果key不存,直接添加setnx name xiaofei

Hash常用命令

命令格式功能案例
hset key field value将field value对缓存到redis中hash中,键值为keyhset user name dafei
hget key field从key对应hash列表中获取field字段hget user name
hexists key field判断key对应的hash列表是否存在 field字段hexists user age
hdel key field删除key对应hash列表中field字段hdel user age
hincrby key field increment给key对应hash列表中field字段 + incrementhincrby user age 10
hlen key查看key对应的hash列表field的数量hlen user
hkeys key获取key对应的hash列表所有的field值hkeys user
hvals key获取key对应的hash列表所有的field对应的value值kvals user
hgetall key获取key对应的hash列表中所有的field及其对应的value值hgetall user

List常用命令

命令格式功能案例
rpush key value从右边往key集合中添加value值rpush hobby java
lrange key start stop从左边开始列表key集合,从start位置开始,stop位置结束。stop为-1时查全部lrange hobby 0 -1
lpush key value从左边往key集合中添加value值lpush hobby c++
lpop key弹出key集合中最左边的数据lpop hobby
rpop key弹出key集合中最右边的数据rpop hobby
llen key获取列表长度llen hooby

Set集合常用命令

命令格式功能案例
sadd key members […]往key 集合中添加member元素sadd myset a b c
smembers key遍历key集合中所有的元素smembers myset
srem key members […]删除key集合中members元素srem myset a
spop key count从key集合中随机弹出count个元素spop myset 1

zset集合常用命令

命令格式功能案例
zadd key score member往key集合中添加member元素,分数为scorezadd players 100 a
zincrby key increment member将key集合中的member元素 分数 + incrementzincrby players 50 a
zrange key start stop [withscores]将key集合中的元素按分数升序排列 [显式分数]zrange players 0 -1 withscores
zrevrange key start stop [withscores]将key集合中的元素按分数降序排列 [显式分数]zrevrange players 0 -1 withscores
zrank key member返回member元素在key结合中的正序排名zrank players a
zrevrank key member返回member元素在key结合中的倒序排名zrevrank players a
zcard key返回key集合元素个数zcard players

Redis全局命令

命令格式功能案例
keys pattern按照pattern 匹配规则,列表redis中所有的keykeys xxx:*
exists key判断key是否存在exists name
expire key seconds给key设置过期时间,超时:secondsexpire name 10
persist key取消key过期时间persist name
select index切换数据库,默认是第0个,共有【0,15】个select 0
move key db从当前数据库将key移动到指定db库move name 1
randomkey随机返回一个keyrandomkey
rename key newkey将key改名为newkeyrename name newname
echo message打印message信息echo message
dbsize查看key个数dbsize
info查看redis数据库信息info
config get *查看所有redis配置信息config get *
flushdb清空当前数据库flushdb
flushall清空所有数据库flushall

4、举例各数据类型应用场景:

  • 字符串 string :可以用来存储用户的Session信息、缓存数据等。
  • 哈希 hash :适用于存储对象信息,如用户信息、商品信息等。
  • 列表 list :比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
  • 集合 set :在微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
  • 有序集合 sorted set / zset:游戏排行榜,各种排行榜。

5、Value设计时如何考虑采用哪种数据类型

value值的设计其实就是value类型选用: String, Hash, List, Set, Sort Set

一般考虑:

  • 是否需要排序?要使用Sort Set
  • 缓存的数据是多个值还是单个值,
  • 多个值:允许重复选List 不允许重复选择Set
  • 单个值:简单值选择String, 对象值选择Hash

一种取巧的方式:

  • 是否需要排序?要使用Sort Set
  • 剩下使用String

操作方式:

所有value之后都转换成json格式字符串,然后缓存到Redis,原因:Java操作方便,减少泛型操作麻烦

比如:

List<String>list = ...
Set<String> set = ....
Map<String, Object> map = ....


List<Object>  list = Redis对象.getList
Set<Object> set = Redis对象.getSet   
Map<Object, Object> map  =  Redis对象.getMap

不管存放啥数据类型,从reds中获取出来都是Object类型,后续对象强制转换麻烦,干脆直接使用字符串。


如此完善的知识结构,一道简单的面试题就能回答得让面试官对你赞赏有加 ~ THX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么spring默认采用单例bean

概 述 熟悉 Spring开发的朋友都知道 Spring 提供了 5种 scope&#xff0c;分别是&#xff1a; singleton: 单例模式&#xff0c;当spring创建applicationContext容器的时候&#xff0c;spring会欲初始化所有的该作用域实例&#xff0c;加上lazy-init就可以避免预处理&#xf…

磁盘分区如何分? 电脑磁盘分区免费软件指南!

列出并比较顶级免费磁盘分区管理器软件&#xff0c;以选择适用于 Windows 的最佳分区软件&#xff1a; 系统分区在现代计算机设备中起着非常重要的作用。它们可以存储数据&#xff0c;使系统文件远离用户数据&#xff0c;并在同一台设备上安装多个操作系统。但是&#xff0c;这…

MyBatis-Plus 实战教程一

这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;…

qt-C++笔记之信号与槽

qt-C笔记之信号与槽 code review! 本文抄自公众号&#xff1a;嵌入式小生 文章目录 qt-C笔记之信号与槽一.信号2.1.信号的发出2.2.信号的处理 二.槽函数2.1.带有默认参数的信号和槽函数2.2.使用QObject::connect()将信号连接到槽函数的三种方法2.2.1.第一种方法&#xff1a;使…

整理MongoDB文档:身份验证

整理MongoDB文档:身份验证 个人博客&#xff0c;求关注。 文章概叙 本文主要讲MongoDB在单机状态下的账户配置。理解了MongoDB的语法&#xff0c;对于如何配置用户权限会知道怎么配置&#xff0c;但是请注意给谁配置什么权限才是最重要的。 最小权限原则 系统的每个程序或者…

【C++编程语言】STL常用算法 算术生成和集合算法

1.算术生成算法概念 算法简介&#xff1a; accumlate 计算容器元素累计总和fill 向容器中添加元素 注意&#xff1a;算术生成算法属于小型算法 使用时包含头文件为#include<numeric> 2.accumulate /*函数原型&#xff1a;int accumulate(iterator beg ,iterator end…

热点不热!如何修复笔记本电脑未连接到移动热点的问题

当你远离常规Wi-Fi时,移动热点是让你的笔记本电脑上网的关键,但当它没有按计划运行时,你会怎么办?以下是Windows笔记本电脑无法连接到移动热点时的几种修复方法。 为什么我的笔记本电脑没有连接到我的热点 由于你的笔记本电脑正试图连接到另一个有限制和可能存在问题的设…

前端学成在线项目详细解析二

12-banner区域-课程表布局 HTML布局 <div class"right"><h3>我的课程表</h3><div class"content">1</div> </div> CSS样式 /* 课程表 */ .banner .right {margin-top: 60px;width: 218px;height: 305px;background-…

STM32F4_照相机

目录 前言 1. BMP编码 2. JPEG编码 前言 我们所要实现的照相机&#xff0c;支持BMP图片格式的照片和JPEG图片格式的照片。 1. BMP编码 BMP文件是由文件头、位图信息头、颜色信息和图形数据四部分构成。 1. BMP文件头&#xff08;14个字节&#xff09;&#xff1a;BMP文件…

在ESP32-Arduino开发中添加其它Arduino库

目录 前言 原理说明 操作步骤 下载Bounce 安装Bounce 将下载的文件夹(压缩包需要解压)移动到components/arduino/libraries路径下&#xff0c;并重命名为Bounce2 查看添加库里所有的源文件位置 在arduino的CMakeList.txt里添加库源文件 使用Bounce 前言 乐鑫官方的es…

HTTP介绍 原理 消息结构 客户端请求 服务器响应 HTTP状态码

一、HTTP介绍二、HTTP工作原理HTTP三点注意事项 三、HTTP消息结构四、客户端请求消息五、服务器响应消息HTTP请求方法 七、HTTP响应头信息八、HTTP状态码&#xff08;HTTP Status Code&#xff09;下面是常见的HTTP状态码&#xff1a;HTTP状态码分类HTTP状态码列表 一、HTTP介绍…

旁注、目录越权、跨库查询、cdn绕过

原理&#xff1a; 搭建网站多IP多端口&#xff0c;更多一个域名多网站&#xff0c;IIS的在属性-高级里面设置主机头设置域名&#xff0c;域名是收费的需要自己买一个 旁注&#xff1a;在同一服务器上有多个站点&#xff0c;要攻击的这个站点假设没有漏洞&#xff0c;可以攻击…

Spark大数据分析与实战笔记(第一章 Scala语言基础-5)

文章目录 每日一句正能量章节概要1.5 Scala的模式匹配与样例类1.5.1 模式匹配字符匹配匹配字符串守卫匹配类型匹配数组、元组、集合 1.5.2 样例类 课外补充偏函数 每日一句正能量 “成功的秘诀&#xff0c;在于对目标的执着追求。”——爱迪生 无论是在工作、学习、还是生活中&…

控制台的设置

目录 win32 API &#xff1a; 什么是API &#xff1a; 控制台&#xff1a; 控制台与VS&#xff1a; 控制台的控制&#xff1a; 控制台窗口设置&#xff1a; 1、mode函数&#xff1a; 2、title 函数&#xff1a; 在C语言中的实现&#xff1a; 控制台的坐标设置&#…

python 之numpy 之随机生成数

文章目录 1. **生成均匀分布的随机浮点数**&#xff1a;2. **生成随机整数**&#xff1a;3. **生成标准正态分布随机数**&#xff1a;4. **生成正态分布随机数**&#xff1a;5. **生成均匀分布的随机浮点数**&#xff1a;6. **生成随机抽样**&#xff1a;7. **设置随机数种子**…

Linux下Samba服务安装及启用全攻略

Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示&#xff1a;本文详解了在Linux系统下如何安装和启用Samba服务&#xff0c;涵盖了从…

商家收款码手续费太高了

在竞争激烈、各行各业都如此内卷的当下&#xff0c;商家需要不断寻求提高利润的方法。所谓开源节流&#xff0c;既要学会提高利润率&#xff0c;也要学会节省成本&#xff0c;毕竟钱是挣出来的&#xff0c;同时也是省出来的。作为一个经常使用收款工具的商家&#xff0c;很多人…

Ubuntu源码编译samba

概述 本人最近研究samba的源码&#xff0c;但是在源码编译的时候&#xff0c;本以为直接config,make,make install。没想到编译过程中碰到很多麻烦&#xff0c;主要是各种依赖问题。 基于此&#xff0c;本文把samba编译的详细过程记录下来&#xff0c;以供再次研究借鉴。 软件…

Javascript命令模式

Javascript命令模式 1 什么是命令模式2 命令模式的例子—菜单程序3 JavaScript 中的命令模式4 撤销命令5 宏命令 1 什么是命令模式 在一个餐厅中&#xff0c;当客人现场点餐或者打电话订餐时&#xff0c;老板会把客人的需求写在清单上&#xff0c;厨师会按照清单的顺序给客人炒…

qt 多语言版本 QLinguist使用方法

在使用qt开发一款软件时&#xff0c;可能需要考虑显示文本中英文等多语言版本。可以使用qt语言家的方式实现。 步骤&#xff1a; 1、代码中给控件设置文本时&#xff0c;记得带上QObject::tr() 2、工程pro文件中加入 TRANSLATIONS demo2_en.ts 3、Qt creator点击“工具”—“外…