redis 数据类型

66 阅读2分钟

redis 存储数据五大数据类型: 分别为String List HashMap Set ZSet

1 String
使用场景可以很丰富,json数据可以存入,那么其实再不考虑性能的情况下,此种数据类型兼容了各种数据;
使用方法也很简单,直接set,然后可以设置过期时间等,过期时间很重要,它可以实现例如,订单超时,分布式锁等,防止由于reids服务挂掉而使得应该过期的key未被程序删除,而造成业务逻辑混乱

2 List
使用场景一般是用来存储多个简单数据; 还可以用来做类似任务队列的一个工具;
使用方法如下

/**
     * @Description list的优势在于,可以模拟一个双向队列,甚至可以用来做任务/消息队列等
     * @Author FL
     * @Date 11:33 2022/4/24
     * @Param []
     **/
    @Test
    void redisList(){
        String list_key = "list_key";

        //remove(K key, long count, Object value)
        // 从存储在键中的列表中删除等于值的元素的第一个计数事件。count> 0:
        // 删除等于从左到右移动的值的第一个元素;count< 0:删除等于从右到左移动的值的第一个元素;
        // count = 0:删除等于value的所有元素。

//        redisTemplate.opsForList().remove(list_key,-1,3);

        redisTemplate.opsForList().leftPush(list_key,1);
        redisTemplate.opsForList().leftPush(list_key,2);
        redisTemplate.opsForList().leftPushAll(list_key,Arrays.asList(3,4,5));

        System.out.println(redisTemplate.opsForList().rightPop(list_key));

        List range = redisTemplate.opsForList().range(list_key, 0, -1);
        System.out.println("==========");
        for (Object o : range) {
            System.out.println(o);
        }
    }

3 HashMap
使用场景的话,个人认为更适合存储对象,对比String类型的数据,优势明显; 例如存储为一个用户对象,我想更改对象的最后登录时间,那么Sting,需要进行序列化,然后设置值,再次序列化存储到redis中,而HashMap则可以直接获取到相应的字段,修改,减少了两次io操作,可以提高下性能

/**
     * @Description redis的Map类型存储的优点是 在修改信息的时候,可以直接修改,相对于
     * String 类型的存储, String类型需要序列化,修改后并反序列化回去,hashmap减少了io,增加了redis的性能
     * @Author FL
     * @Date 10:59 2022/4/24
     * @Param []
     **/
    @Test
    void redisMap() {
        String mapKey = "mapkey";

        Area area = new Area();
        area.setCode("1111");
        area.setName("名称");
        area.setExtend("扩展");
        Map<String, Object> hk = BeanUtil.beanToMap(area);
        redisTemplate.opsForHash().putAll(mapKey, hk);

        redisTemplate.opsForHash().put(mapKey, "code", "222");
        System.out.println(redisTemplate.opsForHash().get(mapKey, "code"));

        Set<Map.Entry<String, Object>> entrySet = hk.entrySet();
        List<String> collect = entrySet.stream().map(Map.Entry::getKey).collect(Collectors.toList());
        System.out.println(redisTemplate.opsForHash().multiGet(mapKey, collect));

         redisTemplate.opsForHash().delete(mapKey, "id");

//        Set keys = redisTemplate.boundHashOps(mapKey).keys();
//        List values = redisTemplate.boundHashOps(mapKey).values();
//        for (Object key : keys) {
//            System.out.println(key);
//        }
//        for (Object value : values) {
//            System.out.println(value);
//        }

    }

4 Set
应用场景例如数据去重,还有可以获取两个集合的差集,或者交集等

/**
     * @Description 自带数据去重,可以取两个集合的差集,交集
     * @Author FL
     * @Date 11:51 2022/4/24
     * @Param []
     **/
    @Test
    void redisSet(){
        String set_key1 = "set_key1";
        String set_key = "set_ke";
        redisTemplate.opsForSet().add(set_key,1);
        redisTemplate.opsForSet().add(set_key,2);
        redisTemplate.opsForSet().add(set_key,3);

        redisTemplate.opsForSet().add(set_key1,4);
        redisTemplate.opsForSet().add(set_key1,2);
        redisTemplate.opsForSet().add(set_key1,3);


//        Set members = redisTemplate.opsForSet().members(set_key);
//        for (Object member : members) {
//            System.out.println(member);
//        }

        // 取交集
        Set difference = redisTemplate.opsForSet().intersect(set_key, set_key1);
        for (Object o : difference) {
            System.out.println(o);
        }
    }

5 ZSet
应用场景与set类似,不过增加了对于数据的排序功能


/**
* @Description zset,去重,然后可以根据分数(权重),进行一个排序
* @Author FL
* @Date 10:40 2022/4/25
* @Param []
**/
@Test
void redisZSet(){
String zset_key = "zset_key";

    redisTemplate.opsForZSet().add(zset_key, 100,10);
    redisTemplate.opsForZSet().add(zset_key, 101,12);
    redisTemplate.opsForZSet().add(zset_key, 102,8);

    Set set = redisTemplate.opsForZSet().reverseRange(zset_key, 0, 20);
    for (Object o : set) {
        System.out.println(o);
    }


}


具体代码在 test项目中

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。