1.创建redisPool池
public class JedisPoolUtil
private static volatile JedisPool jedisPool = null;
private JedisPoolUtil(){}
private static JedisPool getJedisPoolInstance()
{
if(null == jedisPool)
{
synchronized (JedisPoolUtil.class)
{
if(null == jedisPool)
{
JedisPoolConfig config = new JedisPoolConfig();
//配置最大jedis实例数
config.setMaxTotal(100);
//配置资源池最大闲置数
config.setMaxIdle(32);
//等待可用连接的最大时间
config.setMaxWaitMillis(10000);
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
config.setTestOnBorrow(true);
jedisPool = new JedisPool(config,"127.0.0.1",6379);
}
}
}
return jedisPool;
}
public static Jedis getJedis(){
if(jedisPool == null)
getJedisPoolInstance();
Jedis resource = jedisPool.getResource();
return resource;
}
/* 自Jedis3.0版本后jedisPool.returnResource()遭弃用,官方重写了Jedis的close方法用以代替;
官方建议应用redis.clients.jedis#Jedis的close方法进行资源回收*/
@SuppressWarnings("deprecation")
public static void release(JedisPool jedisPool,Jedis jedis)
{
if(null != jedis)
{
jedisPool.returnResourceObject(jedis);
}
}
}
2.主从备份(一般不会再代码中设置,都是在redis启动配置时已经配置好,程序只需要写数据和读数据)
public class TestMS {
public static void main(String[] args) {
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("class","1122V2");
String result = jedis_S.get("class");
System.out.println(result);
}
}
3.模拟redis事务过程
public class TestTX {
public boolean transMethod() throws InterruptedException {
Jedis jedis = new Jedis("127.0.0.1", 6379);
int balance;// 可用余额
int debt;// 欠额
int amtToSubtract = 10;// 实刷额度
jedis.watch("balance");
//jedis.set("balance","5");//此句不该出现,讲课方便。模拟其他程序已经修改了该条目
Thread.sleep(7000);
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;
}
}
/**
* 通俗点讲,watch命令就是标记一个键,如果标记了一个键,
* 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中
* 重新再尝试一次。
* 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减;
* 足够的话,就启动事务进行更新操作,
* 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错,
* 程序中通常可以捕获这类错误再重新执行一次,直到成功。
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
TestTX test = new TestTX();
boolean retValue = test.transMethod();
System.out.println("main retValue-------: " + retValue);
}
}
4.字符串api
public static void testString() {
//-----添加数据----------
Jedis jedis=new Jedis("192.168.43.100",6379);
jedis.auth("123");
jedis.flushDB();
jedis.set("name","annie");//向key-->name中放入了value-->
System.out.println(jedis.get("name")); //执行结果:xinxin
jedis.setnx("name", "bill"); //存在时不写入
System.out.println(jedis.get("name"));
jedis.append("name", " is my a girl"); //value的拼接
System.out.println(jedis.get("name"));
jedis.del("name"); //删除某个键
System.out.println(jedis.get("name"));
//设置过期时间,单位秒
jedis.setex("sql",2, "mysql");
System.out.println(jedis.get("sql"));
try {
Thread.sleep(3000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(jedis.get("sql"));
//设置多个键值对
jedis.mset("name","annie","age","22","tel","1517252**");
jedis.incr("age"); //进行加1操作
//mget返回list集合
System.out.println(jedis.mget("name","age","tel"));
}
5.列表操作API
public void testList(){
Jedis jedis=new Jedis("192.168.43.100",6379);
jedis.auth("123");
//先移除所有的内容
jedis.del("framework");
System.out.println(jedis.lrange("framework",0,-1));
//从framework头部存放三条数据
jedis.lpush("framework","spring");
jedis.lpush("framework","struts");
jedis.lpush("framework","hibernate");
//第一个是key,第二个是起始位置,第三个是结束位置,-1表示取得所有
System.out.println(jedis.lrange("framework",0,-1));
System.out.println(jedis.lrange("framework",0,2)); //包含2下标
//jedis.llen("framework"); //获取列表长度
jedis.del("framework");
//从framework尾部存放三条数据
jedis.rpush("framework","spring");
jedis.rpush("framework","struts");
jedis.rpush("framework","hibernate");
System.out.println(jedis.lrange("framework",0,-1));
jedis.del("sql");
jedis.lpush("sql", "hello");
jedis.lpush("sql", "there");
jedis.lpush("sql", "world");
jedis.linsert("sql", LIST_POSITION.AFTER, "there", "111");
System.out.println(jedis.lrange("sql", 0, -1));
//获取列表长度
System.out.println(jedis.llen("sql"));
//修改某下标的值
jedis.lset("sql", 0, "oracle");
//获取下标为某list下标为0的值
System.out.println(jedis.lindex("sql", 0));
//删除数据
System.out.println(jedis.lrem("sql", 1,"mongodb"));
System.out.println(jedis.lindex("sql", 1));
jedis.rpush("sql", "s");
//删除区间以外的
System.out.println(jedis.ltrim("sql", 0, 1));
System.out.println(jedis.rpush("sql", "mongodb"));
//判断是否存在,存在则弹栈
System.out.println(jedis.rpushx("sql", "mongodb"));
//弹出尾元素
jedis.rpop("sql");
//弹出头元素
jedis.lpop("sql");
//尾部进栈
jedis.rpush("sql", "mysql");
//头部进栈
jedis.lpush("sql", "linput");
}
6.set操作
public void testSet() {
Jedis jedis = new Jedis("192.168.43.100", 6379);
jedis.auth("123");
jedis.sadd("sql", "mysql");
jedis.sadd("sql", "redis");
jedis.sadd("sql", "mongodb");
jedis.sadd("sql", "oracle");
Set<String> sql = jedis.smembers("sql");
System.out.println(sql);
// 移除指定元素
jedis.srem("sql", "redis");
// 输出全部set的值
Set<String> sqls = jedis.smembers("sql");
System.out.println(sqls);
// 判断set是否存在
System.out.println(jedis.sismember("sql", "mysql"));
// 返回集合元素总数
System.out.println(jedis.scard("sql"));
jedis.sadd("sql2", "mysql");
jedis.sadd("sql2", "redis");
jedis.sadd("sql2", "sql");
// 交集
System.out.println(jedis.sinter("sql", "sql2"));
// 并集
System.out.println(jedis.sunion("sql", "sql2"));
// 差集
System.out.println(jedis.sdiff("sql2", "sql"));
// 差集
System.out.println(jedis.sdiff("sql", "sql2"));
}
7.zsort操作
public void testSortedSet() {
Jedis jedis = new Jedis("192.168.43.100", 6379);
jedis.auth("123");
jedis.flushDB();
jedis.zadd("sql", 22, "redis");
jedis.zadd("sql", 23, "mysql");
jedis.zadd("sql", 2, "mongodb");
jedis.zadd("sql", 1, "oracle");
// 从小到大
System.out.println(jedis.zrange("sql", 0, -1));
// 从大到小
System.out.println(jedis.zrevrange("sql", 0, -1));
// 统计所有的个数
System.out.println(jedis.zcard("sql"));
// 查询元素的下标
System.out.println(jedis.zscore("sql", "11"));
// 统计10-30下标的元素个数
System.out.println(jedis.zcount("sql", 10, 30));
}
8.hashmap操作
public void testMap() {
Jedis jedis = new Jedis("192.168.43.100", 6379);
jedis.auth("123");
jedis.flushDB();
Map<String, String> user = new HashMap<String, String>();
user.put("name", "小明");
user.put("age", "10");
user.put("gender", "man");
user.put("like", "basketball");
jedis.hmset("user", user);
// 获取key为name的元素
System.out.println(jedis.hmget("user", "name"));
// 统计元素个数
System.out.println(jedis.hlen("user"));
// 是否存在
System.out.println(jedis.exists("user"));
// 获取所有的key
System.out.println(jedis.hkeys("user"));
// 获取所有的value
System.out.println(jedis.hvals("user"));
for (Map.Entry<String, String> user1 : user.entrySet()) {
System.out.println(user1.getKey() + ":" + user1.getValue());
}
// 获取map中符合key的值
System.out.println(jedis.hmget("user", "name", "age", "gender"));
// 删除指定的key
System.out.println(jedis.hdel("user", "name"));
// 判断指定的key是否存在
System.out.println(jedis.hexists("user", "name"));
// 某值增加如果不存在创建一个新的key-value
System.out.println(jedis.hincrBy("user", "key", 123456));
System.out.println(jedis.hincrBy("user", "key", 22));
// 如果map的key存在不更新value并返回0
System.out.println(jedis.hsetnx("user", "name", "123"));
// 另一种遍历方式
Iterator<String> iter = jedis.hkeys("user").iterator();
while (iter.hasNext()) {
String key = iter.next();
System.out.println(key + ":" + jedis.hmget("user", key));
}
}
}
9.其他测试
public static void testOther() throws InterruptedException {
Jedis jedis = RedisUtil.getJedis();
try {
// keys中传入的可以用通配符
System.out.println(jedis.keys("*")); // 返回当前库中所有的key [sose, sanme,
// name, jarorwar, foo,
// sname, java framework,
// user, braand]
System.out.println(jedis.keys("*name"));// 返回的sname [sname, name]
System.out.println(jedis.del("sanmdde"));// 删除key为sanmdde的对象 删除成功返回1
// 删除失败(或者不存在)返回 0
System.out.println(jedis.ttl("sname"));// 返回给定key的有效时间,如果是-1则表示永远有效
jedis.setex("timekey", 10, "min");// 通过此方法,可以指定key的存活(有效时间) 时间为秒
Thread.sleep(5000);// 睡眠5秒后,剩余时间将为<=5
System.out.println(jedis.ttl("timekey")); // 输出结果为5
jedis.setex("timekey", 1, "min"); // 设为1后,下面再看剩余时间就是1了
System.out.println(jedis.ttl("timekey")); // 输出结果为1
System.out.println(jedis.exists("key"));// 检查key是否存在
System.out.println(jedis.rename("timekey", "time"));
System.out.println(jedis.get("timekey"));// 因为移除,返回为null
System.out.println(jedis.get("time")); // 因为将timekey 重命名为time
// 所以可以取得值 min
// jedis 排序
// 注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)
jedis.del("a");// 先清除数据,再加入数据进行测试
jedis.rpush("a", "1");
jedis.lpush("a", "6");
jedis.lpush("a", "3");
jedis.lpush("a", "9");
System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1]
System.out.println(jedis.sort("a")); // [1, 3, 6, 9] //输入排序后结果
System.out.println(jedis.lrange("a", 0, -1));
} catch (Exception e) {
e.printStackTrace();
} finally {
RedisUtil.getPool().returnResource(jedis);
}
}