Redis Java客户端有很多的开源产品比如Redission、Jedis、lettuce
Jedis
是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排
序、事务、管道、分区等Redis特性。Redisson主要是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
lettuce是基于Netty构建的一个可伸缩的线程安全的Redis客户端,支持同步、异步、响应式模式。多个线程可以共享一个连接实例,而不必担心多线程并发问题;
着重看Jedis的使用
对于初学者,可以参考github中的jedis的源码包下的测试案例,案例提供了很多的使用方式,可以参考一下
也可以参考
参考资料: https://github.com/xetorthio/jedis/tree/master/src/test/java/redis/clients/jedis/tests
也可以参考wiki的getingstart部分:https://github.com/xetorthio/jedis/wiki/Getting-started
下面的所有的例子可以参考:
一、jedis的简单使用
- 环境准备
reids环境搭建: 首先需要自己搭建redis的单机环境和开启哨兵模式以及redis集群模式,可以参考的redis博客系列redis的目录简介
maven依赖:
redis.clients
jedis
3.0.0
-
jedis
的api单机使用
/**
* @Project: redis
* @description: jedis的api单机使用
* @author: sunkang
* @create: 2019-01-12 14:24
* @ModificationHistory who when What
**/
public class JedisDemo {
public static void main(String[] args) {
//三种方式连接
//1.通过直接的host连接
String host = "192.168.44.129";
//超时时间为15000ms
Jedis jedis = new Jedis(host,6379,15000);
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
//2.通过HostAndPort 连接
HostAndPort hostAndPort = new HostAndPort(host,6379);
Jedis jedis1 = new Jedis(hostAndPort);
//对字符串的简单操作
jedis1.set("bar","foo");
String bar = jedis.get("bar");
System.out.println(bar);
//关闭
jedis1.close();
//3.通过url连接
Jedis jedis2 = new Jedis("redis://"+host+":6379");
System.out.println( jedis2.get("bar"));
jedis2.close();
//对list的简单操作
jedis.lpush("list","value1","value2","value3");
List list = jedis.lrange("list",0,-1);
System.out.println(list);
//对map的简单操作
Map map = new HashMap();
map.put("key1","value1");
map.put("key2","value2");
jedis.hmset("map",map);
Map getMap = jedis.hgetAll("map");
System.out.println(getMap);
//对set的结合的简单操作
jedis.sadd("sets","set1","set2","set3");
Set sets= jedis.smembers("sets");
System.out.println(sets);
//对有序集合的检查操作
jedis.zadd("zsets",1,"number1");
jedis.zadd("zsets",2,"number2");
Set zsets = jedis.zrangeWithScores("zsets",0,-1);
for(Tuple tuple : zsets){
System.out.println(" scope: "+tuple.getScore()+ ",element:"+tuple.getElement());
}
jedis.close();
}
}
-
JedisPool
的连接池api简单使用
/**
* @Project: redis
* @description: JedisPool的连接池api简单使用
* @author: sunkang
* @create: 2019-01-12 16:20
* @ModificationHistory who when What
**/
public class JedisPoolUtils {
private static String host = "192.168.44.129";
private static JedisPool jedisPool = null;
public static Jedis getRedis(){
JedisPoolConfig poolConfig = new JedisPoolConfig();
//设置jedis连接池中最大的连接个数
poolConfig.setMaxTotal(60);
//设置jedis连接池中最大的空闲连接个数
poolConfig.setMaxIdle(30);
//设置jedis连接池中最小的空闲连接个数
poolConfig.setMinIdle(5);
//jedis连接池最大的等待连接时间 ms值
poolConfig.setMaxWaitMillis(30000);
jedisPool = new JedisPool(poolConfig,host,6379,2000);
Jedis jedis = jedisPool.getResource();
return jedis;
}
public void closePool(){
if(jedisPool !=null){
jedisPool.close();
}
}
}
-
Pipeline
的api简单使用
/**
* @Project: redis
* @description: Pipeline的api简单使用
* @author: sunkang
* @create: 2019-01-12 18:28
* @ModificationHistory who when What
**/
public class PipelineDemo {
public static void main(String[] args) {
Jedis jedis = JedisPoolUtils.getRedis();
Pipeline pipeline = jedis.pipelined();
//1.没有事务的同步
pipeline.set("aa","1");
pipeline.set("bb","2");
pipeline.set("cc","3");
pipeline.set("dd","4");
pipeline.sync();
//2.开启事务的pipeline
try{
pipeline.multi();
pipeline.set("ee","ee");
pipeline.set("ff","ff");
//提交
pipeline.exec();
}catch (Exception e){
//回滚
pipeline.discard();
}
jedis.close();
}
}
-
JedisSentinelPool
哨兵模式下的api使用
/**
* @Project: redis
* @description:JedisSentinelPool 哨兵模式下的api使用
* 配置的是哨兵的地址集群地址
* 需要开启哨兵
* @author: sunkang
* @create: 2019-01-12 14:43
* @ModificationHistory who when What
**/
public class JedisSentinePoolDemo {
public static void main(String[] args) {
//配置的是哨兵的ip地址
String host = "192.168.44.129:26379";
String sentinelMasterName = "mymaster";
Set hostSet= new HashSet();
hostSet.add(host);
//哨兵集群下的连接 ,通过连接哨兵集群从而获取得到jedisd 连接
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
JedisSentinelPool sentinelPool = new JedisSentinelPool(sentinelMasterName,hostSet,config,20000);
Jedis jedis = sentinelPool.getResource();
jedis.set("sentinel","sentinel");
String value = jedis.get("sentinel");
System.out.println(value);
}
}
- redis集群模式下
JedisCluster
的api使用
/**
* @Project: redis
* @description: redis集群模式下JedisCluster的api使用
* 需要配置好redis的集群
*连接的地址redis集群的地址
* @author: sunkang
* @create: 2019-01-12 14:52
* @ModificationHistory who when What
**/
public class JedisClusterDemo {
public static void main(String[] args) {
String clusterhos ="192.168.44.129";
Set hostAndPorts = new HashSet();
hostAndPorts.add(new HostAndPort(clusterhos,30001));
hostAndPorts.add(new HostAndPort(clusterhos,30002));
hostAndPorts.add(new HostAndPort(clusterhos,30003));
hostAndPorts.add(new HostAndPort(clusterhos,30004));
hostAndPorts.add(new HostAndPort(clusterhos,30005));
hostAndPorts.add(new HostAndPort(clusterhos,30006));
//在构建JedisCluster实例,其实会发送cluster slots指令来获取slot与节点的映射关系
JedisCluster cluster = new JedisCluster(hostAndPorts);
//设置一个值会利用crc16算法计算出slot的值,然后根据slot的值获取到与哪台节点的连接
cluster.set("cluster","cluster");
String value = cluster.get("cluster");
System.out.println(value);
cluster.close();
}
}