Redis部分
讲一下你理解的Redis,为什么Redis很快
Redis是一种高性能的,开源的,C语言编写的非关系型数据库,可以对关系型数据库起到补充作用,同时支持持久化,可以将数据同步保存到磁盘
说Redis很快是相对于关系型数据库如mysql来说的,主要有以下因素
-
第一,数据结构简单,所以速度快
-
第二,直接在内存中读写数据,所以速度快
-
第三,采用多路IO复用模型,减少网络IO的时间消耗,避免大量的无用操作,所以速度快
-
第四,单线程避免了线程切换和上下文切换产生的消耗,所以速度快
你常用的Redis的数据存储结构有哪些,他们的使用场景分别是什么
Redis存储形式是键值对,支持value形式包括String,List,Set,ZSet,Hash。
String可以用作缓存,计数器,防攻击,验证码、登录过期等,List可以用来做队列,秒杀等,Set可以用来去重
Redis每种存储结构说 4 个命令吧
1.String
-
set key value 设置值
-
get key 取值
-
mset key value key value... 设置多个值
-
mget key key 获取多个值
-
incr key 将key中的值自增1
-
decre key 将key中的值自减1
2.List
-
lpush key value value... 从最左边设置值
-
rpush key value value... 从最右边设置值
-
lrange key start stop 查询key中指定区间的元素
-
lpop key 移出并返回key中最左边的元素
-
rpop key 移出并返回key中最右边的元素
3.Set
-
sadd key value value 添加元素
-
smembers key 返回集合key中的所有元素
-
srem key member 删除集合key中member元素
-
scard key 查询集合key中的元素数量
4.ZSet
-
zadd key score value (score value)... 添加元素
-
zcard key 查询集合key中元素数量
-
zcount key min max 返回有序集合key中score 在min和max之间的元素
-
zrange key start stop 返回有序集合key中索引在start和stop之间的元素
5.Hash
-
hset key field value 添加元素
-
hget key field 获取key集合中field键对应的值
-
hmset key field value (field value)... 添加元素并批量添加子键值对
-
hmget key field field 获取key集合中所有的子键值对
你们项目是怎么用Redis的
使用的是Springboot整合的redis,主要用来解决前后端分离后前后端会话问题,以及验证码的问题
怎么防止Redis宕机数据丢失问题
通过对Redis持久化,把内存中的数据和命令,保存一份到磁盘中做备份,当Redis发生宕机,重启服务器的时候,会从磁盘重新加载备份的数据,从而解决数据丢失问题
Redis持久化是什么?有几种方式
将内存中的数据备份到磁盘的过程,就叫作持久化
Redis持久化主要有两种方式,RDB和AOF,可以通过修改redis.conf进行配置
RDB是记录数据快照,而AOF是记录写命令的
Redis有了AOF持久化为什么还要RDB?
AOF和RDB各有所长
-
RDB是记录数据快照,它的优点是只产生一个持久化文件,体积相对较小,启动恢复速度快,备份方便,它的缺点是没办法做到数据百分百不丢失,因为它是每隔一定时间保存一次
-
AOF是记录写命令,它的优点是格式清晰,容易理解,数据更安全,采用append模式即使持久化过程中宕机,也不影响已经保存的数据,它的缺点是文件体积较大,恢复速度慢
根据实际需要来选择,通常二者可以结合来使用
Redis内存不够了怎么办?
方式一:增加物理内存
方式二:使用淘汰策略,删掉一些老旧数据
方式三:集群
你们Redis用在哪些业务上?用的什么存储结构
主要用做缓存,比如:验证码,分类缓存,数据字典缓存,权限数据缓存,登录信息缓存等。
String类型的存储结构用的比较多,并且使用了Json格式进行序列化。
淘汰策略有哪些?你们用的哪种
-
volatile-lru :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
-
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰(常用)
-
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
-
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
-
allkeys-random:从数据集中任意选择数据淘汰
-
no-enviction:不使用淘汰(默认的)
Redis事务和Mysql事务的区别
Mysql的事务是基于日志,记录修改数据前后的状态来实现的,而Redis的事务是基于队列实现的
Mysql中的事务满足原子性:即一组操作要么同时成功,要么同时失败,
Redis中的事务不满足原子性,即一组操作中某些命令执行失败了,其他操作不会回滚
因此对于比较重要的数据,应该存放在mysql中
使用Redis如何实现消息广播
Redis是使用发布订阅来实现广播的
订阅者通过 SUBSCRIBE channel命令订阅某个频道 , 发布者通过 PUBLISH channel message向该频道发布消息,该频道的所有订阅者都可以收到消息
为什么要使用Redis做缓存
一个字,快。
缓存它指的是将数据库的数据同步到内存中,客户端获取数据直接从内存中获取。由于内存读写速度大于磁盘,而使用缓存能减少磁盘读取,大大提高查询性能。
我们一般会将经常查询的,不会经常改变的热点数据,保存到缓存中,提高响应速度