1.单机版测试,未使用连接池
@Test
public void singleTest() throws Exception {
Jedis jedis=new Jedis("192.168.28.130",6379);
//简单的String set
jedis.set("name", "jack");
//如果你在redis.conf 中配置了requirepass xxxx验证授权,则需要填写授权密码
jedis.auth("123456");
String result = jedis.get("name");
//list set,应为list是有序的所以需要设置元素在list集合的索引
//jedis.lset(key, index, value)
//hash set 由于是存储在映射表,所以我们需要指定field域
//jedis.hset(key, field, value)
System.out.println(result);
jedis.close();
}
2.单机版,使用连接池
@Test
public void dataSourceTest() throws Exception {
//创建jedis连接池
JedisPool jedisPool=new JedisPool("192.168.28.130",6379);
//从连接池中拿到jedis对象
Jedis jedis=jedisPool.getResource();
jedis.auth("123456");
jedis.set("pass", "123456");
String result = jedis.get("pass");
System.out.println(result);
//关闭jedis连接对象
jedis.close();
//当系统关闭时需要关闭jedis连接池
jedisPool.close();
}
3.集群版
@Test
public void clusterTest() throws Exception {
//定义集群中所有的节点
Set<HostAndPort> nodes=new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.28.129",7001));
nodes.add(new HostAndPort("192.168.28.129",7002));
nodes.add(new HostAndPort("192.168.28.129",7003));
nodes.add(new HostAndPort("192.168.28.129",7004));
nodes.add(new HostAndPort("192.168.28.129",7005));
nodes.add(new HostAndPort("192.168.28.129",7006));
//创建jedisCluster对象
//注意JedisCluster在项目中是单例存在的
JedisCluster cluster=new JedisCluster(nodes);
cluster.set("name", "jack");
String result = cluster.get("name");
System.out.println(result);
//在系统关闭时需要关闭jedis集群
//cluster.close();
}
注意:java.lang.NumberFormatException: For input string: "7001@17001"
解决:由于redis集群的采用的版本是2.7的,在maven的pom.xml中将jedis的版本改成2.9(包含)以上的版本就可以了
Jedis与Spring的整合
单机版:
定义JedisClient接口
public interface JedisClient {
public String set(String key, String value);
public String get(String key);
/**
* Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储
* 232 - 1 键值对(40多亿)
*
* @param key
* @param item
* @param value
* @return
*/
public Long hset(String key, String filed, String value);
public String hget(String key, String field);
/**
* Redis Incr 命令将 key 中储存的数字值增一。 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
* 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。 本操作的值限制在 64 位(bit)有符号数字表示之内
*
* @param key
* @return
*/
public Long incr(String key);
public Long decr(String key);
/**
* Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素
* (4294967295, 每个列表超过40亿个元素)。
*
* @param key
* @param values
* @return
*/
public Long lpush(String key, String... values);
public List<String> lrange(String key, long begin, long end);
public Long rpush(String key, String... values);
/**
* Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 Redis
* 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295,
* 每个集合可存储40多亿个成员)
*
* @param key
* @param members
* @return
*/
public Long sadd(String key, String... members);
// return all the smenmbers
public Set<String> smembers(String key);
/**
* Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
* 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
* 有序集合的成员是唯一的,但分数(score)却可以重复。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232
* - 1 (4294967295, 每个集合可存储40多亿个成员)。
*
* @param key
* @param score
* @param member
* @return
*/
public Long zadd(String key, double score, String member);
public Set<String> zrange(String key, Long begin, Long end);
// 为缓存数据设置过期时间
public Long expire(String key,int second);
// 返回过期剩余时间
public Long ttl(String key);
}
定义单机版jedis实现类
public class JedisClientSingle implements JedisClient {
@Value("${redis_single_auth}")
private String redis_single_auth;
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
jedis.auth(redis_single_auth);
String result = jedis.set(key, value);
// 关闭连接
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
jedis.auth(redis_single_auth);
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
jedis.auth(redis_single_auth);
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
jedis.auth(redis_single_auth);
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
jedis.auth(redis_single_auth);
Long result = jedis.incr(key);
jedis.close();
return result;
}
......
}
在Spring中进行相关配置
<!--单机版jedis连接池配置 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="${redis_single_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_single_port}"></constructor-arg>
</bean>
<!--单机jedis实现类 -->
<bean id="jedisClientSingle" class="com.ncs.rest.component.impl.JedisClientSingle" />
集群版:
定义jedis实现类
public class JedisClientCluster implements JedisClient {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Long hset(String key, String field, String value) {
return jedisCluster.hset(key, field, value);
}
@Override
public String hget(String key, String item) {
return jedisCluster.hget(key, item);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long lpush(String key, String... values) {
return jedisCluster.lpush(key, values);
}
......
}
在spring中进行相关配置
<!--集群jedisCluster配置 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis_cluster_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_cluster_port1}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis_cluster_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_cluster_port2}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis_cluster_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_cluster_port3}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis_cluster_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_cluster_port4}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis_cluster_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_cluster_port5}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redis_cluster_server}"></constructor-arg>
<constructor-arg name="port" value="${redis_cluster_port6}"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<!--集群jedis实现类 -->
<bean id="jedisClientCluster"
class="com.ncs.rest.component.impl.JedisClientCluster" />