使用redis也有一段时间了,今天就总结写些基础基本的东西吧。
redis是干什么的,相信很多人都知道了,百度google一下就很多,说白了就是一个noSQL的内存数据库。相信很多人像我一样是使用windows平台开发的,所以开发时需要用虚拟机或者在实体机器上安装一个linux类的系统,或者找一个windows版。
这个据说是ms移植:https://github.com/MSOpenTech/redis,不过了就要自己编译,有兴趣的可以研究一下源码。
这里有已经编译好的可以下载:https://github.com/dmajkic/redis/downloads,就是版本不是很新而已。
同时还需要下载java的客户端https://github.com/xetorthio/jedis,虽然还有其它可用的,不过这个是官方推荐加上是使用最多的。jedis就要自己编译了(可以找一下别人编译好的也可以啦),其实也很简单。下载源码,新建java项目,把src\main\java下面复制到src里面,使用ide的export导出jar,有报错也可以导出,只要在使用前加上下面这个就行了。
commons-pool:http://commons.apache.org/proper/commons-pool/download_pool.cgi,这个jedis在使用连接池用到的,根据jdk下载吧。
使用maven之类就百度google一下。
解压下载的redis,运行redis-server.exe,在ide(自己使用myeclipse)新建项目之类的跳过啦。
最简单的使用:
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("a", "redis");
String value = jedis.get("a");
System.out.println(value);
jedis.close();
当想全局使用一个redis连接的话,这样还不行,需要在使用前先判断连接是否可用:
if (jedis.ping().equals("PONG")) {
}
只是一般很少这样做就像连接数据库一样,不会整个项目都使用一个Connection。
在实际使用中,一般会采用连接池的方式:
private JedisPool jedisPool;
public void initPool() {
JedisPoolConfig config = new JedisPoolConfig();
//配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(20);
//配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。
config.setMinIdle(1);
//获取jedis实例是最多等待的时间
config.setMaxWaitMillis(1000);
//jedis最多连接数
config.setMaxTotal(100);
//在去连接时是否判断可用有效
config.setTestOnBorrow(true);
//归还连接池是是否测试可用
//config.setTestOnReturn(true);
jedisPool = new JedisPool(config, "localhost", 6379);
}
public void testKey() {
//获取jedis实例
Jedis jedis = jedisPool.getResource();
// 清空数据
System.out.println(jedis.flushDB());
// 判断key"a"是否存在
System.out.println(jedis.exists("a"));
jedis.set("a", "values");
System.out.println(jedis.exists("a"));
jedisPool.returnResource(jedis);
}
JedisPoolConfig的其它参数可根据实际情况配置,建议使用配置文件。
很多人到这一步就完成了。其实这里还是有些缺陷吧。上面的写法不适合用在真实使用的环境。因为当我们new一个对象,再调用initPool时,已经产生了一个连接池,如果别人也new一个又产生了一个连接池,这样就失去使用连接池的意义了。解决方向就是整个应用只使用一个连接池:单例或者static。
下面是使用static的:
public class Test2 {
private static JedisPool jedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
// 配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(20);
// 配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。
config.setMinIdle(1);
// 获取jedis实例是最多等待的时间
config.setMaxWaitMillis(1000);
// jedis最多连接数
config.setMaxTotal(100);
// 在去连接时是否判断可用有效
config.setTestOnBorrow(true);
// 归还连接池是是否测试可用
// config.setTestOnReturn(true);
jedisPool = new JedisPool(config, "localhost", 6379);
}
public void testKey() {
// 获取jedis实例
Jedis jedis = jedisPool.getResource();
// 清空数据
System.out.println(jedis.flushDB());
// 判断key"a"是否存在
System.out.println(jedis.exists("a"));
jedis.set("a", "values");
System.out.println(jedis.exists("a"));
jedisPool.returnResource(jedis);
}
}
单例的就不写了,想过几天写篇单例的用这个作为例子。
还有一种使用的也很多的就是ShardedJedisPool,分布式时使用,其实和上面也差不多:
public class Test3 {
private static ShardedJedisPool shardedJedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
//配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(20);
//配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。
config.setMinIdle(1);
//获取jedis实例是最多等待的时间
config.setMaxWaitMillis(1000);
//jedis最多连接数
config.setMaxTotal(100);
//在去连接时是否判断可用有效
config.setTestOnBorrow(true);
//归还连接池是是否测试可用
//config.setTestOnReturn(true);
List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
shards.add(new JedisShardInfo("localhost", 6379));
shards.add(new JedisShardInfo("localhost", 6378));
// 构造池
shardedJedisPool = new ShardedJedisPool(config, shards);
}
public void testKey() {
// 获取jedis实例
ShardedJedis jedis = shardedJedisPool.getResource();
// 判断key"a"是否存在
System.out.println(jedis.exists("a"));
jedis.set("a", "values");
System.out.println(jedis.exists("a"));
shardedJedisPool.returnResource(jedis);
}
}
细心的应该发现testKey里面 没有了jedis.flushDB()这个操作,使用ShardedJedisPool要清空数据要一个一个db清空,另外jedis有jedis.select选择数据库的,ShardedJedisPool是没有的。
另外,说一下修改redis端口。打开redis目录下的redis.conf,找到这个位置:
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1
修改6379为其它端口,不要直接双击redis-server.exe启动,在命令行启动 ,切换到redis目录,输入redis-server.exe redis.conf就行了。
PS: 当出现异常时,要销毁对象使用 returnBrokenResource, 使用完之后要归还连接returnResource。
参考:
http://budairenqin.iteye.com/blog/1734193 里面的封装方式个人挺喜欢的,有兴趣的可以参考一下。
http://redis.readthedocs.org/en/latest/ redis客户端的命令,也很有用的