目录
一、redis的两种数据持久化方式
- RDB持久化(Relational Database),将内存中的数据定时备份至磁盘
- AOF,存储redis服务器的顺序指令序列,数据丢失后,可通过日志,按照顺序执行指令,恢复数据。
二、redis可存储的数据结构
redis本质上是一个key/value类型的数据库,每个key都是字符串类型。value包含以下几种类型:
1.字符串String类型
2.哈希hash类型
3.列表list类型
4.set类型,属于无序集合
5.有序集合zset类型
三、设置redis的最大缓存配置
当redis内存数据总和达到一定限制时,会实行数据淘汰策略。避免因内存溢出导致写入失败。
四、redis淘汰机制。
官方推荐使用“volatile-lru”策略,策略如下:
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集中,随机挑选任意数据进行淘汰
- allkeys-lru:从数据集中,挑选最近最少使用的数据淘汰
- allkeys-random:从数据集中任意选择数据淘汰
- no-enviction:禁止驱逐数据
redis为单线程处理指令,但IO层面却面向多个客户端并发的提供服务。多线程有利有弊,多线程存在上下文的切换,使得效率降低。所以redis内部使用IO多路复用框架来实现。
五、redis的序列化
redisTemplate默认为jdkSerializeable,而StringRedisTemplate的默认序列化方式为StringRedisSerializer。初始化时可设置redis的序列化方式,否则编码会有问题。
六、redis过期键删除策略
key到了过期时间后存在以下3种删除策略:
- 立即删除,属于主动删除,对key过期后自动删除,及时回收内存,节省内存资源,但对CPU的要求比较高,配置低不建议使用
- 惰性删除,键值过期后不会删除,只有在请求这个键值时才会检查key是否过期,过期了就删除,返回null。属于被动删除
七、redis常用注解
- @Cacheable 用于每次执行时,先从redis中查询是否有该key,若有则从redis获取直接返回,否则执行该注解标注的类方法。
- @CachePut,不会判断缓存中是否有该key,每次都会执行方法,并将结果存入缓存。
- @CacheEvict:用于删除数据时,同时删除缓存中的数据。
八、redis集群模式
- 主动模式:一台主机,一台备机
- 哨兵模式:安排一个哨兵或多个,当哨兵发现master挂掉后,会从slave中重选一个节点作为master主节点
- 集群模式:哨兵模式与主动模式的组合。通过Cluster可以实现主动和重新选择主节点。
九、持久化机制
服务器重启后缓存数据清空,大量请求会直接查询数据库,造成缓存雪崩。因此需要对缓存数据进行持久化。如目录一。
十、redis危险命令
redis主要的危险命令如下:
- FLUSHALL:清空所有redis数据和日志记录
- FLUSHDB:清空数据库所有数据
- KEYS:客户端连接后,可查看所有存在的键
- CONFIG:客户端连接后,可配置服务器
禁用以上命令的具体做法为,修改redis.conf,在SECURITY项中,增加以下命令来实现禁用危险命令
- rename-command FLUSHALL ""
- rename-command FLUSHDB ""
- ename-command CONFIG ""
- ename-command KEYS ""
十一、缓存异常情况
(1)缓存雪崩
缓存雪崩是指在某一段时间,大量缓存失效,导致大量的请求直接请求数据库。解决办法:
- 分散缓存时间:同一个项目的不同类型对象,缓存时间设置的不同,并且对缓存做权重区分,对重要的数据可设置有效期长一点儿。,而且尽量不要设置整时整分。
- 根据业务场景,配置不同的缓存失效时间
(2)缓存穿透
缓存穿透是指用户查询数据,在数据库中没有,自然在缓存中也没有。这样导致用户在缓存中查不到,每次都会查数据库。解决方法如下:
- 如果查询数据库为空,则直接给缓存放一个默认值。这样第二次就不会去查数据库了
- 及时更新过期的数据。
(3)缓存击穿
指一个存在的热点key,同时接收大量的请求,一旦失效,则请求会直接请求数据库,导致数据库压力骤增。解决方案:
- 对长期业务的热点数据不设置过期时间,或这是较长的缓存时间
- 给缓存加互斥锁
以上就是学习redis的内容了,更为详细、高阶的内容还需继续学习了解。