redis存储对象和集合
使用redis存储对象或集合时,不能直接存储。需要将对象或集
合通过序列化转换为可存储的json,这里使用了fastjson来转型
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、
zset(sortedset--有序集合)和hash(哈希类型)
所用到的依赖,可以在maven仓库中查找
<!--redis客户端:Jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<!--https://mvnrepository.com/artifact/net.sf.json-lib/json-lib-->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
1.redis工具类,里面写了部分redis常用命令
packagecom.bcc.util;
importjava.util.List;
importjava.util.Map;
importjava.util.Set;
importorg.apache.commons.lang.StringUtils;
importcom.fasterxml.jackson.databind.ObjectMapper;
importredis.clients.jedis.Jedis;
importredis.clients.jedis.JedisPool;
importredis.clients.jedis.JedisPoolConfig;
importredis.clients.util.SafeEncoder;
publicclassjedisUtil{
privatestaticStringHOST="localhost";
privatestaticintPORT=6379;
privatestaticJedisPoolpool=null;
static{
JedisPoolConfigconfig=newJedisPoolConfig();
config.setMaxTotal(128);
config.setMaxIdle(80);
config.setMaxWaitMillis(2001);
pool=newJedisPool(config,HOST,PORT,2000);
}
/**
*把key存入redis中
*
*@paramkeyk
*@paramvaluev
*@paramseconds过期时间(秒)
*@returnboolean
*/
publicstaticbooleanset(byte[]key,byte[]value,intseconds){
Jedisjedis=null;
try{
jedis=pool.getResource();
Stringresult=jedis.set(key,value);
if(seconds>0){
Longr=jedis.expire(key,seconds);
}
}catch(Exceptione){
returnfalse;
}finally{
if(null!=jedis){
jedis.close();
}
}
returntrue;
}
publicstaticbyte[]get(byte[]key){
byte[]value=null;
Jedisjedis=null;
try{
jedis=pool.getResource();
value=jedis.get(key);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnvalue;
}
/**
*向缓存中设置对象
*
*@paramkeykey
*@paramobjvalue
*@returnboolean
*/
publicstaticbooleanset(Stringkey,Objectobj,Integerseconds){
Jedisjedis=null;
try{
jedis=pool.getResource();
ObjectMappermapper=newObjectMapper();
Stringvalue=mapper.writeValueAsString(obj);
jedis.set(SafeEncoder.encode(key),SafeEncoder.encode(value));
if(seconds!=null){
jedis.expire(key,seconds);
}
returntrue;
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnfalse;
}
/**
*向缓存中设置对象
*
*@paramkeykey
*@paramvaluevalue
*@returnboolean
*/
publicstaticbooleanset(Stringkey,Stringvalue,Integerseconds){
Jedisjedis=null;
try{
jedis=pool.getResource();
jedis.set(SafeEncoder.encode(key),SafeEncoder.encode(value));
if(seconds!=null){
jedis.expire(key,seconds);
}
returntrue;
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnfalse;
}
/**
*移除缓存中设置对象
*
*@paramkeys被删除的KEYS
*@returnLong被删除个数
*/
publicstaticLongdel(String...keys){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.del(keys);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
/**
*根据key获取对象
*
*@paramkeykey
*@returnT
*/
publicstatic<T>Tget(Stringkey,Class<T>clazz){
Jedisjedis=null;
try{
jedis=pool.getResource();
Stringv=jedis.get(key);
if(StringUtils.isNotEmpty(v)){
ObjectMappermapper=newObjectMapper();
returnmapper.readValue(v,clazz);
}
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
/**
*根据key值得到String类型的返回值
*
*@paramkeykey
*@returnString
*/
publicstaticStringget(Stringkey){
Jedisjedis=null;
try{
jedis=pool.getResource();
Stringv=jedis.get(key);
if(StringUtils.isNotEmpty(v)){
returnv;
}
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
publicstaticBooleanexists(Stringkey){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.exists(key);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
/**
*redis的list操作:
*把元素插入到列表的尾部
*
*@paramkeyKEY
*@paramstrings要插入的值,变参
*@return返回插入后list的大小
*/
publicstaticLongrpush(Stringkey,String...strings){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.rpush(key,strings);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
/**
*redis的list操作:
*根据开始与结束下标取list中的值
*
*@paramkeyKEY
*@paramstart开始下标
*@paramend结束下标
*@returnList<String>
*/
publicstaticList<String>lrange(Stringkey,intstart,intend){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.lrange(key,start,end);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
/**
*redis的list操作:
*取列表的长度
*
*@paramkeykey
*@returnLong
*/
publicstaticLongllen(Stringkey){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.llen(key);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
/**
*redis的list操作:
*根据值移除list中的元素
*
*@paramkeyKEY
*@paramcount:
*count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count。
*count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
*count=0:移除表中所有与value相等的值。
*@paramvalue要删除的值
*@return返回被移除的个数
*/
publicstaticLonglrem(Stringkey,longcount,Stringvalue){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.lrem(key,count,value);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
publicstaticbooleansetLong(Stringkey,Longvalue){
Jedisjedis=null;
try{
jedis=pool.getResource();
return"OK".equals(jedis.set(key,String.valueOf(value)));
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnfalse;
}
publicstaticLonggetLong(Stringkey){
Stringresult=get(key);
returnresult==null?null:Long.valueOf(result);
}
publicstaticLongincrBy(Stringkey,Longincrement){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.incrBy(key,increment);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
publicstaticLonghashSet(Stringkey,Stringfield,Stringvalue){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.hset(key,field,value);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
return-1L;
}
publicstaticLonghashSetLong(Stringkey,Stringfield,Longvalue){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.hset(key,field,String.valueOf(value));
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
return-1L;
}
publicstaticLonghashIncrBy(Stringkey,Stringfield,Longincrement){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.hincrBy(key,field,increment);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
return-1L;
}
publicstaticMap<String,String>hashGetAll(Stringkey){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.hgetAll(key);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
publicstaticSet<String>hashKeys(Stringkey){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.hkeys(key);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
publicstaticLonghashDelAll(Stringkey,String...fields){
Jedisjedis=null;
try{
jedis=pool.getResource();
returnjedis.hdel(key,fields);
}catch(Exceptione){
}finally{
if(null!=jedis){
jedis.close();
}
}
returnnull;
}
}
2.实现类中调用
packagecom.bcc.service;
importcom.alibaba.fastjson.JSON;
importcom.alibaba.fastjson.JSONObject;
importcom.bcc.dao.usermapper;
importcom.bcc.pojo.City;
importcom.bcc.util.jedisUtil;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importjava.util.List;
@Service
publicclassuserserviceimplimplementsuserservice{
@Autowired
privateusermapperum;
//这里展示一个简单的查询方法,返回的是list集合,把list集合存入redis
@Override
publicList<City>listCity(Stringsname){
//首先先判断redis中是否存在该key值
Stringaa1=jedisUtil.get("aoo");
if(aa1==null){
//若不存在首先走一下方法,从数据库中查询数据
List<City>cities=um.listCity(sname);
//然后调用JSON.toJSONString()方法转为json
Stringss=JSON.toJSONString(cities);
//存入redis
jedisUtil.set("aoo",ss,10000*100000);
returncities;
}
else{
//若存在,将key值查询出来,此时的key值还是json形式
Stringaoo=jedisUtil.get("aoo");
//调用JSON.parseArray()方法转为list集合
List<City>cities=JSON.parseArray(aoo,City.class);
//JSON.parseObject方法是转为对象
/*Citycity=JSON.parseObject(aoo,City.class);*/
returncities;
}
}
}