Redis面试题


Redis

1、为什么Redis这么快?

100000 + QPS(Query pre Second 美秒查询次数)

1、完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高;

2、数据结构简单,对数据操作也简单;

3、采用单线程,单线程也能处理高并发请求,想多核也可启动多实例;

4、使用多路I/O复用模型,非阻塞IO。

2、Redis数据类型有哪些?

常用数据类型:

  • string: 字符串
  • hash: 散列
  • list: 列表
  • set: 集合
  • sorted set: 有序集合

string 字符串

string 是 Redis 最基本的数据类型,存储简单的key-value类型,值最大能存储 512MB,是二进制安全的,可以包含任何数据,比如jpg图片、序列化的对象、数字等。

主要用到的命令有:

命令格式用例描述
SETSET key valueBlog:0>SET name Tom
“OK”
将键 key 存储值为 value
GETGET keyBlog:0>GET name
“Tom”
获取键 key 的值
GETSETGETSET key valueBlog:0>GETSET name Jack
“Tom” Blog:0>GET name
“Jack”
将给定 key 的值设为 value ,并返回 key 的旧值(old value)
INCRINCR keyBlog:0>SET num 1
“OK”
Blog:0>INCR num
“2”
将键 key 存储的值加上 1
DECRDECR keyBlog:0>DECR num
“1”
将键 key 存储的值减去 1
INCRBYINCRBY key nBlog:0>INCRBY num 2
“3”
将键 key 存储的值加上整数 n
DECRBYDECRBY key nBlog:0>DECRBY num 2
“1”
将键 key 存储的值减去整数 n
INCRBYFLOATINCRBYFLOAT key nBlog:0>INCRBYFLOAT num
0.5
Blog:0>INCRBYFLOAT num -0.5
“1”
将键 key 存储的值加上(负数减去)浮点数 n
SETNXSETNX key valueBlog:0>SETNX weight 2
“1”
Blog:0>SETNX weight 3
“0”
用于给指定的 key 设置 value,如果 key已经存在则返回0,设置成功返回1。nx代表:not exist
SETEXSETEX key T valueBlog:0>SETEX height 10 180
Blog:0>GET height
“180”
Blog:0>GET height
null
用于给指定的 key 设置 value,并且需要指定该 key 的有效时间, T 秒后则返回为 null
SETRANGESETRANGE key n valueBlog:0>GET name
“TomDo”
Blog:0>SETRANGE name 3 Ge
“5”
Blog:0>GET name
“TomGe”
给指定的 key 的值从指定位置(下标从0开始)重新覆盖内容
GETRANGEGETRANGE key n mBlog:0>GET name
“TomGe”
Blog:0>GETRANGE name 1 3
“omG”
从下标 n 到 m 获取指定 key 的值的内容
MSETMSET key1 value1 key2 value2 ……Blog:0>MSET name Tom age 25
“OK”
批量设置值
MGETMGET key1 key2 ……Blog:0>MGET name age
1) “Tom”
2) “25”
批量获取值
APPENDAPPEND key valueBlog:0>get name
“Jack”
Blog:0>APPEND name Tom
“7”
Blog:0>get name
“JackTom”
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值value的末尾;key 不存在则设置 value

应用场景:

  1. 常规key-value缓存;
  2. 计数功能的缓存:微博粉丝数、点赞数等。

hash 散列

Hash是一个string类型的key和<field,value>的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。

主要用到的命令有:

命令格式用例描述
HSETHSET key field valueBlog:0>HSET ec_token 111 nosfhsofhsof
“1”
将哈希表key中的字段field的值设置为value,若key不存在则创建后赋值,若域field已存在则覆盖。
HDELHDEL key field
HEXISTSHEXISTS key field
HGETHGETkey fieldBlog:0>HGET ec_token 111
“nosfhsofhsof”
从获 key 中取 field 的值
HGETALLHGET keyBlog:0>HGETALL ec_token
1) “111”
2) “nosfhsofhsof”
3) “222”
4) “vgfndobndb”
获取key下的所有<field,value> 值
HINCRBYHINCRBY key field nBlog:0>HSET token a 1
“1”
Blog:0>HINCRBY token a 2
“3”
哈希表key中的指定字段field的整数值加上增量 n
HINCRBYFLOATHINCRBYFLOAT key field nBlog:0>HSET token b 0.5
“1”
Blog:0>HINCRBYFLOAT token b 1.6
“2.1”
哈希表key中的指定字段field的浮点数值加上增量 n
HKEYSHKEYS keyBlog:0>HKEYS token
1) “a”
2) “b”
获取哈希表中所有的字段
HVALSHVALS keyBlog:0>HVALS token
1) “3”
2) “2.1”
获取哈希表中所有字段的值
HLENHLEN keyBlog:0>HLEN token
“2”
获取哈希表中所有字段的数量
HMGETHMGET key field1 [field2]Blog:0>HMGET token a b
1) “3”
2) “2.1”
批量获取哈希表中field字段的值
HMSETHMGET key field1 value1 [field2] [value2]Blog:0>HMSET token c 4 d 6
“OK”
批量设置哈希表中field字段的值
HSETNXHSETNX key field valueBlog:0>HSETNX token e 7
“1”
Blog:0>HSETNX token a 7
“0”
字段 field 不存在时,设置哈希表字段的值

比如可以用Hash数据结构来存储

应用场景:

  • 用户信息,商品信息;
  • token,在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为field,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。

list 列表

list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销

使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。

主要用到的命令有:

命令格式用例描述
LPUSH向列表中添加元素
RPUSH
LPOP
RPOP
LRANGE

set 集合

主要用到的命令有:

命令格式用例描述

sorted set 有序集合

主要用到的命令有:

命令格式用例描述

不常用数据类型:

  • HyperLogLog:基数统计

关注微信公众号:【皮卡战记】

皮卡战记

文章作者: Pikaman
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Pikaman !
评论
 上一篇
Maven面试题 Maven面试题
一、Maven有哪些优点和缺点?优点 简化了项目依赖管理; 易于上手,对于新手可能一个mvn clean package命令就可能满足他的工作; 便于与持续集成工具(jenkins)整合; 便于项目升级,无论是项目本身升级还是项目使用的依赖
2020-02-12
下一篇 
Git常用命令大全 Git常用命令大全
一、Git工作原理 Git工作区域 Workspace/working directory:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 文件的三种状态 在 Gi
2020-02-06
  目录