Redis的五种数据结构
一、字符串(String)
字符串是Redis最基本的数据结构,可以存储任意类型的数据,例如文本、数字等。Redis中的字符串是二进制安全的,可以进行基于字符串的操作,如设置、获取、修改、删除等。
-
应用场景: 单值缓存、对象缓存、计数器
-
存储结构
-
SpringBoot中基本操作
@Slf4j @RestController @RequestMapping("/redis/string") public class RedisStringController { @Resource private RedisTemplate redisTemplate; @GetMapping("/set") public void setString() { redisTemplate.opsForValue().set("key", 1); } @GetMapping("/get") public void getString() { Object key = redisTemplate.opsForValue().get("key"); log.info("{}", key); if (key.equals(1)) { log.info("111"); } if ((Integer) key == 1) { log.info("Integer类型"); } } @GetMapping("/delete") public void deleteString() { redisTemplate.delete("key"); } }
二、列表(List)
列表是一个有序的字符串集合,可以存储多个字符串元素。列表支持在头部或尾部进行元素的插入、删除、获取等操作,还支持根据索引进行访问和修该。列表可以用于实现队列、栈等数据结构。
-
应用场景: 公众号最新消息
-
存储结构
-
SpringBoot中基本操作
@RestController @Slf4j @RequestMapping("/redis/list") public class RedisListController { @Resource private RedisTemplate redisTemplate; @PostMapping("/push") public void pushList() { BoundListOperations listOps = redisTemplate.boundListOps("msg:1001"); listOps.leftPush("123"); listOps.leftPush("456"); listOps.rightPush("789"); //使用list集合 // List<String> list = new LinkedList<>(); // list.add("123"); // list.add("456"); // listOps.leftPushAll(list); } @PostMapping("/get") public void getList() { BoundListOperations listOps = redisTemplate.boundListOps("msg:1001"); Object index = listOps.index(0); log.info("获取指定索引位置的元素: {}", index); List range = listOps.range(0, listOps.size() - 1); log.info("获取所有元素: {}", range.toString()); } @PostMapping("/pop") public void popList() { BoundListOperations listOps = redisTemplate.boundListOps("msg:1001"); Object leftPop = listOps.leftPop(); log.info("从左弹出一个元素: {}", leftPop); Object rightPop = listOps.rightPop(); log.info("从右弹出一个元素: {}", rightPop); } @PostMapping("/del") public void delList() { redisTemplate.delete("msg:1001"); } }
三、哈希表(Hash)
哈希表是一个键值对的无序集合,其中每个键都是一个唯一的字符串,与一个值相关联。哈希表适用于存储对象,每个对象可以有多个属性。在哈希表中,可以对单个键或整个哈希表执行增删改查的操作。
-
应用场景: 对象缓存、购物车
-
存储结构
-
SpringBoot中基本操作
@Slf4j @RestController @RequestMapping("/redis/hash") public class RedisHashController { @Resource private RedisTemplate redisTemplate; @PostMapping("/set") public void setHash() { BoundHashOperations hashOps = redisTemplate.boundHashOps("user"); hashOps.put("1:username", "张三"); hashOps.put("1:password", "123"); //或者使用putAll // Map<String, String> map = new HashMap<>(); // map.put("1:username", "张三"); // map.put("1:password", "123"); // hashOps.putAll(map); log.info("set-string"); } @PostMapping("/get") public void getHash() { //获取所有key BoundHashOperations hashOps = redisTemplate.boundHashOps("user"); Set keys = hashOps.keys(); log.info("获取所有key: {}", keys.toString()); //获取所有value List values = hashOps.values(); log.info("获取所有value: {}", values.toString()); //根据key获取value Object o = hashOps.get("1:username"); log.info("根据key获取value: {}", o); //获取所有键值对集合 Map entries = hashOps.entries(); log.info("获取所有键值对集合: {}", entries.toString()); } @PostMapping("/find") public void findHash() { BoundHashOperations hashOps = redisTemplate.boundHashOps("user"); Boolean hasKey = hashOps.hasKey("1:username"); log.info("判断hash中是否存在该键值对: {}", hasKey); } @PostMapping("/del") public void delHash() { //删除key(小key) BoundHashOperations hashOps = redisTemplate.boundHashOps("user"); hashOps.delete("1:username"); //直接删除hash(大key) redisTemplate.delete("user"); } }
四、集合(Set)
集合是一组唯一的、无序的字符串元素的集合。集合支持添加、删除、判断元素是否存在等操作,还支持集合间的交集、并集、差集等集合运算操作。集合适用于对成员进行唯一性判断或快速查找。
-
应用场景: 抽奖、点赞、收藏、标签、微博等平台关注模型(共同好友、可能认识的人等)
-
存储结构
-
SpringBoot中基本操作
@RestController @Slf4j @RequestMapping("/redis/set") public class RedisSetController { @Resource private RedisTemplate redisTemplate; @PostMapping("/add") public void addSet() { BoundSetOperations setOps = redisTemplate.boundSetOps("act:101"); setOps.add("001", "002", "003"); } @PostMapping("/member") public void memberSet() { BoundSetOperations setOps = redisTemplate.boundSetOps("act:101"); List list = setOps.randomMembers(2); log.info("随机获取两个元素: {}", list.toString()); Set members = setOps.members(); log.info("获取所有的值: {}", members.toString()); } @PostMapping("/find") public void findSet() { BoundSetOperations setOps = redisTemplate.boundSetOps("act:101"); Boolean member = setOps.isMember("002"); log.info("判断元素是否存在于set中: {}", member); } @PostMapping("/remove") public void removeSet() { BoundSetOperations setOps = redisTemplate.boundSetOps("act:101"); Long remove = setOps.remove("002"); log.info("移除指定的元素个数: {}", remove); } @PostMapping("/del") public void delSet() { redisTemplate.delete("act:101"); } }
五、有序集合(ZSet)
有序集合是一个有序的字符串集合,每个字符串都与一个分数相关联。有序集合按照分数进行排序,可以根据分数范围或成员值进行范围查询。有序集合常用于排行榜、排序等场景。
-
应用场景: 排行榜、带权重的任务调度
-
存储结构
-
SpringBoot中基本操作
@RestController @Slf4j @RequestMapping("/redis/zset") public class RedisZSetController { @Resource private RedisTemplate redisTemplate; @GetMapping("/add") public void addZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); zSetOps.add("李四", 2); zSetOps.add("王五", 1); zSetOps.add("刘留", 3); zSetOps.add("赵六", 4); zSetOps.add("张三", 6); } @GetMapping("/range") public void rangeZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); Set range = zSetOps.range(0, -1); log.info("获取ZSet中所有的元素:{}", range); } @GetMapping("/rangeByScore") public void rangeByScoreZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); Set range = zSetOps.rangeByScore(2, 4); log.info("获取ZSet中指定score范围中的元素:{}", range); } @GetMapping("/size") public void sizeZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); Long size = zSetOps.size(); log.info("获取ZSet中元素的长度:{}", size); } @GetMapping("/incrementScore") public void incrementScoreZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); log.info("获取ZSet中增加前[张三]的score:{}", zSetOps.score("张三")); zSetOps.incrementScore("张三", 3); log.info("获取ZSet中增加后[张三]的score:{}", zSetOps.score("张三")); } @GetMapping("/count") public void countZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); Long count = zSetOps.count(2, 6); log.info("获取ZSet中指定score范围内的个数:{}", count); } @GetMapping("/remove") public void removeZSet() { BoundZSetOperations zSetOps = redisTemplate.boundZSetOps("hotspot:20230602"); log.info("获取ZSet中移除[李四]之前的元素:{}", zSetOps.range(0,-1)); zSetOps.remove("李四"); log.info("获取ZSet中移除[李四]之后的元素:{}", zSetOps.range(0,-1)); } }