Redis_java中使用Jedis
一、Redis在java中使用——Jedis常用操作
1、依赖
<!--使用Redis-->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2、测试连通性
public class RedisTest {
@Test
public void redisTest(){
//连接本地Redis服务
Jedis jedis = new Jedis("localhost",6379);
//查看服务是否运行,打出pong表示OK
System.out.println(jedis.ping());
}
}
出现pong表示连通成功。
3、五大数据类型
@Test
public void redisTest2(){
//连接本地服务
Jedis jedis = new Jedis("localhost",6379);
//获取所有key
Set<String > keys = jedis.keys("*");
for (Iterator iterator = keys.iterator();iterator.hasNext();) {
String key = (String) iterator.next();
System.out.println(key);
}
System.out.println(keys.contains("k2")+" "+jedis.ttl("k2")+" "+jedis.get("k2"));
//String
jedis.set("m1","v1");
System.out.println(jedis.get("m1"));
jedis.mset("str1","v1","str2","v2","str3","v3");
System.out.println(jedis.mget("str1","str2","str3"));
//List
jedis.lpush("myList","v1","v2","v3","v4","v5");
List<String> list = jedis.lrange("myList",0,-1);
for (String element:list) {
System.out.println(element);
}
//Set
jedis.sadd("orders","jd001");
jedis.sadd("orders","jd002");
jedis.sadd("orders","jd003");
Set<String> set = jedis.smembers("orders");
for (Iterator iterator = set.iterator();iterator.hasNext();){
String string = (String) iterator.next();
System.out.println(string);
}
//Hash
jedis.hset("hash","username","lisi");
System.out.println(jedis.hget("hash","username"));
Map<String,String> map = new HashMap<String,String>();
map.put("telphone","13811814763");
map.put("address","atguigu");
map.put("email","abc@163.com");
jedis.hmset("hash2",map);
List<String> result = jedis.hmget("hash2","telephone","email");
for (String str : result) {
System.out.println(str);
}
//Zset
jedis.zadd("zset1",10,"v1");
jedis.zadd("zset1",20,"v2");
jedis.zadd("zset1",30,"v3");
Set<String> s1 = jedis.zrange("zset1",0,-1);
for (Iterator iterator = s1.iterator();iterator.hasNext();){
String str = (String) iterator.next();
System.out.println(str);
}
}
4、事务提交
加锁:
/**
* 通俗点讲,watch命令就是标记一个键,如果标记了一个键,在提交事务前如果该键被别人修改过,
* 那事务就会失败,这种情况可以在程序中重新再尝试一次
*
* 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减;足够的话就启动事务进行更新操作
*
* 如果在此期间键balance被其他人修改,那在提交事务(执行exec)时就会报错,
* 程序通常可以捕获这类错误再重新执行一次,直到成功
*
*/
@Test
public void ClassTest(){
Jedis jedis = new Jedis("127.0.0.1",6379);
int balance;//可用余额
int debt;//欠额
int amtToSubtract = 10;//实刷额度
jedis.watch("balance");
jedis.set("balance", "5");//模拟其他程序修改了该条目
balance = Integer.parseInt(jedis.get("balance"));
if (balance<amtToSubtract){
jedis.unwatch();
System.out.println("modify");
//return false;
}else {
System.out.println("*************transaction");
Transaction transaction = jedis.multi();
transaction.decrBy("balance", amtToSubtract);
transaction.incrBy("debt",amtToSubtract );
transaction.exec();
balance = Integer.parseInt(jedis.get("balance"));
debt = Integer.parseInt(jedis.get("debt"));
System.out.println("*********"+balance);
System.out.println("*********"+debt);
//return true;
}
}
}
5、主从复制
其中,6379,6380启动,先各自独立,主写,从读
public void CopyTest(){
Jedis jedis_M = new Jedis("127.0.0.1",6379);
Jedis jedis_S = new Jedis("127.0.0.1",6380);
jedis_S.slaveof("127.0.0.1",6379 );
jedis_M.set("k6", "v6");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(jedis_S.get("k6"));
}
二、JedisPool
获取Jedis实例需要从JedisPool中获取,用完Jedis实例需要返回给JedisPool。如果Jedis在使用过程中出错,则也需要还给JedisPool。
实例
连接池工具类
//单例模式
public class JedisPoolUtil {
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil(){ }
public static JedisPool getJedisPoolInstance(){
if (jedisPool == null){
synchronized (JedisPoolUtil.class){
if (null == jedisPool){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(1000);
jedisPoolConfig.setMaxIdle(32);
jedisPoolConfig.setMaxWaitMillis(100*1000);
jedisPoolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
}
}
}
return jedisPool;
}
public static void release(JedisPool jedisPool , Jedis jedis){
//释放
if (null == jedis){
jedisPool.returnResource(jedis);
}
}
}
@Test
public void redisTest4(){
JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.set("aa", "bb");
System.out.println( jedis.get("aa"));
} catch (Exception e) {
e.printStackTrace();
} finally {
JedisPoolUtil.release(jedisPool,jedis );
}
}
关于连接池的配置说明:
JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种。
WHEN_EXHAUSTED_FAIL —> 表示无jedis实例时,直接抛出NoSuchElementException;
WHEN_EXHAUSTED_BLOCK —> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException;
WHEN_EXHAUSTED_GROW —> 则表示新建一个jedis实例,也就说设置的maxActive无用;
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException;
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的;testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping());
testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;
numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;
minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义;
lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列;
==================================================================================================================
其中JedisPoolConfig对一些参数的默认设置如下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
还没有评论,来说两句吧...