spring boot中使用redis

学习了点redis的相关知识,记录一下。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
一、Redis常用数据类型
1、String:String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字。

 public Map testString() {
        Map map = Maps.newHashMap();
        stringRedisTemplate.opsForValue().set("1", "2");
        // 设置超时一分钟
        redisTemplate.opsForValue().set("55", "那", 1, TimeUnit.MINUTES);
        String s = stringRedisTemplate.opsForValue().get("1");
        String s1 = (String) redisTemplate.opsForValue().get("55");
        logger.info("中文打印" + s + ":" + s1);
        map.put("code", 200);
        return map;
    }

spring boot中使用redis_第1张图片
2、Hash
Hash的应用场景,比如我们要存储一个用户信息对象数据

 public Map testHash() {
        Map map = Maps.newHashMap();
        map.put("code", 200);
        HashOperations ops = stringRedisTemplate.opsForHash();
        String key = "user";
        if (!stringRedisTemplate.hasKey(key)) {
            ops.put(key, "姓名", "吴晨轩");
            ops.put(key, "年龄", "20");
            ops.put(key, "sex", "男");
            logger.info("set success");
        } else {
            logger.info("已经存在了 key is exist");
            Map entries = ops.entries(key);
            map.put("dat", entries);
        }
        return map;

    }

spring boot中使用redis_第2张图片
3、List
list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。

 public Map testList() {
        Map map = Maps.newHashMap();
        map.put("code", 200);
        ListOperations ops = stringRedisTemplate.opsForList();
        String key = "name";
        if (!stringRedisTemplate.hasKey(key)) {
            ops.leftPush(key, "吴");
            ops.leftPush(key, "宸");
            ops.leftPush(key, "煊");
            logger.info("set Success");
        } else {
            logger.info("key is exist");
            Long size = ops.size(key);
            // 从第几个到第几个读取
            List list = ops.range(key, 0, size);
            for (String value : list) {
                logger.info("中文大一" + value);
            }
        }
        return map;
    }

spring boot中使用redis_第3张图片
4、Set
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。

 public Map testSet() {
        Map map = Maps.newHashMap();
        map.put("code", 200);
        SetOperations ops = stringRedisTemplate.opsForSet();
        String key = "likes";
        if (!stringRedisTemplate.hasKey(key)) {
            Long add = ops.add(key, "sport", "bask", "test");
            logger.info("set成功了" + add);
            // 移除
            ops.remove("likes", "test");
        } else {
            Set members = ops.members(key);
            for (String value : members) {
                logger.info(value);
            }
        }
        return map;
    }

spring boot中使用redis_第4张图片
5、Sorted Set
sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

public Map testSetSort() {
        Map map = Maps.newHashMap();
        map.put("code", 200);
        ZSetOperations ops = stringRedisTemplate.opsForZSet();
        String key = "foods";
        if (!stringRedisTemplate.hasKey(key)) {
            ops.add(key, "fruite", 0);
            ops.add(key, "apple", 5);
            ops.add(key, "test", 3);
            ops.add(key, "read", 3);
        } else {
            Set sets = ops.rangeByScore(key, 0, 100);
            for (String value : sets) {
                logger.info(value);
            }
        }
        return map;
    }

spring boot中使用redis_第5张图片
二、Redis的高级应用
1.使用Redis解决分布式锁的问题
业务场景-抢购。一个典型的高并发问题,所需的最关键字段就是库存,在高并发的情况下每次都去数据库查询显然是不合适的,因此把库存信息存入Redis中,利用redis的锁机制来控制并发访问,是一个不错的解决方案。
设置锁:

 public Boolean setLock(String lockStr, Long lockTime) {
        // 给redis设置一个key,如果返回成功,说明拿到了锁。
        if (redisTemplate.opsForValue().setIfAbsent(String.format(ApiConstant.LOCK, lockStr), "1")) {
            // 给redis设置过期时间
            redisTemplate.expire(String.format(ApiConstant.LOCK, lockStr), lockTime, TimeUnit.SECONDS);
            return true;
        }
        return false;
    }

解锁:

 public Boolean unLock(String lockStr) {
        redisTemplate.delete(String.format(ApiConstant.LOCK, lockStr));
        return true;

    }

spring boot中使用redis_第6张图片
结合业务场景的博客介绍:https://www.cnblogs.com/lcxdevelop/p/8308926.html

你可能感兴趣的:(springboot,Redis)