Redis

提到redis,首先要谈一下noSQL。

1、什么是noSQL?

  NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。传统关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:

  (1)High performance - 对数据库高并发读写的需求:web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。

  (2)Huge Storage - 对海量数据的高效率存储和访问的需求:类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。

  (3)High Scalability&& High Availability- 对数据库的高可扩展性和高可用性的需求:在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

  NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

  NoSQL数据库的四大分类如下:

  ● 键值(Key-Value)存储数据库

    相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB

    典型应用: 内容缓存,主要用于处理大量数据的高访问负载。 

    数据模型: 一系列键值对

    优势: 快速查询

    劣势: 存储的数据缺少结构化

  ● 列存储数据库

    相关产品:Cassandra, HBase, Riak

    典型应用:分布式的文件系统

    数据模型:以列簇式存储,将同一列数据存在一起

    优势:查找速度快,可扩展性强,更容易进行分布式扩展

    劣势:功能相对局限

  ● 文档型数据库

    相关产品:CouchDB、MongoDB

    典型应用:Web应用(与Key-Value类似,Value是结构化的)

    数据模型: 一系列键值对

    优势:数据结构要求不严格

    劣势: 查询性能不高,而且缺乏统一的查询语法

  ● 图形(Graph)数据库

    相关数据库:Neo4J、InfoGrid、Infinite Graph

    典型应用:社交网络

    数据模型:图结构

    优势:利用图结构相关算法。

    劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

  redis就是noSQL数据库的一种。

2、redis的应用场景。

  Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型有:字符串类型、散列类型、列表类型、集合类型、有序集合类型。

  80%的用户请求都集中在20%的热门数据上,所以我们要将这20%的数据放在缓存里。redis可以作为系统缓存(数据查询、短连接、新闻内容、商品内容等);还可以做分布式集群架构中的session分离、聊天室的在线好友列表、任务队列(秒杀、抢购、12306)、应用排行榜、网站访问统计等都有应用。

3、redis的持久化方案

  Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

  Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。

  RDB持久化

    RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

    RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

      save 900 1

      save 300 10

      save 60 10000

    save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系,“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照,“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。

    在redis.conf中:

    配置dir指定rdb快照文件的位置

    配置dbfilenam指定rdb快照文件的名称

    Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

  问题总结:

    通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

  AOF持久化

默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

      appendonly yes

    开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof

  Redis的持久化方案应该怎么选择?

  Redis中数据两种情况:

  一、redis中存储的是从数据库中取出的内容,不使用持久化方案;

  二、先向redis中写入数据,通过持久化方案向数据库中保存,这就需要使用持久化方案。如果数据不是非常重要,可以选择RDB;否则使用AOF方案。

4、主从复制

  持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

          

  ● 说明:

    主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

    主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

    只有一个主redis,可以有多个从redis。主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求。

    一个redis还可以即是主又是从,如下图:

                            

时间: 2024-11-18 22:54:08

Redis的相关文章

Redis 数据备份与恢复

Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1:6379> SAVE OK 该命令将在 redis 安装目录中创建dump.rdb文件. 恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可.获取 redis 目录可以使用 CONFIG 命令,如下所示: redis 127.0.0.1:6379

Redis之七种武器

长生剑.孔雀翎.碧玉刀.多情环.离别钩.霸王枪.拳头是古龙笔下的七种武器,而本文打算将Redis的几种使用方式 Strings.Hashs.Lists.Sets.Sorted Sets.Pub/Sub.Transactions 也比作七种武器,为大家讲解Redis的七种特性,并列举其适合的应用场景. Strings Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.使用Strings类型,你可以完全实现目前 Memcached 的功能,并且效

java实现redis数据库访问

分析亚马逊AWS数据存储-----http://edu.csdn.net/course/detail/873 一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6 下载windows平台文件: 解压后,选择当前64位win7系统对应的版本: 2.安装 1)解压后将里面所有文件拷贝至redis安装目录: 几个exe程序的功能:   redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发

Redis内存数据库操作命令详解

一.连接操作相关的命令    quit关闭连接connection    auth简单密码认证 二.对value操作的命令    exists(key)确认一个key是否存在    del(key)删除一个key    type(key)返回值的类型    keys(pattern)返回满足给定pattern的所有key    randomkey随机返回key空间的一个key    rename(oldname, newname)将key由oldname重命名为newname若newname存在

Windows Server 2016 配置指南 之 安装 PHP redis 拓展

前文 安装 Redis3.0 介绍了服务器安装 Redis3.0,但是就像我们安装了 Mysql 依旧需要然后对应的 php 驱动拓展一样,redis 也是.这里就讲一下如何安装 Redis 的 php 拓展. 尽管 PHP7 正式版出来已经有个把月数了,但是提供 Windows 系统使用的 phpredis 已经没有更新.见地址:http://windows.php.net/downloads/pecl/releases/redis/ ,依旧是旧的. 不过么,phpredis 的 php7 分

java如何队列同步redis?

问题描述 java如何队列同步redis? 就是数据批量插入redis,然后再同步插入到数据库里面,怎么搞 解决方案 java redis使用之利用jedis实现redis消息队列0135 java redis使用之利用jedis实现redis消息队列java redis使用之利用jedis实现redis消息队列 解决方案二: 一般是数据先插入数据库,然后再利用触发器等把数据插入redis.或者用过期方式来从数据库同步数据到redis

redis 异常,Could not return the resource to the pool

问题描述 redis 异常,Could not return the resource to the pool 解决方案 Redis没启动还有防火墙连接不上吧. 解决方案二: http://blog.csdn.net/freebird_lb/article/details/7460328 解决方案三: https://github.com/xetorthio/jedis/issues/560 解决方案四: http://blog.csdn.net/testcs_dn/article/detail

Redis 代理服务Twemproxy

1.twemproxy explore &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;     当11545.html">我们有大量 Redis 或 Memcached 的时候,通常只能通过客户端的一些数据分配算法(比如一致性哈希),来实现集群存储的特性.虽然Redis 2.6版本已经发布Redis Cluster,但还不是很成熟适用正式生产环境. Redis 的 Cluster 方案还没有正式推

redis的那些事

持久化  redis支持RDB和AOF两种持久化方式   The RDB persistence performs point-in-time snapshots of your dataset at specified intervals. RDB是一种即时快照的存储方式,定时对数据库进行snapshot RDB优点: 1 RDB对于数据备份非常容易.你可以设置1天或者30天对数据进行一次备份,这样当发生数据灾难的时候能很容易恢复 2 由于RDB对数据备份时redis只做备份操作,所以备份最大

Redis缓存数据库安装

简单介绍: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中. 区别的是redis会周