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 {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate 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与即将存入缓存中的valuefinal 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 {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate 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存储的数据是唯一的,其底层的数据结构是哈希表&