北京高端网站定制公司,网站如何在国外推广,北京最大的广告公司,微信官网网站前面写了很多redis项目#xff0c;今天在通过redis的理论加深redis的了解#xff0c;顺便做个总结 Redis 理论部分
1.redis 速度快的原因
纯内存操作单线程操作#xff0c;避免频繁的上下文切换以及资源争用的问题#xff0c;多线程需要占用更多的cpu资源采用非阻塞I/O多… 前面写了很多redis项目今天在通过redis的理论加深redis的了解顺便做个总结 Redis 理论部分
1.redis 速度快的原因
纯内存操作单线程操作避免频繁的上下文切换以及资源争用的问题多线程需要占用更多的cpu资源采用非阻塞I/O多路复用机制提供了非常高效的数据结构比如双向列表压缩页表跳跃表等可以根据实际的数据类型选择合适的数据编码
Redis 是基于内存的操作CPU 一般不会是 Redis 的瓶颈Redis 的瓶颈最有可能是机器内存的大小或者网络宽带。既然单线程容易实现而且 CPU 不会成为瓶颈那么采用单线程的方案。 注意本质上 Redis 并不是单纯的单线程服务模型一些辅助工作比如持久化刷盘、惰性删除等任务是由 BIO线程来完成的这里说的单线程主要是说与客户端交互完成命令请求和回复的工作线程。 重点执行命令的核心模块是单线程的。新的命令并不会立即被执行而是统一的放到了队列中一条一条的执行单线程还有一个问题就是对于每个命令的执行时间是有要求的如果其中的某一个命令执行过长会造成其他命令的阻塞这对于 Redis 这种高性能的服务来说是致命的记住 Redis 是面向快速执行场景的数据库
2.充当缓存的 Redis 和 Memcached
1、存储方式上Memcache 会把数据全部存在内存之中断电后会挂掉数据不能超过内存大小。Redis 有部 分数据存在硬盘上这样能保证数据的持久性。 2、数据支持类型上Memcache 对数据类型的支持简单只支持简单 key-value而 Redis 最基本都要支持五 种数据类型。 3、使用底层模型不同它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建 了 VM 机制因为一般的系统调用系统函数的话会浪费一定的时间去移动和请求。 4、值大小Redis 可以达到 1GB而 Memcache 只有 1MB。
3.Redis 缓存使用场景
1、降低后端负载 2、加速请求响应 3、大量写合并为批量写
4.Redis 缓存策略
1、LRU、LFU、FIFO 2、超时剔除 3、主动更新
5.内存淘汰策略
1、volatile-lru 从已设置过期时间的数据集中挑选最近最少使⽤的数据淘汰 2、volatile-random 从已设置过期时间的数据集中任意选择数据淘汰 3、allkeys-lru 当内存不⾜以容纳新写⼊数据时在键空间中移除最近最少使⽤的 key常用 4、allkeys-random 从数据集中任意选择数据淘汰 5、volatile-ttl 从已设置过期时间的数据集中挑选将要过期的数据淘汰 6、no-eviction 禁止驱逐数据也就是说当内存不⾜以容纳新写⼊数据时新写⼊操作会报错 OOM。 4.0 版本后增加两种 7、volatile-lfu 从已设置过期时间的数据集中挑选最不经常使⽤的数据淘汰 8、allkeys-lfu 当内存不⾜以容纳新写⼊数据时在键空间中移除最不经常使⽤的 key。 常见选择: allkeys-lru 用于应用对缓存的访问符合幂律分布也就是存在相对热点数据或者不太清楚应用的缓存访问分布状况可以选择 allkeys-lru 策略。 allkeys-random 应用对于缓存 key 的访问概率相等则可以使用这个策略。 volatile-ttl 策略使得可以向 Redis 提示哪些 key 更适合被移除 Redis 删除策略 redis 开辟了一个空间用来存放值的地址和其过期时间删除策略是为了在内存和 cpu 之间找到一个平衡过期数据通常是在 cpu 闲暇之余被删除的。 Redis 中的过期数据删除情况redis 服务器当中有很多的操作需要被执行执行会导致 CPU 的工作大大的增加当内存的空间还足够时已被删除的数据的内存空间并未直接释放而是对客户端的指令先执行redis 中的数据删除策略包括定时删除、惰性删除、定期删除。 定时删除是对 CPU 和内存消耗取得一个折中方案通过每隔一段时间执行一次删除过期 key 的操作并且通过限制删除操作执行的时长和频率来减少删除操作对 CPU 造成的影响周期性轮询 redis 库中的时效性数据采用随机抽取的策略利用过期数据占比的方式控制删除频度。一般在 redis 应用中会使用惰性删除和定期删 除两种方式
6.Redis 缓存问题
1、缓存穿透大量请求缓存中数据库并不存在的数据。 解决方案 1、布隆过滤器。 2、缓存空对象 2、缓存击穿大量请求缓存中同时访问一个过期数据。 解决方案1、设置 key 永不过期和随机时间失效。 2、互斥锁使访问有序 3、缓存雪崩大量请求缓存中大面积失效的缓存数据。 解决方案1、缓存数据设置随机的过期时间防止同 一时间大量数据集合失效。 2、集群将数据分布在不同的缓存数据库中。 3、限流通过加锁或队列来控制读数据库写缓存的线程数量
7. redis 编程客户端
Lettuce 支持同步、异步通信的方式 API 调用也支持响应式编程 API包括发布/订阅消息、高可用性服务部署架构。 Jedis 是 Redis 的 Java 实现客户端提供了比较全面的 Redis 命令的支持。 **优点**提供了比较全面的 Redis 操作特性的 APIAPI 基本与 Redis 的指令一一对应使用简单易理解。 缺点同步阻塞 IO、不支持异步、线程不安全 Lettuce 高级 Redis 客户端用于线程安全同步异步和响应使用支持集群Sentinel管道和编码器。 优点线程安全基于 Netty 框架的事件驱动的通信可异步调用适用于分布式缓存 缺点API 更抽象学习使用成本高 使用 Jedis 和 lettuce 总结 1、调大连接池大小能够提高 jedis 的吞吐量但是不能避免出现超时错误和长时间等待。jedis 连接方式最大 连接数和最小、最大空闲连接数设置为一样有利于减少上下文切换时间提升效率。 2、lettuce 调大连接池大小反而会影响性能最佳个数CPU 核数1lettuce 整体稳定性和性能优于 jedis 方式。