第三节 List典型场景
一、心法
Redis列表是简单的字符串列表,按照插入顺序排序。
可以从Redis的List类型的数据结构来考虑其实际业务场景。Redis的List这种数据结构与Java中的List集合大致不离其宗。实际上就是一个容器来存放多组数据。从其数据结构的特点上来看,符合"一对多"的特点。因此,我们可以迅速联想到,可以使用Redis来缓存"一对多"的热点数据。例如,在电商系统中,可以用于缓存某个用户的历史订单,又比如可以缓存多个收货地址。
从我自己的公司角度的业务上来看。可以使用Redis的List来做例如 "班级-学生"、"学院-专业"、"年级-学院"等一对多的业务场景。因此,对于Redis的List这种数据结构而言,只要牢牢记住,当出现一对多的场景时,可以考虑使用List这种Redis数据结构来做热点数据的缓存。
二、代码简单过一下
下面是我自己做的一个Redis简单工具类,本质上就是操作RedisTemplate。好多命令可以参考网上的Redis命令大全,这里不做赘述。如果有需要,查询一下API文档即可。基本上每个接口都有对应的API。
package com.tyzhou.redis.service.impl;
import com.tyzhou.redis.service.ListRedisService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author zhoutianyu
* @date 2020/2/9
* @time 13:23
*/
@Service
public class ListRedisServiceImpl implements ListRedisService {
private static final Logger LOGGER = LoggerFactory.getLogger(ListRedisServiceImpl.class);
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void push(String key, Object value) {
getListOperations().rightPush(key, value);
}
@Override
public List<Object> range(String key) {
Long size = getListOperations().size(key);
if (size != null && size > 0) {
//对应LRANGE key start stop,这里获取所有指定key的List
return getListOperations().range(key, 0, size);
}
return null;
}
@Override
public Object index(int index, String key) {
return getListOperations().index(key, index);
}
@Override
public void remove(String key, Object object) {
/**
* count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT
*/
getListOperations().remove(key, 1, object);
}
private ListOperations<String, Object> getListOperations() {
return redisTemplate.opsForList();
}
}
我这里假设某个用户的userId是20200202,然后为它插入了它喜欢的几本书。最后再根据这个人的userId去Redis中查询这个List。代码比较简单,大致运行效果如下: