Redis
Posted bluecom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。
Redis使用场景
1 Redis 是什么?
通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等 等,分类的标准也不以,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数 据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT)
等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。 更为详细的描述请参考如下: http://code.google.com/p/redis/wiki/index Redis官方也同样提供了一个名为Retwis的项目代码,可以对照着官方学习。2 Redis用来做什么? 通常局限点来说,Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在Redis之中,期间也包扩Storm对于Redis列表的读取和更新。3 Redis的优点性能极高 – Redis能支持超过 100K+ 每秒的读写频率。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。4 Redis的缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 总结: Redis受限于特定的场景,专注于特定的领域之下,速度相当之快,目前还未找到能替代使用产品。在使用缓存的时候,redis比memcached具有更多的优势,并且支持更多的数据类型。
Redis是什么?两句话可以做下概括:
1. 是一个完全开源免费的key-value内存数据库
2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
Redis不是什么?同样从两个方面来做下对比:
1. 不是sql server、mysql等关系型数据库,主要原因是:
. redis目前还只能作为小数据量存储(全部数据能够加载在内存中) ,海量数据存储方面并不是redis所擅长的领域
. 设计、实现方法很不一样.关系型数据库通过表来存储数据,通过SQL来查询数据。而Redis通上述五种数据结构来存储数据,通过命令 来查询数据
2. 不是Memcached等缓存系统,主要原因有以下几个:
.网络IO模型方面:Memcached是多线程,分为监听线程、worker线程,引入锁,带来了性能损耗。Redis使用单线程的IO复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
.内存管理方面:Memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 Redis更适合作为存储而不是cache
.数据的一致性方面:Memcached提供了cas命令来保证.而Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断
. 存储方式方面:Memcached只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能
一句话小结一下:Redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
Redis有什么用?只有了解了它有哪些特性,我们在用的时候才能扬长避短,为我们所用:
1. 速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
2. 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
3. 自动操作:对不同数据类型的操作都是自动的,很安全
4. 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
5. Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。
这里对Redis数据库做下小结:
1. 提高了DB的可扩展性,只需要将新加的数据放到新加的服务器上就可以了
2. 提高了DB的可用性,只影响到需要访问的shard服务器上的数据的用户
3. 提高了DB的可维护性,对系统的升级和配置可以按shard一个个来搞,对服务产生的影响较小
4. 小的数据库存的查询压力小,查询更快,性能更好
写到这里,可能就会有人急不可待地想用它了,那怎么用呢?可以直接到官方文档,里面帮我们整理好了各个语言环境下的客户端,主要有Ruby、Python、 php、Perl、Lua、Java、C#....有几种语言,我也没见过,所以就不多说了,你懂的....
最后,把我使用过程中的一些 经验与教训,做个小结: 1. 要进行Master-slave配置,出现服务故障时可以支持切换。 2. 在master侧禁用数据持久化,只需在slave上配置数据持久化。 3. 物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉。这个情况就是灾难! 4. 当Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了,就开始做swap,内存碎片大 5. 当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间. 6. redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题4 附-了解:
1. NoSql是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准,
ACID属性,表结构等等,这类数据库主要有一下特点:非关系型的,分布式的,开源的,水平可扩展的。
2. NoSql的特点:
a) 处理超大量的数据。
b) 运行在便宜的pc服务器集群上
c) 击碎了性能瓶颈。
3. NoSql适用场景
a) 对数据高并发读写。(咱们在对mysql进行上万次的写操作,那么咱们的硬盘io就可能无法承受了)
b) 对海量数据的高效率存储和访问。
c) 对数据的高可扩展和高可用性。(数据库可以增加一个服务器节点来完成数据迁移和数据库维护)
4. Redis 是完全开源免费的,遵守BSD协议,先进的key - value持久化产品。它通常被称为(数据结构服务器),因为值(value)可以是 字符串(String), 哈希(Map), 链表(list), 集合(sets) 和 有序集合(sorted sets)等类型.
5. Redis是一个key-value存储系统。它支持存储的value类型很多,包括string,list,set,zset(有序集合).这些数据类 型都支持push/pop,add/remove及取交集和并集及更丰富的操作,Redis支持各种不同方式的排序(因为redis中有zset数据结 构,这是通过一个键来存储它的顺序)。为了保证效率,数据都是缓存在内存中,它可以周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。(把 修改操作写入追加的记录文件这个类似于mysql中的bin-log,存储的都是更新数据,插入数据和删除数据的相关操作)
6. Redis提供的API语言: http://www.redis.io/clients
7. Redis适用场合
a) 应用程序直接访问Redis数据库
注意:这样直接访问Redis数据库可能存在某些问题,读写都是直接操作数据库,这样做比较简单,但是如果某天我的某台Redis 数据库down掉了,那我的数据就会永久的丢失。
b) 应用程序直接访问Redis,只有Redis访问失败时才访问Mysql
分析:首先我们的应用程序直接先访问我们的Redis server,向redis里面写。此时redis会跟后面的mysql集群进行同步。当redis服务down掉以后,应用服务器会去找后面的mysql。
Redis更加实用的场景:
取最新N个数据的操作
排行榜应用,取TOP N操作
需要精确设定过期时间的应用(可以对键设置过期时间,这个mysql就无法做到)
计数器应用
Uniq操作,获取某段时间所有数据排重值
实时系统,反垃圾系统。
Pub/Sub构建实时消息系统。(发布与订阅是redis独有的系统)
构建队列系统。
缓存
8. mysql与redis、mongodb的比较
以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章