欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

redis缓存的简单操作(get、put)

程序员文章站 2022-03-09 11:18:48
本文介绍简单的redis缓存操作,包括引入jedisjar包、配置redis、redisdao需要的一些工具、向redis中放数据(put)、从redis中取数据(get)...

本文介绍简单的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     //那么直接返回数据

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。