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

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

本文介绍简单的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(obj, 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.printStackTrace();
        }
        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.printStackTrace();
        }
        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                    //那么直接返回数据

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ken的杂谈

【系统设置】CentOS 修改机器名

17530
来自专栏FSociety

SQL中GROUP BY用法示例

GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

5.1K20
来自专栏儿童编程

什么样的人生才是有意义的人生——没有标准的标准答案

【导读】其实我们可以跳出这个小圈圈去更加科客观地看一下这个世界。在夜晚的时候我们仰望天空,浩瀚的宇宙中整个地球只是一粒浮尘,何况地球上一个小小的人类?在漫长的历...

1.7K50
来自专栏儿童编程

我不是算命先生,却对占卜有了疑惑——如何论证“占卜前提”的正确与否

事出有因,我对《周易》感兴趣了很多年。只是觉得特别有趣,断断续续学习了一些皮毛。这几天又偶然接触到了《梅花易数》,觉得很是精彩,将五行八卦天干地支都串联了起来。...

14310
来自专栏儿童编程

儿童创造力教育与编程教育的碰撞——MIT雷斯尼克教授最新理论梗概

儿童编程教育已经在我国各一线二线城市疯狂出现,颇有“烂大街”的趋势。我们不禁要问很多很多问题:

21870
来自专栏儿童编程

《动物魔法学校》儿童学编程Scratch之“外观”部分

导读:本文通过一个案例《动物魔法学校》来学习Scratch语言的“外观”部分。之后通过一系列其他功能的综合运用对作品功能进行了扩展。

18840
来自专栏儿童编程

一张图理清《梅花易数》梗概

学《易经》的目的不一定是为了卜卦,但是了解卜卦绝对能够让你更好地了解易学。今天用一张思维导图对《梅花易数》的主要内容进行概括,希望能够给学友们提供帮助。

31040
来自专栏儿童编程

声音功能让儿童编程更有创造性

导读:Scratch中声音功能非常强大,除了常规的音效,你甚至可以模拟各种乐器的各个发音、设置节拍、休止……如果你愿意,甚至可以用它创作一个交响乐。我们可以引导...

13540
来自专栏儿童编程

天干地支五行八卦的对应关系

18890
来自专栏haifeiWu与他朋友们的专栏

复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

27040

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励