Redis学习笔记
2018-04-18 本文已影响0人
小霸王学习机_
Redis是什么?
- Redis使用C语言开发的一个开源的高性能键值对(key-vaiue)数据库。
- 通常被认为是一个数据结构服务器,它通过提供多种键值数据类型来适应不同场景下的存储需求,到目前为止Redis支持的键值数据类型如下:string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
Redis不是什么?
- 不是sql server、mySQL等关系型数据库,主要原因是:
- redis目前还只能作为小数据量存储(全部数据能够加载在内存中),海量数据存储方面并不是redis所擅长的领域。
- 设计、实现方法很不一样.关系型数据库通过表来存储数据,通过SQL来查询数据。而Redis通上述五种数据结构来存储数据,通过命令来查询数据。
- 不是Memcached等缓存系统,主要原因有以下几点:
- 网络IO模型方面:Memcached是多线程,分为监听线程、worker线程,引入锁,带来了性能损耗。Redis使用单线程的IO复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
- 内存管理方面:Memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 Redis更适合作为存储而不是cache
- 数据的一致性方面:Memcached提供了cas命令来保证.而Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断
- 存储方式方面:Memcached只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能
一句话小结一下:Redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
Redis特点
- 速度快:使用标准C写,所有数据都在内存中完成,Redis能读的速度是110000次/s,写的速度是81000次/s。
- 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof) 。
- 自动操作:对不同数据类型的操作都是自动的,很安全。
- 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
- Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。
Redis的缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上
Redis的应用场景
众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
总之,Redis的应用是非常广泛的,而且极有价值,真是服务器中的一件利器,所以从现在开始,我们就来一步步学好它。
这里对Redis数据库做下小结:
- 提高了DB的可扩展性,只需要将新加的数据放到新加的服务器上就可以了 。
- 提高了DB的可用性,只影响到需要访问的shard服务器上的数据的用户 。
- 提高了DB的可维护性,对系统的升级和配置可以按shard一个个来搞,对服务产生的影响较小 。
- 小的数据库存的查询压力小,查询更快,性能更好。
使用过程中的经验和教训:
- 要进行Master-slave配置,出现服务故障时可以支持切换。
- 在master侧禁用数据持久化,只需在slave上配置数据持久化。
- 物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉。这个情况就是灾难!
- 当Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了,就开始做swap,内存碎片大
- 当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间.
- redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题