01.Redis中间件实战1

时间:2024-02-20 17:45:57

Redis中间件实战1

Redis各种数据结构实战

字符串

需求:将用户信息存储至缓存中,实现每次前端请求获取用户个人详情时直接从缓存中获取。来演示字符串的写入与读取。
技术方案:为了实现这个需求,首先需要建立用户对象实体,里面包含用户个人的各种信息,包括ID、年龄、姓名、用户名及住址等,
然后采用RedisTemplate操作组件将这一用户对象序列化为字符串信息并写入缓存中,最后从缓存中读取即可。

public class Person implements Serializable {

    private int id;

    private int age;

    private String name;

    private String address;

    public Person() {

    }

    public Person(int id, int age, String name, String address) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.address = address;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

创建controller

@RestController
@RequestMapping(value = "/string")
public class StringController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private ObjectMapper mapper;

    private static Logger logger = LoggerFactory.getLogger(StringController.class);

    @GetMapping(value = "/one")
    public void one() throws Exception{
        Person p1 = new Person(95001,23,"孙悟空","花果山水帘洞");
        // 定义key与即将存入缓存中的value
        final String key = "redis:string:1";
        // JSON序列化
        String value = mapper.writeValueAsString(p1);
        // 写入缓存中
        logger.info("存入缓存中的用户实体对象信息为:{}",p1);

        //使用set命令写入缓存中
        redisTemplate.opsForValue().set(key,value);

        // 从缓存中获取用户的信息
        final Object object = redisTemplate.opsForValue().get(key);

        if (object != null) {
            Person p = mapper.readValue(object.toString(),Person.class);
            logger.info("从缓存中读取信息:{}",p);
        }
    }
    
    @GetMapping(value = "/get")
    public Person one(String key) throws Exception{
         // 从缓存中获取用户的信息
         final Object object = redisTemplate.opsForValue().get(key);
         if (object != null) {
             Person p = mapper.readValue(object.toString(),Person.class);
             logger.info("从缓存中读取信息:{}",p);
             return p;
         }
         return null;
    }
}

测试
http://localhost:9090/swagger-ui.html

列表

Redis的列表类型跟java的List类型很类似,用于存储一系列具有相同类型的数据。其底层对于数据的存储和读取
可以理解为一个数据队列,往List中添加数据的时候,即相当于往队列中的某个位置插入数据;而从List中
获取数据相当于从队列中某个位置获取数据。

需求:
将一组已经排好序的用户对象列表存储在缓存中,按照排名的先后顺序获取出来并输出到控制台上。
技术方案:
首先需要定义一个已经排好序的用户对象的列表,然后将其存储到Redis的List中,最后按照排名的先后顺序
将每个用户实体获取出来。
代码实现:
创建controller

@RestController
@RequestMapping(value = "/list")
public class ListController {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private ObjectMapper mapper;
    private static Logger logger = LoggerFactory.getLogger(ListController.class);
    @GetMapping(value = "/one")
    public void one() {
        List<Person> pList = new ArrayList<>();

        pList.add(new Person(1,20,"孙悟空","花果山水帘洞"));
        pList.add(new Person(1,30,"猪八戒","高老庄"));
        pList.add(new Person(1,40,"沙悟净","流沙河"));
        pList.add(new Person(1,50,"唐三藏","东土大唐"));

        logger.info("构造已经排好序的用户对象列表对象:{}",pList);

        // 将列表数据存储到Redis中的List中
        final String key = "redis:list:1";
        ListOperations listOperations = redisTemplate.opsForList();

        for (Person p:pList) {
            // 往列表中添加数据-从队尾添加
            listOperations.leftPush(key,p);
        }

        // 获取Redis列表中的数据-从队头中遍历获取,直到没有元素为止。
        logger.info("获取Redis中list的数据-从队头中获取");
        Object res = listOperations.rightPop(key);
        Person tmp = null;
        while (res != null) {
            tmp = (Person)res;
            logger.info("当前数据:{}",tmp.getName());
            res = listOperations.rightPop(key);
        }
    }
}

日志

2024-02-05 15:04:20.782  INFO 13724 --- [nio-9090-exec-1] c.a.redis.controller.ListController      : 构造已经排好序的用户对象列表对象:[com.airycode.redis.bean.Person@4900d96f, com.airycode.redis.bean.Person@2fe9acc6, com.airycode.redis.bean.Person@512f8c42, com.airycode.redis.bean.Person@32385a70]
2024-02-05 15:04:20.823  INFO 13724 --- [nio-9090-exec-1] c.a.redis.controller.ListController      : 获取Redis中list的数据-从队头中获取
2024-02-05 15:04:20.850  INFO 13724 --- [nio-9090-exec-1] c.a.redis.controller.ListController      : 当前数据:孙悟空
2024-02-05 15:04:20.853  INFO 13724 --- [nio-9090-exec-1] c.a.redis.controller.ListController      : 当前数据:猪八戒
2024-02-05 15:04:20.856  INFO 13724 --- [nio-9090-exec-1] c.a.redis.controller.ListController      : 当前数据:沙悟净
2024-02-05 15:04:20.859  INFO 13724 --- [nio-9090-exec-1] c.a.redis.controller.ListController      : 当前数据:唐三藏

总结:
在实际的应用场景中,Redis的列表类型特别适用于排名,排行榜,近期访问数据列表等业务场景
是一种很实用的存储类型

集合

Redis的集合类型跟高等数学中学习的集合类似,用于存储具有相同的类型或特性的不重复的数据
,即Redis中的集合Set存储的数据是唯一的,其底层的数据结构是哈希表&