栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

往redis里存对象,将bean存入redis hash中

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

往redis里存对象,将bean存入redis hash中

往redis里存对象,将bean存入redis hash中

文章目录

往redis里存对象,将bean存入redis hash中

1.SpringBoot中添加redis配置类2. 实现代码附录 ⭐哈希(hash)复习

由于redis中Hash数据类型的特点,特别适合存储对象,所以我们使用hash存储对象

我们最后要完成的效果是这样的:

我们首先要知道如果往hash的key中加英文冒号:,用可视化工具看的时候就会自动变成上面图左上角那样

这里我存的key是:umbrella:王五oR83j4kkq2CyvVmuxl6znKbrWi2A

往hash中存数据一共有三种形式,我放到文章最后面,可以复习看一下

1.SpringBoot中添加redis配置类

坐标依赖:


    org.springframework.boot
    spring-boot-starter-data-redis



    org.apache.commons
    commons-pool2

配置类代码:

@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //初始化一个redis模板
        RedisTemplate template = new RedisTemplate<>();
        //使用fastjson实现对于对象得序列化
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(om);

        //设置“值”的序列化方式
        template.setValueSerializer(serializer);
        //设置“hash”类型数据的序列化方式
        template.setHashValueSerializer(serializer);
        //设置“key"的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        //设置“hash的key”的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        //设置redis模板的工厂对象
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}
 
2. 实现代码 
@Resource
private RedisTemplate redisTemplate;

@Test
public void TestRedis() throws InstantiationException, IllegalAccessException {
	//拿到一个JavaBean
    UmbrellaBorrow umbrellaBorrow = umbrellaBorrowService.getById(1);
    //设置key
    String key="umbrella:"+"张三oR83j4kkq2CyvVmuxl6znKbrWi2A";
    String key2="umbrella:"+"李四oR83j4kkq2CyvVmuxl6znKbrWi2A";
    String key3="umbrella:"+"王五oR83j4kkq2CyvVmuxl6znKbrWi2A";
    //拿到redis操作对象
    HashOperations redisHash = redisTemplate.opsForHash();
    try {
        //存入redis中
        parseMap(key,redisHash,umbrellaBorrow);
        parseMap(key2,redisHash,umbrellaBorrow);
        parseMap(key3,redisHash,umbrellaBorrow);
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

private void parseMap(String key,HashOperations redisHash, Object bean) throws IllegalAccessException, InstantiationException, InvocationTargetException {
    //1. 获得所有的get方法
    List allGetMethod = getAllGetMethod(bean);
    //2. 遍历往redis中存入值
    for(Method m : allGetMethod){
        //截取属性名
        String field = m.getName().substring(3);
        //激活方法得到值
        Object value = m.invoke(bean)+"";//加一个空串是为了将LocalDataTime转换成字符串
        //往redis里存这些字段
        redisHash.put(key,field,value);
    }

}


private List getAllGetMethod(Object bean) {
    List getMethods = new ArrayList<>();
    Method[] methods = bean.getClass().getMethods();
    for (Method m : methods) {
        if (m.getName().startsWith("get")) {
            getMethods.add(m);
        }
    }
    return getMethods;
}
附录 ⭐哈希(hash)复习

Redis hash 是一个键值对集合。

Redis hash 是一个 String 类型的 fieldvalue 的映射表,hash 特别适合用于存储对象。类似 Java 里面的 Map

如何将对象存到Redis中呢?

第一种:将对象转换成一个JSON字符串,例如上图所示:user={id=1,name=“张三”,age=20}

缺点:无法直接操作这个对象,例如想将age加一,需要先反序列化 改好后再序列化回去。开销较大。太复杂,一般不用

第二种:通过用户key:id+对象属性标签,value:属性的方式存储

优点:方便对对象中的属性进行操作

缺点:数据太过分散,数据一多就显得十分混乱,一般我们也不用

第三种:通过hash映射存储,key:id,value:的形式

第三种方式是最适合存储对象的

常用命令:

hset :给 集合中的 键赋值 hget :从 集合 取出 valuehmset ...: 批量设置 hash 的值hexists :查看哈希表 key 中,给定域 field 是否存在hkeys :列出该 hash 集合的所有 fieldhvals :列出该 hash 集合的所有 valuehincrby :为哈希表 key 中的域 field 的值加上增量 1 -1hsetnx :将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在

数据结构:

Hash 类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。

field-value 长度较短且个数较少时,使用 ziplist,否则使用 hashtable

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号