本文介绍简单的redis缓存操作,包括引入jedisjar包、配置redis、RedisDao需要的一些工具、向redis中放数据(put)、从redis中取数据(get)、访问redis时的逻辑
一、引入jedis jar包
<!-- java访问redis的jar包jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> <!-- protostuff序列化依赖 --> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.0.8</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.8</version> </dependency>
注意:为什么要引入序列化依赖jar包protostuff?
1)从redis中取出的数据是序列化的,我们需要使用protostuff的反序列化操作,讲序列化对象转化成我们的需要的对象
2)向redis中放入数据时,我们需要先使用protostuff的序列化操作,将对象转化成序列化对象,才能放入redis
二、在spring配置文件中注入redis,放入spring的ioc容器
<!-- 注入redis dao --> <bean id="redisDao" class="org.demo.dao.cache.RedisDao"> <constructor-arg index="0" value="localhost"></constructor-arg> <constructor-arg index="1" value="6379"></constructor-arg> </bean>
注意:
1)这里的RedisDao路径是我的包路径,注意你在配置的时候应使用你自己的路径
2)这里使用本地的redis服务localhost
3)redis服务的默认端口是6379
三、RedisDao需要的一些工具
//redis连接池 private final JedisPool jedisPool;//根据对象的字节码文件,生成空对象 private RuntimeSchema<Object> schema = RuntimeSchema.createFrom(Object.class); //Object.class:获取对象的字节码 public RedisDao(String ip, int port){ jedisPool = new JedisPool(ip, port); }
注意:
1)RedisDao需要redis的连接池JedisPool,就好比JDBC的数据库连接池一样。我们在RedisDao的构造器中会初始化这个连接池
2)我们需要一个可以根据对象的字节码文件生成空对象的工具 RuntimeSchema。你要使用什么对象,你就在Object的位置写入你的对象(Object.class:获取对象的字节码文件)
3)连接池JedisPool的初始化需要两个参数:ip、port
四、向redis中放数据(put)
//将对象缓存到redis public String putObject(Object obj){ //缓存逻辑:Object --> 序列化 --> byte[] --> 缓存到redis try { Jedis jedis = jedisPool.getResource(); //获取redis的连接对象,相当于JDBC的connection try{ String key = "Object:"+obj.getId(); //进行序列化 byte[] bytes = ProtostuffIOUtil.toByteArray(seckill, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); //如果对象过大,会进行缓冲 //开始缓存 int timeout = 60*60; //设置超时时间 一小时,通过超时维护一致性 String result = jedis.setex(key.getBytes(), timeout, bytes); return result; }finally{ jedis.close(); } } catch (Exception e) { e.printStack(); } return null; }
注意:
1)缓存逻辑:Object --> 序列化操作 --> byte[] --> 写入redis。也就是先把对象序列化,再写入redis!
2)我们在操作redis之前必须先拿到redis的连接对象,从连接池拿
五、从redis中取数据(get)
//从redis缓存中查询 public Object getObject(long id){ //redis操作逻辑 try { Jedis jedis = jedisPool.getResource(); //缓存连接对象,相当于数据库连接对象connection try { String key = "Object:"+id; //实体对象并没有实现内部序列化操作 //缓存逻辑:getByte[] --> 反序列化 --> Object byte[] bytes = jedis.get(key.getBytes()); //从jedis中获取目标对象的序列化对象数组 if(bytes != null){ //反序列化逻辑 Object obj = schema.newMessage(); //通过schema生成一个新的空对象 ProtostuffIOUtil.mergeFrom(bytes, obj, schema); //进行反序列化操作 return obj; } } finally { jedis.close(); } } catch (Exception e) { e.printStack(); } return null; }
注意:
1)取数据逻辑:redis --> 得到byte[] --> 反序列化 --> Object
2)我们在放数据的时候,是以键值对的形式:id --> obj。我们在取数据的时候,就是根据id来取的
六、查询redis时的逻辑
伪代码:
get form redis_cache //首先查询redis if null //如果没有 get from db //再从数据库db查询 if null //如果仍然没有 return null //那么返回空 else //否则 put into redis_cache //现将数据放入redis return obj //再放回数据 else //如果从redis中查询到了 return obj //那么直接返回数据
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
redis,缓存
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。