redis详解

目录

一、redis的两种数据持久化方式

二、redis可存储的数据结构

三、设置redis的最大缓存配置

四、redis淘汰机制。

五、redis的序列化

六、redis过期键删除策略

七、redis常用注解

八、redis集群模式

九、持久化机制

十、redis危险命令

十一、缓存异常情况

(1)缓存雪崩

(2)缓存穿透

(3)缓存击穿


一、redis的两种数据持久化方式

  1. RDB持久化(Relational Database),将内存中的数据定时备份至磁盘
  2. AOF,存储redis服务器的顺序指令序列,数据丢失后,可通过日志,按照顺序执行指令,恢复数据。

二、redis可存储的数据结构

        redis本质上是一个key/value类型的数据库,每个key都是字符串类型。value包含以下几种类型:

        1.字符串String类型

        2.哈希hash类型

        3.列表list类型

        4.set类型,属于无序集合

        5.有序集合zset类型


三、设置redis的最大缓存配置

        当redis内存数据总和达到一定限制时,会实行数据淘汰策略。避免因内存溢出导致写入失败。


四、redis淘汰机制。

        官方推荐使用“volatile-lru”策略,策略如下:

  1. volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集中,随机挑选任意数据进行淘汰
  4. allkeys-lru:从数据集中,挑选最近最少使用的数据淘汰
  5. allkeys-random:从数据集中任意选择数据淘汰
  6. no-enviction:禁止驱逐数据

        redis为单线程处理指令,但IO层面却面向多个客户端并发的提供服务。多线程有利有弊,多线程存在上下文的切换,使得效率降低。所以redis内部使用IO多路复用框架来实现。

五、redis的序列化

        redisTemplate默认为jdkSerializeable,而StringRedisTemplate的默认序列化方式为StringRedisSerializer。初始化时可设置redis的序列化方式,否则编码会有问题。

六、redis过期键删除策略

        key到了过期时间后存在以下3种删除策略:

  1. 立即删除,属于主动删除,对key过期后自动删除,及时回收内存,节省内存资源,但对CPU的要求比较高,配置低不建议使用
  2. 惰性删除,键值过期后不会删除,只有在请求这个键值时才会检查key是否过期,过期了就删除,返回null。属于被动删除

七、redis常用注解

  1. @Cacheable 用于每次执行时,先从redis中查询是否有该key,若有则从redis获取直接返回,否则执行该注解标注的类方法。
  2. @CachePut,不会判断缓存中是否有该key,每次都会执行方法,并将结果存入缓存。
  3. @CacheEvict:用于删除数据时,同时删除缓存中的数据。

八、redis集群模式

  1. 主动模式:一台主机,一台备机
  2. 哨兵模式:安排一个哨兵或多个,当哨兵发现master挂掉后,会从slave中重选一个节点作为master主节点
  3. 集群模式:哨兵模式与主动模式的组合。通过Cluster可以实现主动和重新选择主节点。

九、持久化机制

        服务器重启后缓存数据清空,大量请求会直接查询数据库,造成缓存雪崩。因此需要对缓存数据进行持久化。如目录一。

十、redis危险命令

        redis主要的危险命令如下:

  1. FLUSHALL:清空所有redis数据和日志记录
  2. FLUSHDB:清空数据库所有数据
  3. KEYS:客户端连接后,可查看所有存在的键
  4. CONFIG:客户端连接后,可配置服务器

       禁用以上命令的具体做法为,修改redis.conf,在SECURITY项中,增加以下命令来实现禁用危险命令

  1. rename-command FLUSHALL ""
  2. rename-command FLUSHDB ""
  3. ename-command CONFIG ""
  4. ename-command KEYS ""

十一、缓存异常情况

(1)缓存雪崩

        缓存雪崩是指在某一段时间,大量缓存失效,导致大量的请求直接请求数据库。解决办法:

  1. 分散缓存时间:同一个项目的不同类型对象,缓存时间设置的不同,并且对缓存做权重区分,对重要的数据可设置有效期长一点儿。,而且尽量不要设置整时整分。
  2. 根据业务场景,配置不同的缓存失效时间

(2)缓存穿透

        缓存穿透是指用户查询数据,在数据库中没有,自然在缓存中也没有。这样导致用户在缓存中查不到,每次都会查数据库。解决方法如下:

  1. 如果查询数据库为空,则直接给缓存放一个默认值。这样第二次就不会去查数据库了
  2. 及时更新过期的数据。

(3)缓存击穿

        指一个存在的热点key,同时接收大量的请求,一旦失效,则请求会直接请求数据库,导致数据库压力骤增。解决方案:

  1. 对长期业务的热点数据不设置过期时间,或这是较长的缓存时间
  2. 给缓存加互斥锁

以上就是学习redis的内容了,更为详细、高阶的内容还需继续学习了解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值