Redis复习+面试题

目录

1.Redis五大数据类型及使用场景:


1.Redis五大数据类型及使用场景:

  • String:Redis的字符串是动态字符串,内部表示是一个字符数组,这里提Python的字符串是无法修改的。一般用来做一些复杂的计数功能的缓存(项目里使用了字符串来记录毫米级时间)
SET KEY VALUE    #设置或修改一个字符串
GET              #获取
MSET             #多次添加
MGET KEY1 KEY2...
INCR KEY         #使一个整型的KEY自增1   "18"
INCRBY           #设定自增步长,也可以用来自减,等同于DECR
INCRBYFLOAT      #浮点数增长
SETNX KEY VALUE  #如果存在,不修改,不存在则新建 等同于SET KEY VALUE NX
SETEX KET VALUE  #添加一个KEY,并设置有效期
  • List:底层为一个双向链表结构,有序,一般用来做消息队列
LPUSH KEY ELEMENT...   #从左侧插入一个元素
LPOP KEY [COUNT]           #从左侧弹出一个元素
RPUSH KEY ELEMENT   #从右侧插入一个元素
RPOP KEY            #从右侧弹出一个元素
LRANGE KEY START END #返回从START到END的所有元素
BLPOP BRPOP #和前面类似,区别在于如果没有元素时使用该指令会等待指定时间,而不是直接返回nil
  • Hash:散列,无序字典,存储、读取、修改对象属性
HSET KEY FIELD VALUE
HGET KEY FIELD
HMSET KEY FIELD1 VALUE1 FIELD2 VALUE2
HMGET KEY FIELD1 FIELD2
HGETALL #获取该KEY的所有键值对
HKEYS #获取Hash类型所有的KEY(FIELD)
HVALS #获取KEY中所有的值
HINCRBY #让一个Hash类型的KEY字段值增长指定步长
HSETNX #

顺带提一嘴,Redis中无法给Hash的元素和Set的元素设置过期时间,但是可以给整个Set或Hash设置过期时间。至于为什么Redis不给这些类型的元素设置过期时间是因为不可能支持这样的 feature,因为违背了 Redis 的设计理念:简单、高效。 不过,在 Google Group 上看到 Redis 的作者针对这类需求给出了 2 个实现方案

  • Set:集合。无序,查找快,元素无重复,支持集合运算
SADD KEY MEMBER  #增
SREM KEY MEMBER  #删
SCARD KEY        #返回元素个数
SISMEMBER KEY MEMBER #判断元素是否属于集合
SMEMBERS KEY     #获取KEY中所有的MEMBER
  • SortedSet:有序集合,查找快,元素无重复,每个元素都带有一个double类型的score
ZADD key score member #添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZREM key member       #删除sorted set中的一个指定元素
ZSCORE key member     #获取sorted set中的指定元素的score值
ZRANK key member      #获取sorted set中的指定元素的排名
ZCARD key             #获取sorted set中的元素个数
ZCOUNT key min max    #统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member  #让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max    #按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max     #按照score排序后,获取指定score范围内的元素
ZDIFF、ZINTER、ZUNION         #求差集、交集、并集

PS:set和zset的元素都是字符串类型

set一般使用在有共同特点的场景上,zset可以用来做排行等

更加详细请参考:Redis五种数据类型及应用场景 - 腾讯云开发者社区-腾讯云 (tencent.com)

2.Redis是单线程还是多线程

无论什么版本,工作线程(执行命令的核心模块)只有一个。在6.x版本中出现了IO多线程,需要注意的是这个 Theaded IO 指的是在网络 IO 处理方面上了多线程,如网络数据的读写和协议解析等

为什么Redis很快?还是单线程?

个人理解:Redis快的原因无非两个重要原因:①Redis是基于内存的数据库,所有的操作都在内存上进行②Redis都是简单的key-value数据结构,所以比较快,据官方给出的数据,redis在一个普通的linux上部署,一秒内可以发送一百万的请求,如果还不能满足需求,官方推荐启动多个Redis实例。如果使用多线程还需要考虑数据安全性,再者操作数据时需要加锁,进而也影响了程序的执行速度和效率。总的来说Redis单线程已经够快了,完全没有必要采用多线程。

3.Redis性能的瓶颈

于上个问题可知Redis的瓶颈不在CPU,主要是①机器内存和②网络带宽(网络状态)

4.Redis为什么效率高

①因为它是内存数据库;

②归功于它的数据结构;

③Redis 中是单线程;

④Redis 中使用了多路复用。

5.Redis和MySQL的区别

  • 数据层面:

MySQL是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢              Redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限

  • 使用场景

MySQL用于持久化的存储数据到硬盘,功能强大,但是速度较慢                                                  Redis用于存储使用较为频繁的数据到缓存中,读取速度快.

  • 存放位置

 MySQL:数据放在磁盘                                                                                                               Redis:数据放在内存

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的Zion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值