当前位置: 首页 > 科技观察

Redis是如何存储对象和集合的

时间:2023-03-15 18:47:17 科技观察

在项目中,缓存和mq消息队列可以说是两个不可或缺的重要技术。前者主要是减轻数据库的压力,大大提高性能。后者主要是为了提升用户体验。我理解的是在后端做一个ajax请求(异步),ribbmitmq等消息队列有重试机制等功能。这里主要说说redis是如何存储对象和集合,以及如何取出来的。1.在启动类中添加如下代码privateJedisjedis;privateJedisPoolConfigconfig;privateJedisShardInfosharInfo;@BeanpublicJedisjedis(){//连接redis服务器,192.168.0.100:6379//jedis=newJedis("192.168.0.100",6379);////授权认证//jedis.auth("123456");//操作单个文本字符串config=newJedisPoolConfig();config.setMaxIdle(1000);//最大空闲时间config.setMaxWaitMillis(1000);//最长等待时间config.setMaxTotal(500);//redis池中最大对象数sharInfo=newJedisShardInfo("192.168.0.100",6379);sharInfo.setPassword("123456");sharInfo.setConnectionTimeout(5000);//连接超时jedis=newJedis(sharInfo);returnjedis;}2.在application.yml中添加redis配置spring:redis:database:0host:101.132.191.77port:6379password:123456pool:max-idle:8#连接池最大连接数(使用负值表示不限制)min-idle:0#连接池最小空闲连接max-active:8#连接池最大阻塞等待时间(使用负值表示没有限制)max-wait:-1#连接池中最大空闲连接超时:5000#连接超时(毫秒)3.新建一个SerializeUtil类,主要用于redis中对象的序列化importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.ObjectInputStream;importjava。io。目的ctOutputStream;/**publicclassSerializeUtil{publicstaticbyte[]serialize(Objectobject){ObjectOutputStreamoos=null;ByteArrayOutputStreambaos=null;try{//顺序化baos=newByteArrayOutputStream();oos=newObjectOutputStream(baos);oos.writeObject(object);byte[]bytes=baos.toByteArray();returnbytes;}catch(Exceptione){}returnnull;}publicstaticObjectunserialize(byte[]bytes){ByteArrayInputStreambais=null;try{//反序列化bais=newByteArrayInputStream(bytes);ObjectInputStreamois=newObjectInputStream(bais);returnois.readObject();}catch(Exceptione){}returnnull;}}4.我封装了一个RedisServiceImpl类,主要是使用对redis设置值和取值importcom.ys.util.redis.SerializeUtil;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.StringRedisTemplate;importorg.springframework.stereotype.Service;importredis.clients.jedis.Jedis;importjava.util.List;importjava.util.Map;importjava.util.concurrent.TimeUnit;@ServicepublicclassRedisServiceImpl{@AutowiredprivateStringRedisTemplatestringRedisTemplate;@AutowiredprivateJedisjedis;publicvoidsetStr(Stringkey,Stringvalue){setStr(key,value,null);}publicvoidsetStr(Stringkey,Objectvalue,Longtime){if(value==null){return;}if(valueinstanceofString){Stringobj=(String)value;stringRedisTemplate.opsForValue().set(key,obj);}elseif(valueinstanceofList){Listobj=(List)value;stringRedisTemplate.opsForList().leftPushAll(key,obj);}elseif(valueinstanceofMap){Mapobj=(Map)value;stringRedisTemplate.opsForHash().putAll(key,obj);}if(time!=null)stringRedisTemplate.expire(key,time,TimeUnit.SECONDS);}publicObjectgetKey(Stringkey){returnstringRedisTemplate.opsForValue().get(key);}publicvoiddelKey(Stringkey){stringRedisTemplate.delete(key);}publicbooleandel(Stringkey){returnjedis.del(key.getBytes())>0;}}5.测试redis是否ok,编写redisController类importcom.ys.service.impl.RedisServiceImpl;importcom.ys.vo.IqProduct;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;@RestControllerpublicclassRedisServiceController{@AutowiredprivateRedisServiceImplredisService;@RequestMapping(value="/setredis")publicStringsetredis(Stringkeyredis){redisService.setStr(keyredis,"2018年1月26日");return"保存成功,请访问getredis查询redis";}@RequestMapping(value="/setObj")publicStringsetObj(Stringkeyredis){IqProductiqProduct=newIqProduct();iqProduct.setSort(1);iqProduct.setTimestamp(newDate().getTime());iqProduct.setProductName("productname");//list.add(iqProduct);redisService.set(keyredis,iqProduct);return"保存成功,请访问getredis查询redis";}@RequestMapping(value="/getObj")publicObjectgetObj(Stringkeyredis){Objectobject=redisService.get(keyredis);if(object!=null){IqProductiqProduct=(IqProduct)对象;System.out.println(iqProduct.getProductName());System.out.println(iqProduct.getId());System.out.println(iqProduct.getTimestamp());}returnobject;}@RequestMapping(value="/delObj")publicbooleandelObj(Stringkeyredis){booleandel=redisService.del(keyredis);returndel;}@RequestMapping(value="/getredis")publicStringgetredis(Stringkeyredis){Stringgetredis=(String)redisService.getKey(keyredis);return"redis的key是===>"+getredis;}@RequestMapping(value="/delredis")publicStringdelredis(Stringkeyredis){redisService.delKey(keyredis);return"删除成功,请通过getredis进行查询";}@RequestMapping(value="/setList")publicStringsetList(Stringkeyredis){Listlist=newArrayList();for(inti=0;i<10;i++){IqProductiqProduct=newIqProduct();iqProduct.setSort(1);iqProduct.setTimestamp(newDate().getTime());iqProduct.setProductName("productname");list.add(iqProduct);}redisService.set(keyredis,list);return"保存成功,请访问getredis查询redis";}@RequestMapping(value="/getList")publicObjectgetList(Stringkeyredis){Objectobject=redisService.get(keyredis);if(object!=null){ListiqProducts=(List)object;for(inti=0;i