【Redis】redis 存储对象 的三种方式

在这里插入图片描述

1.概述

转载:https://blog.youkuaiyun.com/u014756827/article/details/88830973

2.方式一:序列化操作

public class SerializeUtil {
    /*
     * 序列化
     * */
    public static byte[] serizlize(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 (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(baos != null){
                    baos.close();
                }
                if (oos != null) {
                    oos.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return null;
    }
    /*
     * 反序列化
     * */
    public static Object deserialize(byte[] bytes){
        ByteArrayInputStream bais = null;
        ObjectInputStream ois = null; 
        try{
            bais = new ByteArrayInputStream(bytes);
            ois = new ObjectInputStream(bais);
            return ois.readObject();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
 
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return null;
    }
}

获取jedis实例

public class RedisConnection {
    private static String HOST = "127.0.0.1";
    private static int PORT = 6379;
    private static int MAX_ACTIVE = 1024;
    private static int MAX_IDLE = 200;
    private static int MAX_WAIT = 10000;
 
    private static JedisPool jedisPool = null;
 
    /*
     * 初始化redis连接池
     * */
    private static void initPool(){
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_ACTIVE);//最大连接数
            config.setMaxIdle(MAX_IDLE);//最大空闲连接数
            config.setMaxWaitMillis(MAX_WAIT);//获取可用连接的最大等待时间
 
            jedisPool = new JedisPool(config, HOST, PORT);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /*
     * 获取jedis实例
     * */
    public synchronized static Jedis getJedis() {
        try {
            if(jedisPool == null){
                initPool();
            }
            Jedis jedis = jedisPool.getResource();
            jedis.auth("redis");//密码
            return jedis;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

redis操作

public class RedisOps {
    public static void set(String key,String value){
        Jedis jedis = RedisConnection.getJedis();
        jedis.set(key, value);
        jedis.close();
    }
    public static String get(String key){
        Jedis jedis = RedisConnection.getJedis();
        String value = jedis.get(key);
        jedis.close();
        return value;
    }
    public static void setObject(String key,Object object){
        Jedis jedis = RedisConnection.getJedis();
        jedis.set(key.getBytes(), SerializeUtil.serizlize(object));
        jedis.close();
    }
    public static Object getObject(String key){
        Jedis jedis = RedisConnection.getJedis();
        byte[] bytes = jedis.get(key.getBytes());
        jedis.close();
        return SerializeUtil.deserialize(bytes);
    }
}

实体类

public class User implements Serializable{
    private static final long serialVersionUID = -3210884885630038713L;
    private int id;
    private String name;
    public User(){
 
    }
    public User(int id,String name){
        this.id = id;
        this.name = name;
    }
    //setter和getter方法
}
测试用例

public class RedisTest {
 
    @Test
    public void testString(){
        RedisOps.set("user:1", "sisu");
        String user = RedisOps.get("user:1");
        Assert.assertEquals("sisu", user);
    }
 
    @Test
    public void testObject(){
        RedisOps.setObject("user:2",new User(2,"lumia"));
        User user = (User)RedisOps.getObject("user:2");
        Assert.assertEquals("lumia", user.getName());
    }
 
}

方式二:使用fastjson将对象转为json字符串后存储

public class RedisOps {
    public static void setJsonString(String key,Object object){
        Jedis jedis = RedisConnection.getJedis();
        jedis.set(key, JSON.toJSONString(object));
        jedis.close();
    }
    public static Object getJsonObject(String key,Class clazz){
        Jedis jedis = RedisConnection.getJedis();
        String value = jedis.get(key);
        jedis.close();
        return JSON.parseObject(value,clazz);
    }
}

测试:

@Test
    public void testObject2(){
        RedisOps.setJsonString("user:3", new User(3,"xiaoming"));
        User user = (User)RedisOps.getJsonObject("user:3",User.class);
        Assert.assertEquals("xiaoming", user.getName());
    }

方式三:使用Hash数据类型

//存
Jedis jedis = RedisConnection.getJedis();
jedis.hSet("user:3","id","3");
jedis.hSet("user:3","name","xiaoming");
jedis.close();
//取
Jedis jedis = RedisConnection.getJedis();
String id = jedis.hGet("user:3","id");
String name = jedis.hGet("user:3","name");
jedis.close();

3.布隆过滤器

关键是这个方法能存储布隆过滤器,也就是说可以存储任意对象。

### 如何在 Redis 中使用 HashSet 存储对象 Redis 的 `HashSet` 是一种高效的键值对存储结构,特别适用于存储具有多个属性的对象。通过将对象的各个字段作为 `HashSet` 的子字段存储,可以实现快速访问和更新。 #### 使用 Redis 的 HashSet 存储对象的最佳实践 1. **定义对象模型** 首先需要明确要存储对象及其字段。假设有一个表示用户的对象,包含以下字段:`id`, `name`, 和 `email`。 2. **序列化与反序列化** 如果直接使用 Redis CLI 或者低级 API,则可以通过手动拼接键值对的方式存储;如果使用高级框架(如 Spring Data Redis),则可以选择合适的序列化器来简化开发过程[^3]。 3. **代码示例** 以下是基于 Java 和 Spring Boot 的示例,展示如何利用 `RedisTemplate` 将用户对象存储Redis 的 `HashSet` 中: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveUser(String userId, String name, String email) { // 设置 hash key 和 field-value 对应关系 redisTemplate.opsForHash().put("user:" + userId, "name", name); redisTemplate.opsForHash().put("user:" + userId, "email", email); System.out.println("User saved successfully."); } public Map<Object, Object> getUser(String userId) { // 获取整个 hash 表的内容 return redisTemplate.opsForHash().entries("user:" + userId); } } ``` 此代码片段展示了如何保存和读取用户信息至 Redis 的 `HashSet` 结构中。每条记录都以 `"user:<userId>"` 为根键名,而具体的字段(如名字和邮箱地址)被当作该哈希表内的子项处理。 4. **命令行操作实例** 对于不依赖任何编程语言的情况,在纯 Redis 环境下也可以轻松完成同样的任务。下面给出一个简单的例子说明怎样手工录入数据以及查询这些数据: ```bash # 添加新纪录 HSET user:1001 name "Alice" HSET user:1001 email "alice@example.com" # 查看某一条记录的所有详情 HGETALL user:1001 # 更新某个特定字段 HSET user:1001 email "new.alice@example.com" # 删除整条记录或者部分字段 HDEL user:1001 email ``` 以上步骤涵盖了基本 CRUD 功能,并且能够满足大多数实际应用场景的要求[^4]。 --- ### 性能考量与其他建议 当涉及大规模并发写入时,需注意合理设计过期策略以免堆积过多无用数据占用内存资源。另外还可以考虑压缩算法减少空间消耗等问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值