Redis 是一个高性能的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,内存就会越来越多。那么就因该采用内存淘汰机 制。
配置内存淘汰策略:#maxmemory-policy volatile-lru
这里有本人写的适合新手的小项目,有意戳-->8个适合新手的Python小项目(本人所写)
本文章是由热衷python和前端原创发布,如需转载请注明出处
欢迎大家关注头条号:热衷python和前端
如果有需要源码的同学就留言或者私聊我吧