Redis如何存储对象

 更新时间:2022年06月16日 11:47:19   作者:酷爱编程的小猿同学  
这篇文章主要介绍了Redis如何存储对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Redis存储对象

在以往面试中,多次被问到Redis怎么存储对象,我支支吾吾半天回答不上来,毕竟我只用过String类型,为了避免以后的尴尬,今天花点时间来整理一下。

本人用的Jedis客户端

首先引入依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>

创建一个Jedis实例

package com.xiateng.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
 
/**
 * jedis获取工具类
 */
public class JedisUtil { 
    private static JedisPool jedisPool;
    private static final Logger logger = LoggerFactory.getLogger(JedisUtil.class);
 
    static {
        // 初始化连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);
        jedisPoolConfig.setMaxIdle(10);
        jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
        logger.info("jedisPool连接池初始化====" + jedisPool);
    }
 
    /**
     * 获取一个Jedis实例
     * @return
     */
    public synchronized static Jedis getJedis(){
        Jedis jedis = jedisPool.getResource();
//        jedis.auth("123456");//密码
        return jedis;
    }
}

下面我们来实现存储对象

方式一:将对象转化为JSON字符串存入redis

Jedis jedis = JedisUtil.getJedis();
TUser tUser = new TUser();
tUser.setUserName("你好");
tUser.setPassword("2342342");
jedis.set("xiateng", JSON.toJSONString(tUser));
 
String sss = jedis.get("xiateng");
TUser ssss = JSON.parseObject(sss,TUser.class);
jedis.del("xiateng");
System.out.println("---------------------------:  "+ssss.toString());

方式二:将对象序列化后存到redis

封装序列化跟反序列化方法

package com.xiateng.util; 
import java.io.*; 
public class SerializeUtil {
 
    /**
     * 序列化操作
     * @param object
     * @return
     */
    public static byte[] serialize(Object object){
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            // 序列化
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
 
            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    /**
     * 反序列化操作
     * @param bytes
     * @return
     */
    public static Object unSerialize(byte[] bytes){
        ByteArrayInputStream bais = null;
 
        try {
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 
        return null;
    }
}

保存对象

Jedis jedis = JedisUtil.getJedis();      
jedis.set("code".getBytes(), SerializeUtil.serialize(tUser));
byte[] bytes = jedis.get("code".getBytes());
TUser o = (TUser)SerializeUtil.unSerialize(bytes);
jedis.del("code");
System.out.println(o.toString());

方式三:将对象用Hash数据类型存储

Jedis jedis = JedisUtil.getJedis();
jedis.hset("user", "id", "3");
jedis.hset("user", "name", "xiateng");
jedis.hset("user", "password", "123455");
jedis.hget("user","id");
List<String> user = jedis.hmget("user", new String[]{"id","name","password"});
System.out.println("---------------------------:  "+user);
 
// 输出结果 [3,xiateng,123455]

注意:以序列化的方式存储的对象需要实现 Serializable 接口

Redis可以存储java对象吗

答案:是可以

但是你对象必须要序列化。

redis没有办法把一个没有序列化的对象存储到redis中。

package com.kuangstudy.entiy;
import lombok.Data;
public class User implements java.io.Serializable{
    private Integer id;
    private String nickname;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNickname() {
        return nickname;
    }
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

这样太麻烦了,并且存储中文会有乱码,那如何解决呢?只能重新定义一个redisTemplate

package com.kuangstudy.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration {
    /**
     * @return org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.Object>
     * @Author 徐柯
     * @Description 改写redistemplate序列化规则
     * @Date 13:20 2021/5/20
     * @Param [redisConnectionFactory]
     **/
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 创建一个json的序列化方式
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置value用jackjson进行处理
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // 设置key用string序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合Mybatis-plus和Redis实现投票功能

    SpringBoot整合Mybatis-plus和Redis实现投票功能

    投票功能是一个非常常见的Web应用场景,这篇文章将为大家介绍一下如何将Redis和Mybatis-plus整合到SpringBoot中,实现投票功能,感兴趣的可以了解一下
    2023-05-05
  • 关于Redis未授权访问的问题

    关于Redis未授权访问的问题

    这篇文章主要介绍了Redis未授权访问的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 基于 Redis 实现接口限流的方式

    基于 Redis 实现接口限流的方式

    今天想和小伙伴们聊聊用 Redis 处理接口限流,这也是最近的 TienChin 项目涉及到这个知识点了,我就拎出来和大家聊聊这个话题
    2022-05-05
  • Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题

    Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题

    这篇文章主要介绍了Redis 中使用 list,streams,pub/sub 几种方式实现消息队列,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Unable to connect to Redis无法连接到Redis解决的全过程

    Unable to connect to Redis无法连接到Redis解决的全过程

    这篇文章主要给大家介绍了关于Unable to connect to Redis无法连接到Redis解决的相关资料,文中通过图文以及实例代码将解决的过程介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 一起raid数据恢复及回迁成功的案例

    一起raid数据恢复及回迁成功的案例

    这篇文章主要介绍了一起raid数据恢复及回迁成功的案例,需要的朋友可以参考下
    2017-04-04
  • RedisTemplate 实现基于Value 操作的简易锁机制(示例代码)

    RedisTemplate 实现基于Value 操作的简易锁机制(示例代码)

    本文将介绍如何使用 RedisTemplate 的 opsForValue().setIfAbsent() 方法来实现一种简单的锁机制,并提供一个示例代码,展示如何在 Java 应用中利用这一机制来保护共享资源的访问,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • 百行代码实现基于Redis的可靠延迟队列

    百行代码实现基于Redis的可靠延迟队列

    本文主要介绍了百行代码实现基于Redis的可靠延迟队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Redis BloomFilter实例讲解

    Redis BloomFilter实例讲解

    这篇文章主要介绍了Redis BloomFilter实例。BloomFilter不需要存储key,节省空间,在某些对保密要求非常严格的场合有优势。想要进一步了解BloomFilter运用实例的小伙伴可以了解一下这篇文章
    2021-09-09
  • redis实现存储帖子的点赞状态和数量的示例代码

    redis实现存储帖子的点赞状态和数量的示例代码

    使用Redis来实现点赞功能是一种高效的选择,因为Redis是一个内存数据库,适用于处理高并发的数据操作,这篇文章主要介绍了redis实现存储帖子的点赞状态和数量的示例代码,需要的朋友可以参考下
    2023-09-09

最新评论