β

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

Harries Blog™ 114 阅读

NoSQL,泛指非关系型的 数据库 ,NoSQL 即 Not-Only SQL,它可以作为关系型 数据 库的良好补充。随着 互联网 web 2.0 网站 的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库 产品 的发展非常迅速。而传统的关系数据库在应付 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 产品:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

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

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

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

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

    数据模型 : 一系列键值对

    优势: 快速查询

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

  • 2)列存储数据库

    相关产品: Cassandra HBase 、Riak

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

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

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

    劣势:功能相对局限

  • 3)文档型数据库

    相关产品:CouchDB、 MongoDB

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

    数据模型: 一系列键值对

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

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

  • 4)图形(Graph)数据库

    相关数据库:Neo4J、InfoGr id 、Infinite Graph

    典型应用: 社交网络

    数据模型:图结构

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

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

1.2 redis 历史发展

2008年,意大利的一家 创业公司 Merzia 推出了一款基于 MySQL 的网站实时统计系统 LLOOGG,然而没过多久该公司的 创始人 SalvatoreSanfil ip po 便 对 MySQL 的性能感到失望,于是他决定亲自为 LLOOGG 量身定做一个数据库,并于 2009 年 开发 完成,这个数据库就是 Redis。 不过 SalvatoreSanfilippo 并不满足只将 Redis 用于 LLOOGG 这一款产品,而是 希望 更多的人使用它,于是在同一年 SalvatoreSanfilippo 将 Redis 开源 发布,并开始和 Redis 的另一名主要的 代码 贡献者 PieterNoordhuis 一起继续着 Redis 的开发,直到今天。

SalvatoreSanfilippo 自己也没有想到,短短的几年 时间 ,Redis 就拥有了庞大的用户群体。Hacker News 在 2012 年发布了一份数据库的使用情况调查,结果显示有近 12% 的公司在使用 Redis。国内如新浪 微博 、街旁网、知乎网,国外如 GitHub 、Stack Overflow、Flickr 等都是 Redis 的用户。

VMware 公司从 2010 年开始赞助 Redis 的开发, Salvatore Sanfilippo 和 Pieter Noordhuis 也分别在 3 月和 5 月加入 VMware,全职开发 Redis。

1.3 什么是redis

Redis 是用 C 语言开发的一个开源的高性能键值对( key - value )数据库。

Redis 是一个 no sql (not only sql不仅仅只有sql)数据库, 翻译 成中文叫做非关系型型数据库。Redis 是将数据存放到内存中,由于内容存取速度快所以 Redis 被广泛应用在互联网项目中,

  • Redis 优点:存取速度快,官方称读取速度会达到 30 万次每秒,写速度在 10 万次每秒最有,具体限制于硬件。
  • 缺点:对持久化支持不够良好,所以 redis 一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用。

Redis 通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止 Redis 支持的键值数据类型如下:

  • 字符串类型
  • 散列类型
  • 列表类型
  • 集合类
  • 有序集合类型

1.4 redis应用场景

1)缓存(数据查询、 短连接 、新闻内容、商品内容等等)。(最多使用)

2)分布式 集群 架构中的 session 分离。

3)聊天室的在线好友列表。

4)任务队列(秒杀、抢购、 12306 等等)

5)应用排行榜。

6)网站访问统计。

7)数据过期处理(可以精确到毫秒)

8)保存 博客 或者论坛的留言回复,等等…..

二、 安装 运行redis

在线上 redis 一般都是安装在 Linux 服务器上运行,本教程使用 Linux 虚拟机及 ssh 客户端进行演示学习。

Linux 服务器为 CentOS 6.4。

ssh 客户端:在开发环境( windows )安装 ssh 客户端,本文使用 SecureCRT 作为 ssh 客户端连接虚拟机。

2.1 redis安装环境

redis 是 C 语言开发,建议在 Linux 上运行,本文使用 Centos6 .4 作为安装环境。

