Redis教程1--入门篇

一、Redis简介:

Redis(http://redis.io)是一款开源的、高性能的键-值存储(key-value store),它是用ANSI C来编写。Redis的项目名是Remote Dictionary Server的缩写,但它常被称作是一款数据结构服务器(data structureserver)。Redis的键值可以包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。

为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。根据使用场景的不同,你可以每隔一段时间将数据集转存到磁盘上来持久化数据,或者在日志尾部追加每一条操作命令。

Redis同样支持主从复制(master-slave replication),并且具有非常快速的非阻塞首次同步(non-blockingfirst synchronization)、网络断开自动重连等功能。同时Redis还具有其它一些特性,其中包括简单的check-and-set机制、pub/sub和配置设置等,以便使得Redis能够表现得更像缓存(cache)。

Redis还提供了丰富的客户端,以便支持现阶段流行的大多数编程语言。

二、Redis安装:

2.4.15目前是最新稳定版。下载地址:http://redis.googlecode.com/files/redis-2.4.15.tar.gz

linux下运行如下命令进行安装(linux上已经安装好了gcc):


$ tar xzf redis-2.4.15.tar.gz

$ cd redis-2.4.15

$ make

make完后 redis-2.4.15/src目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli。

下面启动redis服务:


$./redis-server

这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动:


$./redis-server ../redis.conf

在redis-2.4.15目录下的redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了:


$ ./redis-cli

redis 127.0.0.1:6379> set foo bar

OK

redis 127.0.0.1:6379> get foo

"bar"

上面演示了get和set命令操作简单类型value的例子。foo是key ,bar是个string类型的value。

停止Redis命令:

./redis-cli-p 6379 shutdown     其中6379是redis的端口号

三、Redis客户端:

Redis的客户端有很多,有C、C++、C#、Java、PHP、Perl、Python、Ruby等等,支持现阶段流行的大多数编程语言,详情请看redis官网:http://redis.io/clients

下面是Java版的Redis客户端示例:

客户端jar包地址https://github.com/xetorthio/jedis/downloads


package com.jd.redis.client;

import redis.clients.jedis.Jedis;

publicclass App {

publicstaticvoid main(String[] args) {

Jedis jr = null;

try {

//redis服务地址和端口号

jr = new Jedis("192.168.157.128",
6379);

String key =
"mkey";

jr.set(key,"hello,redis!");

String v = jr.get(key);

String k2 =
"count";

jr.incr(k2);

jr.incr(k2);

System.out.println(v);

System.out.println(jr.get(k2));

} catch (Exception e) {

e.printStackTrace();

}

finally{

if(jr!=null){

jr.disconnect();

}

}

}

}

Jedis客户端支持对象池,可以通过JedisPool.getResource方法从池中获取Jedis客户端对象,通过JedisPool.returnResource方法释放Jedis对象到池中,用对象池我们可以节省很多重新连接Redis Server的建议连接的时间,下面就是不用Jedis对象池与用Jedis对象池的一个性能对比:

测试方法:分别用直接new Jedis和从池中获取Jedis对象的方法,起200个并发,生个并发循环1000次。每个并发线程用一个Jedis对象。

测试代码如下:


package com.jd.redis.client;

import java.util.concurrent.CountDownLatch;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

publicclass JedisPoolTest {

privatestatic JedisPoolConfigconfig;//Jedis客户端池配置

privatestatic JedisPoolpool;//Jedis客户端池

static{

config =new JedisPoolConfig();

config.setMaxActive(60000);

config.setMaxIdle(1000);

config.setMaxWait(10000);

config.setTestOnBorrow(true);

pool =new
JedisPool(config,"192.168.157.128", 6380);

}

/**

* 单笔测试(不用池)

* @param count

*/

publicstaticvoid testNoPool(int
count){

for(int i=0;i<count;i++){

Jedis jr = null;

try {

jr = new Jedis("10.10.224.44", 6379);

testOnce(jr);

} catch (Exception e) {

e.printStackTrace();

}

finally{

if(jr!=null)jr.disconnect();

}

}

}

/**

* 单笔测试(用池)

* @param count

*/

publicstaticvoid testWithPool(int
count){

for(int i=0;i<count;i++){

Jedis jr = null;

try {

jr = pool.getResource();

testOnce(jr);

} catch (Exception e) {

e.printStackTrace();

}

finally{

if(jr!=null)pool.returnResource(jr);

}

}

}

/**

* 并发测试(不用池)

* @param paiallel并发量

* @param count每个并发循环次数

*/

publicstaticvoid paiallelTestNoPool(int
paiallel, int count){

Thread[] ts = new Thread[paiallel];

//用该对象保证所线程都完成主线程才退出

CountDownLatch cd = new CountDownLatch(paiallel);

long start = System.currentTimeMillis();

for(int i=0; i < paiallel; i++){

ts[i] = new Thread(new WorkerNoPool(cd, count));

ts[i].start();

}

try {

cd.await();//等待所有子线程完成

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("NoPool useTime:"+ (System.currentTimeMillis()
- start));

}

/**

* 并发测试(用池)

* @param paiallel并发量

* @param count每个并发循环次数

*/

publicstaticvoid paiallelTestWithPool(int
paiallel, int count){

//用该对象保证所线程都完成主线程才退出

CountDownLatch cd = new CountDownLatch(paiallel);

long start = System.currentTimeMillis();

Thread[] ts = new Thread[paiallel];

for(int i=0; i < paiallel; i++){

ts[i] = new Thread(new WorkerWithPool(cd, count));

ts[i].start();

}

try {

cd.await();//等待所有子线程完成

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("Pool useTime:"+ (System.currentTimeMillis() -
start));

pool.destroy();

}

privatestaticvoid testOnce(Jedis jr){

System.out.println(jr.incr("incrTest"));

}

publicstaticclass WorkerNoPoolimplements
Runnable{

private CountDownLatchcd;

privateintcount;

public WorkerNoPool(CountDownLatch cd,int count){

this.cd = cd;

this.count = count;

}

publicvoid run() {

try {

testNoPool(this.count);

} catch (Exception e) {

e.printStackTrace();

}

finally{

cd.countDown();

}

}

}

publicstaticclass WorkerWithPoolimplements
Runnable{

private CountDownLatchcd;

privateintcount;

public WorkerWithPool(CountDownLatch cd,int count){

this.cd = cd;

this.count = count;

}

publicvoid run() {

try {

testWithPool(this.count);

} catch (Exception e) {

e.printStackTrace();

}

finally{

cd.countDown();

}

}

}

publicstaticvoid main(String[] args) {

paiallelTestNoPool(100, 1000);

//paiallelTestWithPool(100, 1000);

}

}

测试输出:


NoPool useTime:43863 //没用对象池的输出

Pool useTime:12101    //用了对象池的输出

从测试结果看没用对象池的时间要比用了对象池的时间多出31762毫秒,同时没有用对象池的还出现了很多超时情况,用了对象池的都成功了,运行10000次,我们姑且可以认为平均每次请求可以节约3.1762(31762/10000)毫秒连接时间。我用的是Win7中的Jedis Java客户端程序连接局域网的Linux虚拟机上的Redis Server。

各种客户端实际是对Redis Protocol的封装,方便我们使用,了解Redis Protocol后我们也可以自己实现客户端。

Redis Protocol详情请看:http://www.hoterran.info/redis_protocol

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 09:47:32

Redis教程1--入门篇的相关文章

SQLAlchemy 教程 —— 基础入门篇

SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLAlchemy 进行简单了 CURD 操作及使用 Faker 生成测试数据. 1.2课程知识点 学会用 SQLALchemy 连接数据库(MySQL, SQLite, PostgreSQL), 创建数据表: 掌握表数据之间一对一,一对多及多对多的关系并能转化为对应 SQLAlchemy 描述: 掌握使

Spring Boot 2.0 WebFlux 教程 (一) | 入门篇

目录 一.什么是 Spring WebFlux 二.WebFlux 的优势&性能 三.WebFlux 应用场景 四.适用性 五.快速入门 5.1 添加 webflux 依赖 5.2 定义接口 5.3 测试接口 六.总结 七.GitHub 示例代码 一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们去理解 WebFlux,图右边对 Spring MV

Redis详解入门篇

[本教程目录] 1.redis是什么 2.redis的作者 3.谁在使用redis 4.学会安装redis 5.学会启动redis 6.使用redis客户端 7.redis数据结构 – 简介 8.redis数据结构 – strings 9.redis数据结构 – lists 10.redis数据结构 – 集合 11.redis数据结构 – 有序集合 12.redis数据结构 – 哈希 13.聊聊redis持久化 – 两种方式 14.聊聊redis持久化 – RDB 15.聊聊redis持久化 –

Visual Studio Code 教程之————入门篇

Visual Studio代码是一个轻量级但功能强大的源代码编辑器,可在您的桌面上运行,适用于Windows,macOS和Linux.它内置对JavaScript,TypeScript和Node.js的支持,并且具有丰富的其他语言(如C ++,C#,Python,PHP,Go)和运行时(例如.NET和Unity)扩展的生态系统.

Systemd 入门教程:实战篇

Systemd 入门教程:实战篇 上一篇文章,介绍了 Systemd 的主要命令,这篇文章主要介绍如何使用 Systemd 来管理我们的服务,以及各项的含义: 一.开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件,如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例). $ sudo systemctl enable httpd 上面的命令相当于在/etc/systemd/system目

DataVeryLite入门教程(二) Entity篇

DataVeryLite 是基于.net 4.0的数据库持久化ORM框架. 目前支持的数据库有Sqlserver,Mysql,Oracle,Db2,PostgreSql,Sqlite和Access. 最好先阅读DataVeryLite入门教程(一) 配置篇,然后再阅读本篇.如果你觉得麻烦也可以跳过. Entity是ORM中的核心对象之一,一个继承Entity的对象对应于数据库中的一个表. Entity提供丰富的API对表中的单条数据进行操作. 比如根据id或其他条件,加载,删除,插入,更新和部分

DataVeryLite入门教程(一) 配置篇

DataVeryLite 是基于.net 4.0的数据库持久化ORM框架. 目前支持的数据库有Sqlserver,Mysql,Oracle,Db2,PostgreSql,Sqlite和Access. DataVeryLite 的配置系统非常简单,稍微有点c#基础的程序猿,半小时都能上手; 不仅学习简单,编码量也非常少;熟练之后基本可以复制粘贴来完成配置. 1.连接字符串配置 a,App.config/Web.config配置方式 在<connectionStrings>节点中添加配置,示列如下

Linux 命令详解(八)Systemd 入门教程:实战篇

Systemd 入门教程:实战篇 http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

WebGL入门教程第1篇——六色立方

WebGL入门教程第1篇——六色立方 WebGL,一项允许开发人员在浏览器里操纵GPU来显示图形的技术.让我们一起走进WebGL的世界. 读者对象 本系列适合具有基础JavaScript知识的开发人员. 准备工作 我们应该在本地搭建好web服务器,或者安装了具有预览功能的IDE.如果你安装了Visual Studio,Nivk童鞋为我们开发了WebGL代码提示功能,你可以通过以下步骤使Visual Studio支持WebGL代码提示:打开Visual Studio——点击工具——点击选项——展开