使用Redis官方推荐的 Jedis,在 java应用中操作 Redis。 Jedis几乎涵盖了 Redis的所有命令。操作 Redis的命令在 Jedis中以方法的形式出现。 jedis完全兼容 redis 2.8.x and 3.x.x
- Jedis源码: https://github.com/xetorthio/jedis
- api文档: http://xetorthio.github.io/jedis/
- 下载: http://search.maven.org/,搜索 jedis
1. 添加Jedis和Commons-Pool的maven依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
public class RedisString {
public static void main(String[] args){
// 创建Jedis对象,连接redis服务器
String host = "212.64.71.127";
int port = 6379;
Jedis jedis = new Jedis(host, port);
// 身份认证
jedis.auth("123123");
// 操作redis数据库
jedis.set("course", "java");
String val = jedis.get("course");
// 一次性设置多个值
jedis.mset("break", "油条", "lunch", "盖饭");
// 一次性获取多个key对应的值
List<String> vals = jedis.mget("course", "break", "lunch");
for (String va: vals) {
System.out.println(va);
}
}
}
3. 由于Jedis是通过网络访问Redis数据库,并且Jedis的链接类似于JDBC的链接,也是很耗费资源的,如果我们每次操作数据库都重新创建Jedis对象显然是不明智的。所以我们参考JDBC的连接池技术,为Jedis也实现了连接池技术,在Jedis连接池中预先创建多个Jedis对象,每次使用Jedis对象的时候直接从链接池中获取,使用完毕后再放入连接池即可。
3.1 使用Jedis连接池技术,从连接池中获取到Jedis对象操作Hash类型的数据
public class RedisPoolUtil {
private static JedisPool pool;
public static JedisPool open(String host, int port){
if(pool == null){
// 创建JedisPool配置对象,配置Jedis池的配置项
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 设置Jedis池中最大的Jedis实例数(pool中存放的是Jedis对象实例,默认为8个)
poolConfig.setMaxTotal(20);
// 最大空闲redis实例数,设置这个可以保留足够的Jedis实例,可以保证快速获取到Jedis实例
poolConfig.setMaxIdle(3);
// 提前检查Jedis对象,为true的Jedis一定是可用的
poolConfig.setTestOnBorrow(true);
// 创建Jedis池对象
pool = new JedisPool(poolConfig, host, port, 3000, "123123");
}
return pool;
}
public static void close(){
if(pool != null){
pool.close();
}
}
}
public class RedisHashPool {
public static void main(String[] args){
String host = "212.64.71.127";
int port = 6379;
// 获取JedisPool
JedisPool pool = RedisPoolUtil.open(host, port);
// 从Jedis Pool中获取Jedis实例
Jedis jedis = pool.getResource();
try{
jedis.hset("student", "name", "张三");
String name = jedis.hget("student", "name");
System.out.println(name);
Map<String, String> map = new HashMap<String, String>();
map.put("age", "20");
map.put("address", "beijing");
jedis.hmset("student", map);
Map<String, String> stuMap = jedis.hgetAll("student");
for (String key:
stuMap.keySet()) {
System.out.println("key: "+ key + " val: " + stuMap.get(key));
}
}finally{
// 将Jedis实例对象放回到Jedis Pool中
if(jedis != null){
jedis.close();
}
}
}
}
public class RedisTransaction {
public static void main(String[] args) {
String host = "212.64.71.127";
int port = 6379;
JedisPool pool = RedisPoolUtil.open(host, port);
Jedis jedis = pool.getResource();
try{
// 开启事务
Transaction trans = jedis.multi();
// 添加redis命令,通过事务对象
trans.lpush("course", "html", "java", "css");
trans.lrange("course", 0, -1);
// 提交事务,返回事务的执行结果
final List<Object> res = trans.exec();
for (Object obj:
res) {
System.out.println(obj);
}
}finally {
if(jedis != null){
jedis.close();
}
}
}
}