一、心法        

        Redis列表是简单的字符串列表,按照插入顺序排序。

"一对多"的特点。因此,我们可以迅速联想到,可以使用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。代码比较简单,大致运行效果如下:

第三节 List典型场景        跟着大宇学Redis--------目录帖_redis

第三节 List典型场景        跟着大宇学Redis--------目录帖_redis_02