赞
踩
优点:
应用场景:
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
单进程单线程优势:
单进程单线程弊端
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决办法:
缓存雪崩:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。
解决方法:
Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
Jedis 和 Redisson 都是Java中对Redis操作的封装。Jedis 只是简单的封装了 Redis 的API库,可以看作是Redis客户端,它的方法和Redis 的命令很类似。Redisson 不仅封装了 redis ,还封装了对更多数据结构的支持,以及锁等功能,相比于Jedis 更加大。但Jedis相比于Redisson 更原生一些,更灵活。
Redis官方对Java 语言的封装框架推荐的有十多种(Redis 官网),主要是Jedis 、Redisson。
淘汰缓存还是更新缓存:选择淘汰缓存,原因:数据可能为简单数据,也可能为较复杂的数据,复杂数据进行缓存的更新操作,成本较高,因此一般推荐淘汰缓存
先淘汰缓存还是先更新数据库:选择先淘汰缓存,再更新数据库,原因:假如先更新数据库,再淘汰缓存,假如缓存淘汰失败,那么后面的请求都会得到脏数据,直至缓存过期。假如先淘汰缓存再更新数据库,如果数据库更新失败,只会产生一次缓存miss,相比较而言,后者对业务影响更小一点。
延时双删策略:如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。
次数便出现了数据不一致问题。采用延时双删策略得以解决
- public void write(String key,Object data){
- redisUtils.del(key);
- db.update(data);
- Thread.Sleep(100);
- redisUtils.del(key);
- }
这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。
数据库读写分离的场景:两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。
依旧采用延时双删策略解决此问题
redis 持久化的两种方式:
append-only
的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。通过 RDB 或 AOF,都可以将 redis 内存中的数据给持久化到磁盘上面来,然后可以将这些数据备份到别的地方去,比如说阿里云等云服务。
如果 redis 挂了,服务器上的内存和磁盘上的数据都丢了,可以从云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动 redis,redis 就会自动根据持久化数据文件中的数据,去恢复内存中的数据,继续对外提供服务。
如果同时使用 RDB 和 AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。
RDB 优缺点:
AOF 优缺点:
fsync
操作,最多丢失 1 秒钟的数据。append-only
模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。rewrite
log 的时候,会对其中的指令进行压缩,创建出一份需要恢复数据的最小日志出来。在创建新日志文件的时候,老的日志文件还是照常写入。当新的 merge 后的日志文件 ready 的时候,再交换新老日志文件即可。flushall
命令清空了所有数据,只要这个时候后台 rewrite
还没有发生,那么就可以立即拷贝 AOF 文件,将最后一条 flushall
命令给删了,然后再将该 AOF
文件放回去,就可以通过恢复机制,自动恢复所有数据。fsync
一次日志文件,当然,每秒一次 fsync
,性能也还是很高的。(如果实时写入,那么 QPS 会大降,redis 性能会大大降低)RDB 和 AOF 到底该如何选择
分布式锁需要解决的问题:
实现分布式锁:通过setNX 命令实现:redisTemplate用setNX命令实现分布式锁_MR.骑士道-CSDN博客_redistemplate分布式锁setnx
Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。
maxmemory 用于指定 Redis 能使用的最大内存。既可以在 redis.conf 文件中设置, 也可以在运行过程中通过 CONFIG SET 命令动态修改。
例如, 要设置 100MB 的内存限制, 可以在 redis.conf 文件中这样配置:maxmemory 100mb
当内存使用达到最大限制时, 如果需要存储新数据, 根据配置的策略(policies)的不同, Redis可能直接返回错误信息, 或者删除部分老的数据。
策略选择:
volatile-lru 和 volatile-random 策略主要应用场景是: 既有缓存,又有持久key的实例中。 一般来说, 像这类场景, 应该使用两个单独的 Redis 实例。
值得一提的是, 设置 expire 会消耗额外的内存, 所以使用 allkeys-lru 策略, 可以更高效地利用内存, 因为这样就可以不再设置过期时间了。
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!
注:此博客只是为了记忆相关知识点,大部分为网络上的文章,在此向各个文章的作者表示感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。