Redis是一个分布式缓存技术,是目前访问效率最好的缓存
一般采用AOF+RDB一起配合使用
Redis支持数据库的持久化。Redis提供了两种持久化的策略:
AOF:默认每秒进行数据同步到持久化的策略,即使数据丢失,也仅仅丢失1秒钟的数据。
RDB(默认):默认三种存储数据的条件(满足任意一个都会出发持久化的逻辑):
900 1 900秒内被发生至少1次修改
300 10 300秒内发生了10次修改
60 10000 60秒内发生10000次修改
怎么配置持久化策略?
在redis的配置中save属性表示的就是RDB持久化策略。
“save”
“900 1 300 10 60 10000”
redis中appendonly的配置是用来开启AOF存储策略的。yes为开启,no为关闭。
“appendonly”
“no”
此配置每秒进行持久化操作
“appendfsync”
“everysec”
建议:
如果允许一定的数据丢失,建议只使用RDB,因为性能高一些。
如果能接受数据丢失的量比较小,建议使用AOF。
如果不接受数据的丢失,建议是使用AOF+RDB方式
Redis的存储大小:
32位系统 默认为3G
64位系统 无限制 一般电脑内存多大 Redis 的内存就有多大
缓存解决的问题:
使用Redis缓存是为了解决高并发时,数据库的压力过大导致的宕机问题。同时也提高了数据的查询速度
什么是缓存穿透和雪崩?
缓存是为了减轻数据库的压力、提升数据的查询效率。但是按照一般逻辑,数据在缓存中没有取到就会去数据库中获取,如果大量的访问都没有在缓存中获取到数据,就有“穿透”的问题,进而带来缓存雪蹦的问题。
1、大并发环境下,第一次访问缓存,发现缓存中没有数据,然后所有线程都会去访问数据库,这样就造成缓存短暂失效,这就是“缓存穿透”。
缓存穿透的危害:导致大量的请求直接到数据库,导致数据库的承载压力过大导致宕机。
2、数据库查询不到这个数据,在redis中保存的key所对应的value就为null。那代码逻辑也会出现穿透。
先判断key是否在缓存中存在,只要存在key,不论value是否为null,都认为缓存中有 数据,主要有数据就不要再访问数据库。
解决穿透和雪蹦问题的思维导图:
总结:
1、双重检测机制(在锁的内外都进行缓存查询,没有查到在进行数据库查询)。
2、不论查询到的数据是否为null,都将它写入缓存。
3、避免缓存中的null键值撑满整个内存,所以需要给null键值设置过期时间。
4、提前分析项目中可能出现并发的数据,提前将这些数据写入缓存。(在tomcat容器启动的时候写入缓存)
5、key的设计,要唯一标识一条数据,不能被其他数据覆盖。
比如
分页,book_page_1, book_page_2.
缓存ID为1的数据:book_id_1
通过这些步骤,既能解决穿透又能保证效率。
Redis优化
1、使用byte进行数据存储、和数据操作,能更合理的使用空间。
2、使用hash类型存储数据,因为Hash算法得到的数据的长度基本固定,即使再大的数据经过hash算法之后,长度也比较短。
3、key值设计不宜过长。