redis 常用命令

整合spring data redis
Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,它依赖于 spring-data-redis 和 lettuce。
Lettuce:是一个可伸缩线程安全的 Redis 客户端,多个线程可以共享同一个 RedisConnection,它利用优秀 Netty NIO 框架来高效地管理多个连接。
Spring Data Redis:是 Spring Data 项目中的一个主要模块,实现了对 Redis 客户端 API 的高度封装,使对 Redis 的操作更加便捷。
引入依赖包
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-data-redis</artifactId> |
| </dependency> |
| <dependency> |
| <groupId>org.apache.commons</groupId> |
| <artifactId>commons-pool2</artifactId> |
| </dependency> |
引入 commons-pool 2 是因为 Lettuce 需要使用 commons-pool 2 创建 Redis 连接池。
application 配置
| spring: |
| redis: |
| database: 0 |
| host: 192.168.161.3 |
| port: 6379 |
| password: 123456 |
| lettuce: |
| pool: |
| max-active: 8 |
| max-wait: -1 |
| max-idle: 8 |
| min-idle: 0 |
redis模板封装类
StringRedisTemplate 与 RedisTemplate 的封装的 Reids 操作要比我们第二节讲的自己调用 Jedis 的 API 的方式更优雅了一步。
redis模板封装类
| redisTemplate.opsForValue(); |
| redisTemplate.opsForHash(); |
| redisTemplate.opsForList(); |
| redisTemplate.opsForSet(); |
| redisTemplate.opsForZSet(); |
依赖注入
| public class Example { |
| |
| |
| @Autowired |
| private RedisTemplate<String, String> template; |
| |
| |
| } |
代码测试
准备数据对象
| @Data |
| public class Person implements Serializable { |
| |
| private static final long serialVersionUID = -8985545025228238754L; |
| |
| String id; |
| String firstname; |
| String lastname; |
| Address address; |
| |
| public Person(String firstname, String lastname) { |
| this.firstname = firstname; |
| this.lastname = lastname; |
| } |
| } |
| @Data |
| public class Address implements Serializable { |
| |
| private static final long serialVersionUID = -8985545025228238771L; |
| |
| String city; |
| String country; |
| |
| public Address(String city, String country) { |
| this.city = city; |
| this.country = country; |
| } |
| } |
使用redisTemplate
| @RunWith(SpringRunner.class) |
| @SpringBootTest |
| public class RedisConfigTest { |
| @Autowired |
| private StringRedisTemplate stringRedisTemplate; |
| |
| @Autowired |
| private RedisTemplate redisTemplate; |
| |
| @Resource(name = "redisTemplate") |
| private ValueOperations<String,Object> valueOperations; |
| |
| @Resource(name = "redisTemplate") |
| private HashOperations<String, String, Object> hashOperations; |
| |
| @Resource(name = "redisTemplate") |
| private ListOperations<String, Object> listOperations; |
| |
| @Resource(name = "redisTemplate") |
| private SetOperations<String, Object> setOperations; |
| |
| @Resource(name = "redisTemplate") |
| private ZSetOperations<String, Object> zSetOperations; |
| |
| |
| |
| |
| |
| |
}
value存储对象
| @Test |
| public void testValueObj() throws Exception{ |
| Person person = new Person("boke","byrant"); |
| person.setAddress(new Address("南京","中国")); |
| |
| valueOperations.set("player:1",person,20,TimeUnit.SECONDS); |
| Person getBack = (Person)valueOperations.get("player:1"); |
| System.out.println(getBack); |
| } |
集合存储对象
| @Test |
| public void testSetOperation() throws Exception{ |
| Person person = new Person("boke","byrant"); |
| Person person2 = new Person("curry","stephen"); |
| setOperations.add("playerset",person,person2); |
| Set<Object> result = setOperations.members("playerset"); |
| System.out.println(result); |
| } |
| |
| |
hash集合存储对象
| @Test |
| public void HashOperations() throws Exception{ |
| Person person = new Person("boke","byrant"); |
| hashOperations.put("hash:player","firstname",person.getFirstname()); |
| hashOperations.put("hash:player","lastname",person.getLastname()); |
| hashOperations.put("hash:player","address",person.getAddress()); |
| System.out.println(hashOperations.get("hash:player","firstname")); |
| } |
List 存储对象
| @Test |
| public void ListOperations() throws Exception{ |
| listOperations.leftPush("list:player",new Person("boke","byrant")); |
| listOperations.leftPush("list:player",new Person("Jordan","Mikel")); |
| listOperations.leftPush("list:player",new Person("curry","stephen")); |
| |
| System.out.println(listOperations.leftPop("list:player")); |
| } |
解决key-value乱码问题
| @Configuration |
| public class RedisConfig { |
| @Bean |
| public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { |
| RedisTemplate redisTemplate = new RedisTemplate(); |
| redisTemplate.setConnectionFactory(redisConnectionFactory); |
| Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); |
| |
| ObjectMapper objectMapper = new ObjectMapper(); |
| objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); |
| objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); |
| |
| jackson2JsonRedisSerializer.setObjectMapper(objectMapper); |
| |
| |
| redisTemplate.setKeySerializer(new StringRedisSerializer()); |
| redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); |
| redisTemplate.setHashKeySerializer(new StringRedisSerializer()); |
| redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); |
| |
| redisTemplate.afterPropertiesSet(); |
| return redisTemplate; |
| } |
| } |
乱码问题的症结在于对象的序列化问题,RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。
同时要注意Redis 字符编码集设置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具