redis常用数据类型: string hash list set zset
本文使用stringRedisTemplate作为测试对象
// string
stringRedisTemplate.opsForValue();
// hash
stringRedisTemplate.opsForHash();
// list
stringRedisTemplate.opsForList();
// set
stringRedisTemplate.opsForSet();
// zSet
stringRedisTemplate.opsForZSet();
string
/**
* 应用场景:用户基本信息等等,基本适用很多场景
* 数据结构是key value
*/
@GetMapping("value")
public void value(){
// 设置一个String类型的数据
stringRedisTemplate.opsForValue().set("user:001","张三");
// 设置一个String类型的数据,并家上过期时间
stringRedisTemplate.opsForValue().set("user:001","张三",600, TimeUnit.SECONDS);
// 获取String类型的数据
stringRedisTemplate.opsForValue().get("user:001");
// 设置过期时间
stringRedisTemplate.expire("user:001", 600, TimeUnit.SECONDS);
// 获取过期时间
stringRedisTemplate.getExpire("user:001");
// 删除String类型的数据
stringRedisTemplate.delete("user:001");
}
hash
/**
* 应用场景:电商购物车等
* 数据结构是 h hk hv
* h为用户id
* hk为商品id
* hv为商品数量
*/
@GetMapping("hash")
public void hash(){
// 使用缺点1: Hash无法为里面的hk元素设置过期时间,只能针对最外面的h设置过期时间
// 使用缺点2: 如果一个h过大的话,会有问题,全量查询的时候速度会很慢
// 添加一个商品,注意,如果key相同,后面的会覆盖前面的
stringRedisTemplate.opsForHash().put("user:001","10086","1");
stringRedisTemplate.opsForHash().put("user:001","10087","2");
// 获取一个商品数据
stringRedisTemplate.opsForHash().get("user:001", "10086");
// 商品数量 +1
stringRedisTemplate.opsForHash().increment("user:001","10086",1);
// 获取商品总数
stringRedisTemplate.opsForHash().size("user:001");
// 获取所有商品
stringRedisTemplate.opsForHash().entries("user:001");
// 删除Hash类型的数据
stringRedisTemplate.opsForHash().delete("user:001","10086");
}
list
/**
* 应用场景:消息队列
* list是一个个集合,redis支持可以从左边或者从右边添加元素
* k:用户id
* v:消息id
*/
@GetMapping("list")
public void list(){
// 从左边添加消息
stringRedisTemplate.opsForList().leftPush("user:007","message:10086");
stringRedisTemplate.opsForList().leftPush("user:007","message:10087");
// 从右边添加消息
stringRedisTemplate.opsForList().rightPush("user:007","message:10088");
// 批量插入
stringRedisTemplate.opsForList().leftPushAll("user:007","message:10088","message:10099","message:10010");
// 从左边获取一条消息
stringRedisTemplate.opsForList().leftPop("user:007");
// 从右边获取一条消息
stringRedisTemplate.opsForList().rightPop("user:007");
// 获取所有消息,从最左边的元素开始遍历
List<String> range1 = stringRedisTemplate.opsForList().range("user:007", 0, -1);
// 获取最新两条消息,从最左边开始获取两个消息
List<String> range = stringRedisTemplate.opsForList().range("user:007", 0, 1);
// 删除一条消息,如果有多条10086消息,会从左边删除第一条
stringRedisTemplate.opsForList().remove("user:007",1,"message10086");
// 删除所有10086的消息
stringRedisTemplate.opsForList().remove("user:007",0,"message10086");
}
set
/**
* 应用场景:抽奖模型 关注模型等
* set也是一个集合,不会存在重复的元素
*/
@GetMapping("set")
public void set(){
System.out.println("========抽奖模型============");
// 添加用户001 002 003到用户集合中
stringRedisTemplate.opsForSet().add("user","001","002","003");
// 获取所有的用户
stringRedisTemplate.opsForSet().members("user");
// 随机抽取一位用户,抽到后不会从集合中删除
stringRedisTemplate.opsForSet().randomMember("user");
// 随机抽取两位两户,抽到后不会从集合中删除
stringRedisTemplate.opsForSet().randomMembers("user", 2);
// 随机抽取一位用户,抽到后会从集合中删除
stringRedisTemplate.opsForSet().pop("user",1);
Long user = stringRedisTemplate.opsForSet().size("user");
System.out.println("========微信朋友圈点赞模型============");
// 用户001给朋友圈的消息点赞
stringRedisTemplate.opsForSet().add("message:1000","user:001");
// 用户001取消点赞
stringRedisTemplate.opsForSet().remove("message:1000","user:001");
// 查看用户是否点赞
Boolean member = stringRedisTemplate.opsForSet().isMember("message:1000", "user:001");
// 获取点赞列表
Set<String> members = stringRedisTemplate.opsForSet().members("message:1000");
System.out.println("========关注模型============");
// 有两个两户张三和王五,分别关注了自己喜欢明星的微博
stringRedisTemplate.opsForSet().add("user:张三","胡歌","刘亦菲","王一博","蔡徐坤");
stringRedisTemplate.opsForSet().add("user:王五","胡歌","刘亦菲","邓超","李晨");
// 求交集,共同关注模型(微信的朋友圈点赞也类似,好友发的朋友圈有很多人点赞,但是我只能看到共同好友的点赞和评论)
Set<String> intersect = stringRedisTemplate.opsForSet().intersect("user:张三", "user:王五");
// 求差集,可能认识的人模型 (王五跟张三是好友,那么张三认识的明星可能王五也认识)
Set<String> difference = stringRedisTemplate.opsForSet().difference("user:张三", "user:王五");
}
zSet
@GetMapping("zSet")
public void zSet(){
System.out.println("====ZSet集合和set是一样的,ZSet提供了集合的有序性===");
}
网友评论