什么是RedisRedis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 优点
缺点及解决办法缓存和数据库双写一致性问题 必然存在不一致问题,如果对数据有较强的一致性要求,不要加缓存,直接访问数据库。先更改数据库,在删除缓存,可能存在删除缓存失败问题,提供补偿策略:消息队列 缓存雪崩问题 黑客故意请求缓存中不存在的数据,导致所有请求都到了数据库上 缓存击穿问题 缓存同一时间大面积失效,所有请求都到了数据库上 解决这两个问题方案:给缓存加上随机失效时间,避免同时失效。使用互斥锁。双缓存,设定不同的缓存时间。 缓存的并发竞争问题 1、redis事务机制,不推荐。因为大多数生产环境都是redis集群环境,做了数据分片。 2、如果对key操作,不要求顺序,准备一个分布锁,去抢锁 3、如果对key操作,要求顺序,对系统设定不同的字段,那个修改了就修改这个字段 注意: 1、redis是单线程的,但是速度还是非常快 a.纯内存操作 b.单线程操作,避免了频繁的上下文切换 c.采用了非阻塞I/O多路复用机制 参照上图,简单来说,就是。我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。 2、redis采用定期删除和惰性删除策略 定时删除和定期删除是不同的 定时删除:用一个定时器来监视key,如果key过期了就删除,但是会占用大量的CPU资源,当有大并发时,CPU因该将时间应用在处理请求 上而不是删除key 定期删除:默认每隔一段时间就检查是否有key过期,如果过期就删除。redis不是检查所有的key,而是随机抽测检查 惰性删除:在获取某个key的时候,redis会检查一下,如果过期了,就删除 采用定期删除和惰性删除也是有问题的,如果定期删除没有删除key,你也没有去请求key,内存就会越来越多。那么就因该采用内存淘汰机 制。 |
|
来自: 昵称11935121 > 《未命名》