Redis概述:了解这个高性能数据库

发表时间: 2018-06-28 17:48

什么是Redis

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

优点

  1. 性能,由于是存储在内存当中,所以有较快的读取速度,读在10万每秒,取在8万每秒。
  2. 并发,可以将redis做一个数据库的缓冲,让请求先访问redis而不是直接访问数据库
  3. 多种数据结构,不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  4. 持久化,支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  5. 支持数据备份,Redis支持数据的备份,即master-slave模式的数据备份。

缺点及解决办法

缓存和数据库双写一致性问题

必然存在不一致问题,如果对数据有较强的一致性要求,不要加缓存,直接访问数据库。先更改数据库,在删除缓存,可能存在删除缓存失败问题,提供补偿策略:消息队列

缓存雪崩问题

黑客故意请求缓存中不存在的数据,导致所有请求都到了数据库上

缓存击穿问题

缓存同一时间大面积失效,所有请求都到了数据库上

解决这两个问题方案:给缓存加上随机失效时间,避免同时失效。使用互斥锁。双缓存,设定不同的缓存时间。

缓存的并发竞争问题

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和前端

如果有需要源码的同学就留言或者私聊我吧