您的位置:首页 > 数据库 > Redis

java使用redis入门学习--Jedis

2016-06-14 22:32 751 查看
人总要进步!最近的项目中,因为是电商类的网站,图片比较多,考虑到网站性能问题,所以尝试用redis做缓存,当然,redis很多高大上的功能都还没能及时到应用到项目中来,只是初步的使用了redis做页面缓存,减少数据库的压力。项目代码不能贴,下面贴上自己刚学习redis时敲的学习代码,可能不是很全面,仅供入门参考和自己以后回顾。

安装redis服务过程略过,网上很多,也很简单。相关jar包:jedis-2.7.2.jar   commons-pool2-2.4.2.jar

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Transaction;
import sun.tools.jar.resources.jar;

/**
* redis Demo
* @author 李小拐
* 2016年6月11日16:17:58
*/
public class RedisUtil {

private static JedisPool pool=null;//声明jedis池

private static JedisPool getPool(){
if(pool==null){
JedisPoolConfig config=new JedisPoolConfig();
//可用连接实例的最大数目,默认值为8,旧版本是maxActive,如果赋值为-1,则表示不限制
config.setMaxTotal(500);
//设置允许池中最大的空连接数
config.setMaxIdle(20);
//设置最大等待时间
config.setMaxWaitMillis(1000*60);
//引入一个jedis的实例时,是否提前进行validate操作,true表示得到的实例均可用
config.setTestOnBorrow(true);

pool=new JedisPool(config, "127.0.0.1",6379);
}
return pool;
}
/**
* 回收jedis
* @param pool
* @param jedis
*/
private static void returnJedisPool(JedisPool pool,Jedis jedis) {
pool.returnResourceObject(jedis);
}

/**
* jedis对字符串的基本操作
*/
public static void Jedis_String(){
System.out.println("------------------------------------------string");
JedisPool pool=getPool();
Jedis jedis=pool.getResource();
try{
//jedis中存入一个值
jedis.set("name", "李小拐");
System.out.println(jedis.get("name"));//result:李小拐
//在原来基础后面追加一个值
jedis.append("name", "--追加到后面");
System.out.println(jedis.get("name"));//result:李小拐--追加到后面
//jedis覆盖原来的值
jedis.set("name", "易小乖");
System.out.println(jedis.get("name"));//result:易小乖
//删除key
jedis.del("name");
System.out.println(jedis.get("name"));//result:null
//设置多个key值,相当于jedis.set("name", "李小拐");  jedis.set("sex", "男");
//当然也能同时删除/获取多个key
jedis.mset("name","李小拐","sex","男");
//jedis.mget结果是list<String>类型
System.out.println(jedis.mget("name"));//result:[李小拐]
System.out.println(jedis.mget("name","sex"));//result:[李小拐, 男]
//setnx:当key存在时和不存在时-------这能防止新增覆盖原值
jedis.setnx("name", "李二拐");
jedis.setnx("nameA", "李三拐");
System.out.println("---"+jedis.mget("name","nameA"));//result:[李小拐, 李三拐]
//setex:设置值的同时设置过期时间
jedis.setex("nameB", 3, "李四拐");
System.out.println(jedis.get("nameB"));//result:李四拐
Thread.sleep(1000*3);//等待3s
System.out.println(jedis.get("nameB"));//result:null
//获取原值同时更新新值
System.out.println(jedis.getSet("nameA", "李new拐"));//result:李三拐
System.out.println(jedis.get("nameA"));//result:李new拐
//截取字符串
System.out.println(jedis.getrange("nameA", 3, 5));//result:new
}catch (Exception e) {
}finally{
//回收jedis
//getPool().returnResource(jedis);//过时
//getPool().returnResourceObject(jedis);
returnJedisPool(pool, jedis);
}
}

/**
* jedis操作Hash
*/
public static void Jedis_Hash(){
System.out.println("------------------------------------------Hash");
Jedis jedis=getPool().getResource();
Map<String, String> map=new HashMap<String, String>();
map.put("name", "李小拐");
map.put("sex", "男");
map.put("age", "25");
//存入map数据
jedis.hmset("user", map);
jedis.hset("user", "hset", "hsetvalue");
//结果是List<String>类型,第一个是jedis的key,后面可以跟多个map的key
List<String> list=jedis.hmget("user","name","sex");
System.out.println(list);//result:[李小拐,男]
//删除map中某个key
jedis.hdel("user", "sex");
System.out.println(jedis.hmget("user", "sex"));//删除了,返回null
//返回key为user的值的长度
System.out.println(jedis.hlen("user"));//result:2
//返回user对象中所有的key,,,类型Set<String>
System.out.println(jedis.hkeys("user"));//result:[age, name]
//返回user
4000
对象中所有的value,,,类型List<String>
System.out.println(jedis.hvals("user"));//result:[李小拐, 25]
//遍历map所有的key并取值
Iterator<String> iterator=jedis.hkeys("user").iterator();
while (iterator.hasNext()) {
String key=iterator.next();
System.out.println(key+":"+jedis.hget("user", key));
}
}

/**
* jedis操作List
*/
public static void Jedis_List(){
System.out.println("------------------------------------------LIST");
Jedis jedis=getPool().getResource();
//List集合可以无限添加重复值,所以这里添加之前,先把其清空,方便看效果
jedis.del("users");
jedis.del("users2");
//----------------------------------lpush:后进先出(添加在list的头部)
jedis.lpush("users", "李小拐");
jedis.lpush("users", "李中拐");
jedis.lpush("users", "李大拐");
//第一个key,第二个起始位置,第三个是结束位置,-1表示取,,,结果类型List<String>
System.out.println(jedis.lrange("users", 0, -1));//result:[李大拐, 李中拐, 李小拐]
//覆盖位置1的元素值
jedis.lset("users", 1, "李新拐");
System.out.println(jedis.lrange("users", 0, -1));//result:[李大拐, 李新拐, 李小拐]
//对列表进行裁剪,key,开始位置,结束位置,因为是lpush后进先出,所以直接干掉了李大拐
jedis.ltrim("users", 1, 2);
System.out.println(jedis.lrange("users", 0, -1));//result:[李新拐, 李小拐]
//获取列表长度
System.out.println(jedis.llen("users"));//result:3
//----------------------------------rpush:先进先出(添加在list的尾部)
jedis.rpush("users2", "李小拐");
jedis.rpush("users2", "李中拐");
jedis.rpush("users2", "李大拐");
System.out.println(jedis.lrange("users2", 0, -1));//result:[李小拐, 李中拐, 李大拐]
//对列表进行裁剪,只保留区间内的数,因为是rpush先进先出,所以直接干掉了李小拐
jedis.ltrim("users2", 1, 2);
System.out.println(jedis.lrange("users2", 0, -1));//result:[李中拐, 李大拐]
//List<String>类型来接受结果
List<String> list=jedis.lrange("users2", 0, -1);
for(int i=0;i<list.size();i++){
System.out.println("user2:::"+list.get(i));
}

//移除并返回列表的第一个元素。
System.out.println(jedis.lpop("users2"));//result:李中拐
//移除并返回列表的最后一个元素。
//System.out.println(jedis.rpop("users2"));
System.out.println(jedis.lrange("users2", 0, -1));//result:[李大拐]
//获取指定下标的元素值
System.out.println(jedis.lindex("users2", 0));//result:李大拐
}

/**
* jedis操作Set
* sadd---无序集合
* zadd---有序集合
*/
public static void Jedis_Set(){
System.out.println("------------------------------------------SET(sadd)");
Jedis jedis=getPool().getResource();
//添加
jedis.sadd("sname", "李小拐");//可以试试这里sname换成前面用过的name,看看会不会冲突
jedis.sadd("sname", "李中拐");
jedis.sadd("sname", "李大拐","李二拐");//可以一次添加多个
jedis.sadd("sname", "要删除的");
jedis.sadd("sname", "要删除的");//插入重复的会被忽略
//遍历集合,从结果可以看出是无序的
System.out.println(jedis.smembers("sname"));//result:[李小拐, 李中拐, 李二拐, 要删除的, 李大拐]
Set<String> set=jedis.smembers("sname");
for (String val : set) {

System.out.print("====="+val);
}
//移除集合里某个元素
jedis.srem("sname", "要删除的");
//获取所有成员
System.out.println("\r"+jedis.smembers("sname"));//result:[李小拐, 李中拐, 李大拐]
//判断李小拐是不是sname的元素,判断是否存在
System.out.println(jedis.sismember("sname", "李小拐"));//result:true
//srandmember返回集合中的一个随机元素。 该操作和SPOP相似,但SPOP将随机元素从集合中移除并返回,而SRANDMEMBER则仅仅返回随机元素
System.out.println(jedis.srandmember("sname"));//result:
//随机返回集合中的某个元素,并从集合中移除移除
System.out.println(jedis.spop("sname"));//result:
//获取所有成员
System.out.println(jedis.smembers("sname"));
//获取成员数量(长度)
System.out.println(jedis.scard("sname"));//result:3

System.out.println("此刻sname的集合::"+jedis.smembers("sname"));//[李小拐, 李中拐, 李二拐]
//此处新增一个sname2的集合
jedis.sadd("sname2", "李小拐", "易小乖");

//取两个集合的并集(全部)
Set<String> set1=jedis.sunion("sname2","sname");
System.out.println(set1);//[李小拐, 李中拐, 李二拐, 易小乖]

//取两个集合的差集(前一个独有的)
Set<String> set2=jedis.sdiff("sname","sname2");
System.out.println(set2);//[李二拐, 李中拐]
//取两个集合的差集,调换了前后位置,结果也就变了
Set<String> set3=jedis.sdiff("sname2","sname");
System.out.println(set3);//[易小乖, 李小拐]

//取两个集合的交集(共有的)
Set<String> set4=jedis.sinter("sname","sname2");
System.out.println(set4);

System.out.println("------------------------------------------SET(zadd)");
jedis.zadd("zname", 3, "李小拐1");
jedis.zadd("zname", 4, "李小拐2");
jedis.zadd("zname", 1, "李小拐3");
jedis.zadd("zname", 2, "李小拐4");
//按权重排序
System.out.println(jedis.zrange("zname", 0, -1));//[李小拐3, 李小拐4, 李小拐1, 李小拐2]
//移除 ---zrem
//总数----zcard
//位于某个权重范围内的元素个数
System.out.println(jedis.zcount("zname", 2, 4));//3

}

/**
* 其他一些基础操作
*/
public static void Jedis_Other(){
Jedis jedis=getPool().getResource();
//对key进行模糊查询,这里是查出全部的key
Set<String> keys = jedis.keys("*");
System.out.println(keys);

//对key进行模糊查询,这里是查出已s开头的key全部的key
Set<String> keys2 = jedis.keys("s*");
System.out.println(keys2);

//删除某个key
//jedis.del("sex");

//判断某个key是否存在
System.out.println(jedis.exists("name"));

//设置key的失效时间,单位:秒
jedis.expire("name", 10);//10s过期

//获取key的存活时间(及剩余的有效时间)
System.out.println(jedis.ttl("name"));

//去掉key的失效时间expire,即理论上永存
jedis.persist("name");

//int类型采用String存储
jedis.set("amount", 100 + "");
long val;
//自增
val=jedis.incr("amount");
System.out.println(val);
//自减
val=jedis.decr("amount");
System.out.println(val);
//做加法
val=jedis.incrBy("amount", 5);
System.out.println(val);
//做减法
val=jedis.decrBy("amount", 5);
System.out.println(val);
//可以用非int类型的的做下加减试试

//jedis对事物的支持
Transaction tx=jedis.multi();
//模拟批量操作,事物hejedis操作方式一样
for (int i = 0; i < 5; i++) {
tx.set("key"+i, "value"+i);
}
//执行事物,返回每一个结果
List<Object> list=tx.exec();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)+"--------");
}

//清空当前DB
jedis.flushDB();
//清空全部DB....两个有什么区别呢??
jedis.flushAll();
}

}


动手才能真正的感受到代码的魅力,上面就是本人学习敲的redis demo,非常基础,希望下一位学习的朋友,也自己敲一次。

最后一句:多有不足之处,请大神们勿喷!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java redis 缓存 性能 jedis