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存储的数据是唯一的,其底层的数据结构是哈希表&