当前位置: 首页 > news >正文

Redis 缓存基础数据类型详解

Redis 是一个高性能的键值存储系统,支持多种数据结构。以下是 Redis 支持的 5 种基础数据类型及其在 Spring 中的应用:

1. String(字符串)

特点

  • 最基本的数据类型,二进制安全

  • 最大能存储 512MB

  • 可用于缓存整数值、字符串或序列化对象

Spring 操作示例

// 设置值
redisTemplate.opsForValue().set("user:1:name", "张三");
redisTemplate.opsForValue().set("site:visits", "1000");

// 获取值
String userName = redisTemplate.opsForValue().get("user:1:name");
Long visits = Long.parseLong(redisTemplate.opsForValue().get("site:visits"));

// 原子性操作
redisTemplate.opsForValue().increment("site:visits"); // 自增1
redisTemplate.opsForValue().decrement("product:1:stock"); // 自减1
 

2. Hash(哈希)

特点

  • 适合存储对象

  • 每个 hash 可以存储 2³² - 1 个键值对

  • 比 String 类型更节省内存(针对对象存储)

Spring 操作示例

// 存储对象
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "李四");
userMap.put("age", "28");
userMap.put("email", "lisi@example.com");
redisTemplate.opsForHash().putAll("user:2", userMap);

// 获取单个字段
String name = (String) redisTemplate.opsForHash().get("user:2", "name");

// 获取所有字段
Map<Object, Object> entries = redisTemplate.opsForHash().entries("user:2");

// 修改单个字段
redisTemplate.opsForHash().put("user:2", "age", "29");
 

3. List(列表)

特点

  • 有序的字符串列表

  • 按照插入顺序排序

  • 适合做消息队列、最新消息排行等

Spring 操作示例

// 从左侧插入
redisTemplate.opsForList().leftPush("news:latest", "新闻1");
redisTemplate.opsForList().leftPushAll("news:latest", "新闻2", "新闻3");

// 获取范围
List<String> latestNews = redisTemplate.opsForList().range("news:latest", 0, 9);

// 从右侧弹出
String news = redisTemplate.opsForList().rightPop("news:latest");

// 获取列表长度
Long size = redisTemplate.opsForList().size("news:latest");

4. Set(集合)

特点

  • 无序的字符串集合

  • 元素唯一不重复

  • 支持交集、并集、差集等操作

Spring 操作示例

// 添加元素
redisTemplate.opsForSet().add("user:1:follows", "user2", "user3", "user4");

// 获取所有成员
Set<String> follows = redisTemplate.opsForSet().members("user:1:follows");

// 判断是否成员
boolean isMember = redisTemplate.opsForSet().isMember("user:1:follows", "user2");

// 集合运算
Set<String> commonFollows = redisTemplate.opsForSet().intersect("user:1:follows", "user:2:follows");

5. ZSet(有序集合)

特点

  • 有序且不重复的集合

  • 每个元素关联一个double类型的分数(score)

  • 适合做排行榜、带权重的队列

Spring 操作示例

java

// 添加元素
redisTemplate.opsForZSet().add("leaderboard", "player1", 100);
redisTemplate.opsForZSet().add("leaderboard", "player2", 85);

// 获取排名
Set<String> topPlayers = redisTemplate.opsForZSet().reverseRange("leaderboard", 0, 9);

// 获取分数
Double score = redisTemplate.opsForZSet().score("leaderboard", "player1");

// 增加分数
redisTemplate.opsForZSet().incrementScore("leaderboard", "player1", 10);
 

Spring 中 Redis 的配置

@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        
        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), 
                                   ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        
        template.setValueSerializer(serializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }
}
 

实际应用场景

  1. String:缓存单个对象、计数器、分布式锁

  2. Hash:存储对象属性、购物车

  3. List:消息队列、最新列表

  4. Set:标签系统、共同好友

  5. ZSet:排行榜、延迟队列

选择合适的数据类型可以显著提高Redis的性能和内存使用效率。

相关文章:

  • Qt5.14.2+mingw64编译OpenCV3.4.14一次成功记录
  • 一欧元滤波器算法
  • 10、Linux C 网络编程(完整版)
  • Odoo透视图中添加自定义按钮执行后台方法
  • Python学习(二)操作列表
  • 字体格式如何解析(open-type)
  • Mysql 字段值批量自增或自减(坐标系数据,(x,y))
  • 43页可编辑PPT | 大数据管理中心设计规划方案大数据中心组织架构大数据组织管理
  • ⑧RBM(主备/主主)-二层部署案例
  • Web3.0隐私计算与云手机的结合
  • AI Agent 中的 MCP 模型上下文协议详解
  • 基于Matlab实现DCT数字水印添加提取和干扰测试
  • scGPT环境安装
  • 2025年企业级开源治理实践与思考
  • 边缘计算网关是什么?
  • JavaScript 深拷贝:手写一个简单可靠的 `deepClone` 函数
  • 2025华为软件精英挑战赛2600w思路分享
  • 互联网 Java 面试八股文汇总(2025 最新整理,持续更新)
  • 装饰器模式详解
  • 智能体项目实现AI对话流式返回效果
  • 第一集|《刑警的日子》很生活,《执法者们》有班味
  • 欧盟公布关税反制清单,瞄准美国飞机、汽车等产品
  • 奥园集团将召开债券持有人会议,拟调整“H20奥园2”本息兑付方案
  • 青岛双星名人集团管理权之争:公司迁址,管理层更迭
  • 美联储主席:不打算先发制人地降息,将继续观望
  • 成立6天的公司拍得江西第三大水库20年承包经营权,当地回应