Redis常用知识点

 

什么是redis?为什么redis快?

Redis是一种高性能的,开源的,c语言编写的非关系型数据库,可以对关系型数据库气到补充作用同时支持持久化,可以将数据同步保存到磁盘。

说Redis很快是相对于关系型数据库如mysql来说的,主要有以下因素:

1.数据结构简单,所以速度快

2.直接在内存中读写数据,所以速度快

3.采用多路IO复用模型,减少网络IO的时间消耗,避免大量的无用操作,所以速度快

4.单线程避免了线程切换和上下文切换产生的消耗,所以速度快

Redis的数据存储结构有哪些?

Redis存储形式是键值对,支持value形式包括String,List,Set,ZSet,Hash。

Redis常用命令

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宕机数据丢失问题

通过对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做缓存

一个字,快。

缓存它指的是将数据库的数据同步到内存中,客户端获取数据直接从内存中获取。由于内存读写速度大于磁盘,而使用缓存能减少磁盘读取,大大提高查询性能。

我们一般会将经常查询的,不会经常改变的热点数据,保存到缓存中,提高响应速度

缓存的执行流程

1.客户端发起查询请求

2.判断缓存中是否有数据

  • 如果有,直接返回

  • 如果没有,就从数据库查询,再把数据同步到缓存

3.返回数据给客户端

你们怎么保证Redis和Mysql的一致性

我们在代码中控制,如果数据库做是写操作,直接把redis中的对应数据删除,下次查询数据会重新写入缓存。

我们的业务对一致性要求不是很高,因此采用了先操作mysql,后删除redis。在写数据库和删除缓存行代码之间如果有查询请求依然会查询到Redis中的老数据,但是这种情况非常极端,而且我们的业务也能容忍这种短暂的脏数据。

我还知道其他方案,比如延迟双删 , 使用阿里的canal组件监听Mysql事务日志自动同步Redis等。

SpringCache常用注解

@EnableCaching:打在主启动类上,开启缓存功能

@Cacheable:打在方法上,表示该方法会开启缓存,打在类上,表示类中所有的方法都开启缓存,方法的返回值会自动写入缓存。如果缓存中已经有数据,方法将不会被调用,而是拿着缓存数据直接返回给客户端。

@CacheEvict:搭载类或者方法上,会将缓存清除

@CachePut:更新缓存

@Caching:组合操作,要应用于方法的多个缓存操作

@CacheConfig:打在类上,共享的一些常见缓存设置

了解缓存击穿,穿透,雪崩吗?怎么处理?

缓存击穿:缓存中没有,数据库中有的数据,由于某种原因比如缓存过期了,同时并发用户特别多,一时间都往数据库中读取数据

  • 解决方案:加互斥锁,只能允许一个线程访问数据库,然后其他线程就可以往内存中拿

缓存穿透:客户端频繁请求一个缓存和数据库中都没有数据,导致数据库压力大。

  • 解决方案:布隆过滤器来判断数据库中有没有这个key

缓存雪崩:缓存重启,或者大量key失效,导致大量并发打到数据库

  • 解决方案:为key设置不同的过期时间

Redis如何模拟队列和栈,用什么命令

  • list控制先进后出: lpush rpop ;

  • 队列:list控制先进先出: lpush lpop

Redis存储单个对象怎么存,存储对象集合怎么存

单个对象可以使用String,也可以使用hash

集合对象可以使用hash,以便可以快速的通过field来取值,获取列表可以通过hash的 vals 来获取,很方便

Redis的Value支持哪些存储结构

redis是keyvalue结构,value支持常用的存储方式有:string; list; set;zset ;hash 。

  • string:一般用来存储简单字符串,也可以存储对象或者集合,一般转JSON方式存储。

  • list和set:就是存储集合,一个有序可重复,一个无续不重复

  • zset:存储集合,支持排序,一般做排行榜什么的可以使用它

  • hash一般用来存储对象,当然集合也可以存,比如你需要存储一个商品列表,取的时候需要取到商品列表,同时也要方便取单个商品,那最好使用hash,把商品的ID作为hash的field,商品对象作为value。取列表的时候使用vals就可以,取单个对象使用get即可。

你们Redis用来做什么?使用的什么结构?

  • 登录信息login,使用的是String结构存储

  • 手机验证码code,使用的是String结构

  • 课程分类course_type ,使用的是String结构

  • 购物车保存,使用的是Hash结构

  • 数据字典等项目也是使用redis存储

  • 权限数据也是使用redis存储

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值