安装 redis 需要先将官网 下载 源码 进行 编译 ,编译依赖 gcc 环境,如果没有 gcc 环境,需要安装 gcc: yum install gcc-c++

2.2 redis安装

1)版本说明

本文使用 redis3.0 版本。3.0 版本主要增加了 redis 集群功能。

2)源码下载

从官网下载: download.redis.io/releases/re…

将 redis-3.0.0. tar .gz 拷贝到 /usr/local 下。

3)解压源码: tar -zxvf [redis-3.0.0]().tar.gz

4)进入解压后的 目录 进行编译

cd /usr/local/redis-3.0.0
make
复制代码

5)安装到指定目录,如 /usr/local/redis

cd /usr/local/redis-3.0.0 
make PREFIX=/usr/local/redis install
复制代码

6)redis.conf

redis.conf 是 redis 的 配置 文件, redis.conf 在 redis 源码目录。

注意修改 port 作为 redis 进程 端口 ,port 默认 6379。

7)拷贝配置文件到安装目录下

进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下:

cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf  /usr/local/redis/bin
复制代码

8)安装目录 bin 下的文件列表

Redis学习笔记(Jedis&数据类型&持久化&主从复制)
Redis学习笔记(Jedis&数据类型&持久化&主从复制)

redis3.0 新增的 redis-sentinel 是 redis 集群 管理 工具可实现高可用。配置文件目录:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

2.3 redis启动

2.3.1 前端模式启动

直接运行 bin/redis-server 将以前端模式启动,前端模式启动的缺点是 ssh 命令窗口关闭则 redis-server 程序结束,不推荐使用此方法。如下图:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

2.3.2 后端模式启动

修改 redis.conf 配置文件,daemonize yes 以后端模式启动。

执行如下命令启动 redis:

cd /usr/local/redis
./bin/redis-server ./redis.conf
复制代码

redis 默认使用 6379 端口。

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

也可更改 redis.conf 文件,修改端口号:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

2.3.3 启动多个redis进程

1)方法一:

启动时指定端口可在一台服务器启动多个 redis 进程。

cd /usr/local/redis/bin
./redis-server ./redis.conf --port 6380
复制代码

2)方法二(推荐此方法):

创建多个 redis 目录,以端口号命名,比如:创建 6379、6380 两个目录,将 redis 的安装文件 bin 和 conf 拷贝至这两个目录。

修改 6379 目录下的 redis.conf 设置端口号为 6379。

修改 6380 目录下的 redis.conf 设置端口号为 6380

启动 6379 和 6380 目录下的 redis-server 程序:

cd 6379
./redis-server . /redis.conf
cd 6380
./redis-server . /redis.conf
复制代码

查询当前 redis 的进程:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

2.4 redis停止

强行终止 redis 进程可能会导致 redis 持久化数据丢失。正确停止 redis 的方式应该是向 redis 发送 shutdown 命令,方法为:

cd /usr/local/redis
./bin/redis-cli shutdown
复制代码

2.5 redis客户端

在 redis 的安装目录中有 redis 的客户端,即 redis-cli(Redis Command Line Interface),它是 redis 自带的基于命令行的 redis 客户端。

2.5.1 连接redis 服务端

执行 bin/redis-cli 连接 redis 服务端:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

从上图得知 redis-cli 默认连接本机的 redis,本机的 redis 没有启动则报上图中的错误。

指定连接 redis 服务的 ip 和端口:

Redis学习笔记(Jedis&数据类型&持久化&主从复制)

2.5.2 向redis服务端发送命令

redis-cli 连上 redis 服务后,可以在命令行发送命令。

  • ping:

    redis 提供了 ping 命令来 测试 客户端与 redis 的连接是否正常,如果连接正常会收到回复 PONG

    Redis学习笔记(Jedis&数据类型&持久化&主从复制)
作者:Harries Blog™
追心中的海,逐世界的梦