参考地址: https://blog.csdn.net/qq_26525215/article/details/60466222
jedis的使用
由于使用的是Maven项目,首先要导入jedis和junit的依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
连接,关闭
@Before public void init(){ //连接redis服务器(String host,int port,int connectionTimeout,int soTimeout) jedis = new Jedis("192.168.25.129",6379); //由于我设置了密码,所以操作之前需要进行权限验证 jedis.auth("anntly"); } @After public void destory(){ jedis.close(); }
String
/** * jedis操作字符串 */ @Test public void stringTest(){ //添加字符串 jedis.set("study", "java"); //获取字符串 System.out.println("I love "+jedis.get("study")); //追加 jedis.append("study", "redis"); System.out.println("I love "+jedis.get("study")); //字符串长度 System.out.println("len:"+jedis.strlen("study")); //批量添加 jedis.mset("name","anntly","sex","male"); System.out.println(jedis.mget("name","age","sex")); //自增 jedis.incr("age"); System.out.println("age:"+jedis.get("age")); }
哈希(map)
/** * 哈希 */ @Test public void mapTest(){ //添加数据 Map<String, String> map = new HashMap<String,String>(); map.put("name", "anntly"); map.put("sex", "male"); map.put("age", "22"); jedis.hmset("user", map); jedis.hset("user", "email", "btzhang@foxmail.com"); //取出name System.out.println("name: "+jedis.hget("user", "name")); //取出所有属性 Map<String, String> user = jedis.hgetAll("user"); for (Map.Entry<String, String> entry: user.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } //使用hmget获取 List<String> uList = jedis.hmget("user", "name","sex","age"); System.out.println(uList); //返回key field个数 System.out.println("总共:"+jedis.hlen("user")); //返回所有field的值 System.out.println("属性有:"+jedis.hvals("user")); //删除field对应的value jedis.hdel("user", "sex"); System.out.println("获取sex:"+jedis.hget("user", "sex")); }
List
/** * List */ @Test public void listTest(){ //因为list可以有重复元素 jedis.del("bank"); //添加数据(类比银行排队) jedis.lpush("bank", "xiaohong"); jedis.lpush("bank", "xiaoming"); jedis.lpush("bank", "xiaowang"); //获取数据 System.out.println("正在排队中:"+jedis.lrange("bank", 0, -1)); //这个时候来了个插队的小白 jedis.rpush("bank", "xiaobai"); System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1)); //这个时候保安来了要求小白到最后去 jedis.lrem("bank", -1, "xiaobai"); jedis.lpush("bank", "xiaobai"); System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1)); //队列正常工作 jedis.rpop("bank"); System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1)); //小白很憋屈,他不排队了 jedis.lpop("bank"); System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1)); //这个时候小王想上厕所,他让妻子小爱替他排队 jedis.lset("bank", 0, "xiaoai"); System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1)); //到了晚上,银行关门了 jedis.del("bank"); System.out.println(jedis.llen("bank")+"人"+"正在排队中:"+jedis.lrange("bank", 0, -1)); }
集合(set)
/** * 集合 */ @Test public void setTest(){ //添加数据(菜单,菜品) jedis.sadd("menu", "hongshaorou","tangchupaigu","shuizhuroupian","dongpozhouzi"); //总共有多少个菜 System.out.println("餐馆共有菜品:"+jedis.scard("menu")+"个"); //要点红烧肉,判断是否有 System.out.println(jedis.sismember("menu", "hongshaorou")?"有红烧肉":"没有红烧肉"); //要点糖醋里脊,判断是否有 System.out.println(jedis.sismember("menu", "tangchuliji")?"有糖醋里脊":"没有糖醋里脊"); //随机点两个菜 System.out.println("随机点两个菜:"+jedis.srandmember("menu",2)); //查看所有菜 System.out.println(jedis.smembers("menu")); //随机弹出一个菜品 jedis.spop("menu"); //现在行开了一家餐馆 jedis.sadd("menu1", "hongshaorou","tangchuliji","shuizhuroupian","huangmenji"); //求交集 Set<String> mSet = jedis.sinter("menu","menu1"); System.out.println("相同的菜品有:"); for (String string : mSet) { System.out.print(string+" "); } System.out.println(); //求差集 Set<String> mSet1 = jedis.sdiff("menu","menu1"); System.out.println("不同的菜品有:"); for (String string : mSet1) { System.out.print(string+" "); } System.out.println(); //两家餐馆合并了 jedis.sunionstore("finalmenu", "menu","menu1"); System.out.println(jedis.smembers("finalmenu")); }
有序集合(zset)
/** * 有序集合 */ @Test public void zsetTest(){ //添加数据(成绩) Map<String, Double> student = new HashMap<>(); student.put("xiaohong", 80d); student.put("xiaoming", 100d); student.put("xiaoding", 85d); jedis.zadd("student", student); //升序获取所有学生 System.out.println("成绩由低到高排名:"+jedis.zrange("student", 0, -1)); //由高到低 System.out.println("成绩由低到高排名:"+jedis.zrevrange("student", 0, -1)); //返回对应分数 System.out.println("小红的分数为:"+jedis.zscore("student", "xiaohong")); //返回指定分数范围的学生 System.out.println("成绩80-90的:"+jedis.zrangeByScore("student", 80d, 90d)); //获取小红的排名(倒序从0开始) System.out.println("小红的排名为:"+jedis.zrank("student", "xiaohong")); } }
连接池
- 使用单例模式实现
- 连接池与直连对比
方式 | 优点 | 缺点 |
---|---|---|
直连 | 1.简单方便 2.适用于少量长期连接的场景 | 1.存在每次新建/关闭TCP开销 2.有的资源无法控制,存在连接泄露的可能 3.Jedis对象线程不安全 |
连接池 | 1.Jedis预先生成,降低开销使用 2.连接池的形式保护和控制资源的使用 | 相当于直连,使用相对麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题 |
3. 代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* redis连接池
* @author Soledad
*
*/
public final class RedisPool {
//Redis服务器IP
private static String ADDR = "192.168.25.129";
//Redis的端口号
private static Integer PORT = 6379;
//访问密码
private static String AUTH = "anntly";
//可用连接实例的最大数目,默认为8;
//如果赋值为-1,则表示不限制,如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)
private static Integer MAX_TOTAL = 1024;
//控制一个pool最多有多少个状态为idle(空闲)的jedis实例,默认值是8
private static Integer MAX_IDLE = 200;
//等待可用连接的最大时间,单位是毫秒,默认值为-1,表示永不超时。
//如果超过等待时间,则直接抛出JedisConnectionException
private static Integer MAX_WAIT_MILLIS = 10000;
private static Integer TIMEOUT = 10000;
//在borrow(用)一个jedis实例时,是否提前进行validate(验证)操作;
//如果为true,则得到的jedis实例均是可用的
private static Boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 静态块,初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
/*注意:
在高版本的jedis jar包,比如本版本2.9.0,JedisPoolConfig没有setMaxActive和setMaxWait属性了
这是因为高版本中官方废弃了此方法,用以下两个属性替换。
maxActive ==> maxTotal
maxWait==> maxWaitMillis
*/
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT_MILLIS);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis(){
try {
if(jedisPool != null){
Jedis jedis = jedisPool.getResource();
return jedis;
}else{
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void returnResource(final Jedis jedis){
//方法参数被声明为final,表示它是只读的。
if(jedis!=null){
jedisPool.returnResource(jedis);
//jedis.close()取代jedisPool.returnResource(jedis)方法将3.0版本开始
//jedis.close();
}
}
}
- 测试
public class RedisPoolTest {
public static void main(String[] args) {
RedisPool.getJedis().set("test", "success");
System.out.println(RedisPool.getJedis().get("test"));
}
}