redis存储对象和集合

尹小鱼 2018-09-19

使用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;

}

}

}

相关推荐

DiamondTao / 0评论 2020-08-30