先来搞清楚两个问题:redis到底是一个什么要的缓存技术?数据库连接池又到底是怎么一回事?
看看网上对redis的介绍:
Redis 是一个key-value
存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(
链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些
数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了
memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
[1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
数据库连接池:
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些
数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大
数据库连接数量限定了这个连接池能占有的
最大连接数,当
应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
在项目逐步展开过程中(项目初步并不能确定要有哪些具体的技术实现),需要用到的数据缓存技术redis,从前台获取客户端数据,传到后台,再把数据写入redis缓存,之前有想过用memcached,但是拿memcached与redis一比较,发现redis优势更多,所以果断选择使用redis。
今天就来谈谈自己是怎么样实现java redis接口的:
第一步,导包
一个是jedis-2.4.2.jar包,当然版本不断更新中,另一个是common-pool.jar,这些网上都有下载,不在赘述。
第二步,配置pom.xml文件,只有用到maven管理的项目的时候需要配置
第三步,写数据连接池,以后得提醒自己,凡是涉及到数据连接的地方,为确保数据稳定,安全,可靠,一定要写数据连接池的习惯。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolTest {
private static JedisPool jedisPool;
private static JedisPoolConfig initPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 控制一个pool最多有多少个状态为idle的jedis实例
jedisPoolConfig.setMaxActive(1000);
// 最大能够保持空闲状态的对象数
jedisPoolConfig.setMaxIdle(300);
// 超时时间
jedisPoolConfig.setMaxWait(1000);
// 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;
jedisPoolConfig.setTestOnBorrow(true);
// 在还会给pool时,是否提前进行validate操作
jedisPoolConfig.setTestOnReturn(true);
return jedisPoolConfig;
}
public static void before() {
JedisPoolConfig jedisPoolConfig = initPoolConfig();
// 属性文件读取参数信息
ResourceBundle bundle = ResourceBundle.getBundle("redis_config");
String host = bundle.getString("redis.host");
int port = Integer.valueOf(bundle.getString("redis.port"));
int timeout = Integer.valueOf(bundle.getString("redis.timeout"));
String password = bundle.getString("redis.password");
// 构造连接池
jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
}
}
第四步:测试
public void testSet() {
Jedis jedis = null;
// 从池中获取一个jedis实例
try {
jedis = jedisPool.getResource();
jedis.set("blog_pool", "java2000_wl");
} catch (Exception e) {
// 销毁对象
jedisPool.returnBrokenResource(jedis);
Assert.fail(e.getMessage());
} finally {
// 还会到连接池
jedisPool.returnResource(jedis);
}
}
public void testGet() {
Jedis jedis = null;
try {
// 从池中获取一个jedis实例
jedis = jedisPool.getResource();
System.out.println(jedis.get("blog_pool"));
} catch (Exception e) {
// 销毁对象
jedisPool.returnBrokenResource(jedis);
Assert.fail(e.getMessage());
} finally {
// 还会到连接池
jedisPool.returnResource(jedis);
}
}
}
PS:
1,如果有在给JedisPoolConfig对象配置参数时,eclipse提示configure build path..,那么很可能是你没有配置pom.xml文件;
2,其实以上代码网上确实不少,但希望大家能读懂代码之后自己再写,不要一味的复制,粘贴;
3,我在csdn论坛上,有两个非常好的介绍redis和maven的文档,大家有心的可以下载下来看看。