【连载帖】Win7下的Redis应用开发

[复制链接]
查看11 | 回复9 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
Win7下的Redis应用开发
一、Redis简介
Redis是一个开源的、使用ANSI C语言编写的、键值存储的内存NoSQL数据库。Redis支持网络,可基于内存存储,亦可以日志类型进行持久化数据,并提供多种语言的API。
Redis的优点:
1)性能极高
Redis能支持超过 100K+ 每秒的读写频率。
2)丰富的数据类型
Redis支持二进制案例的 String、List、Hash、Set以及Ordered Set数据类型操作。
3)原子
Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
4)丰富的特性
Redis还支持发布/订阅、通知、键过期等特性。
Redis官方不支持Windows版,但是微软开放技术组提供了Redis的Windows移植版。此版本可以用于Redis项目的开发和测试,但不适合生产部署。
目前Redis最新的Windows版为2.6.14版。


回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
二、Redis安装
下载的windows版本是redis-2.6.12,解压到D盘:
D:\database\redis
进到该目录下,有下列文件:


redis1.png (21.57 KB, 下载次数: 22)
下载附件
2013-12-3 16:45 上传

可执行程序介绍如下:
redis-server.exe:Redis数据库服务程序
redis-cli.exe:Redis数据库客户端程序
redis-check-dump.exe:本地数据库检查程序
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:Redis数据库性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询,类似于Apache的ab工具。


回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
启动Redis服务(conf文件指定配置文件,若不指定则默认):
D:\database\redis >redis-server.exe



redis2.png (9.46 KB, 下载次数: 13)
下载附件
2013-12-3 16:46 上传

此CMD启动窗口要一直开着,若关闭了则Redis服务也会关闭。

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
新开一个CMD窗口,设置客户端:
D:\database\redis >redis-cli.exe -h localhost -p 6379
然后可以开始玩了:



redis3.png (30.16 KB, 下载次数: 6)
下载附件
2013-12-3 16:47 上传

输入quit可以退出客户端连接。

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
三、Redis客户端
Redis提供了多种语言的客户端,包括Java,C++,python。
以Java客户端为例。
Redis官网上推荐的Java驱动包是Jedis。要下载Jedis,并不容易,最新的版本只能从Maven仓库中获取,地址见:http://mirrors.ibiblio.org/maven2/redis/clients/jedis/2.2.1/
当前Jedis的最新版本为2.2.1版,是2013年9月21日更新的。
注意:Jedis目前完全兼容Redis 2.6.14版。
下载Jedis后,加入到项目类路径下。
另外,Jedis依赖于Apache的commons-pools包。

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
Jedis的特性:
1)排序
2)连接处理
3)对任意类型的值进行命令操作(包括String、Hash、List、Set、Sorted Set)
4)事务处理
5)管道
6)发布/订阅
7)持久化控制命令
8)远程服务器控制命令
9)连接池
10)分片(MD5、MurmurHash)
11)以键为标记的分片
12)带管道的分片
13)带管道的脚本
注:MurmurHash是一种很流行的Hash算法,是一种非加密型哈希函数,适用于一般的哈希检索操作。MurmurHash由Austin Appleby于2008年发明,目前已出现了多个变种,与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
用Jedis来操作Redis的简单例子:package test;
import redis.clients.jedis.Jedis;
public class Client {
public static void main(String[] args) {
Jedis jj = new Jedis("localhost");
jj.set("key1", "I am value 1");
String ss = jj.get("key1");
System.out.println(ss);
}
}
复制代码
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
四、Jedis连接池的使用
所需JAR包为jedis-2.2.1.jar和commons-pool-1.5.6.jar
带连接池的Jedis操作步骤如下:
1)从JedisPool中获取Jedis实例;
2)操作Jedis实例;
3)Jedis实例用完后返还给JedisPool;
4)如果Jedis在使用过程中出错,也需还给JedisPool。
代码如下:package com.ljq.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisAPI {
private static JedisPool pool = null;

/**
* 构建redis连接池
*
* @param ip
* @param port
* @return JedisPool
*/
public static JedisPool getPool() {
if (pool == null) {

JedisPoolConfig config = new JedisPoolConfig();

//控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;

//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。

config.setMaxActive(500);

//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。

config.setMaxIdle(5);

//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;

config.setMaxWait(1000 * 100);

//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

config.setTestOnBorrow(true);

pool = new JedisPool(config, "192.168.2.191", 8888);
}
return pool;
}

/**
* 返还到连接池
*
* @param pool
* @param redis
*/
public static void returnResource(JedisPool pool, Jedis redis) {
if (redis != null) {

pool.returnResource(redis);
}
}

/**
* 获取数据
*
* @param key
* @return
*/
public static String get(String key){
String value = null;

JedisPool pool = null;
Jedis jedis = null;
try {

pool = getPool();

jedis = pool.getResource();

value = jedis.get(key);
} catch (Exception e) {

//释放redis对象

pool.returnBrokenResource(jedis);

e.printStackTrace();
} finally {

//返还到连接池

returnResource(pool, jedis);
}

return value;
}
}
复制代码
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
代码说明:
a、获取jedis实例时,实际上可能有两类错误。
一类是pool.getReource(),得不到可用的jedis实例;
另一类是jedis.set/get时出错也会抛出异常;
为了实现区分,所以根据instance是否为null来实现,如果为空就证明instance根本就没初始化,也就不用return给pool;如果instance不为null,则证明是需要返还给pool的;
b、在instance出错时,必须调用returnBrokenResource返还给pool,否则下次通过getResource得到的instance的缓冲区可能还存在数据,出现问题!
JedisPool的配置参数很大程度上依赖于实际应用需求、软硬件能力。以前没用过commons-pool,所以这次花了一整天专门看这些参数的含义。。。JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
WHEN_EXHAUSTED_FAIL --> 表示无jedis实例时,直接抛出NoSuchElementException;
WHEN_EXHAUSTED_BLOCK --> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
WHEN_EXHAUSTED_GROW --> 则表示新建一个jedis实例,也就说设置的maxActive无用;
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
testOnBorrow:在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
testOnReturn:在return给pool时,是否提前进行validate操作;
testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;
numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;
minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;
lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;

回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
Redis是一款开源、高性能的键值存储(key-value store)数据库。它的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)等数据类型。对于这些数据类型,可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。
经常有人拿Memcached和Redis做比较,下面我们简单地看下他们之间有哪些差别:
1. 网络IO模型
Memcached是一个多线程、非阻塞IO复用的网络模型。多线程模型可以发回多核作用,但有时也会带来性能损耗。
Redis使用单线程的IO复用模型,它封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大。但是有一些操作,如排序、聚合等,单线程模型实际会严重影响整体的吞吐量。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836