结构
maven导包 pom.xml
依赖项主要添加如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.yml
server:
port: 8080
spring:
redis:
host: 127.0.0.1
port: 6379
datasource:
url: jdbc:mysql://localhost:3306/a_01
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
redis 配置类编写
在进行redis使用时,需要对其进行序列化
序列化理由
- 数据转换:
Redis是一个键值存储系统,它本身并不理解Java对象或其他编程语言中的复杂数据结构。序列化器的作用就是将Java对象转换成Redis能够理解和存储的格式(如字符串、二进制数据等),以及将Redis中的数据转换回Java对象。这是实现Java应用与Redis之间数据交换的基础。- 数据一致性: 使用合适的序列化器可以确保在Java应用中序列化的对象与从Redis中反序列化的对象保持一致。这对于保持数据的完整性和准确性至关重要,尤其是在分布式系统中。
- 性能优化: 不同的序列化器在序列化和反序列化的效率上可能有所不同。选择适合应用场景的序列化器可以优化性能,减少数据转换所需的时间和资源。
- 灵活性: Spring Data Redis提供了多种序列化器供选择,如StringRedisSerializer、Jackson2JsonRedisSerializer、GenericJackson2JsonRedisSerializer等。这些序列化器支持不同的数据类型和格式,使得开发者可以根据具体需求灵活配置。
- 支持复杂对象: 对于需要存储复杂对象(如自定义类实例)的场景,使用如Jackson2JsonRedisSerializer这样的序列化器可以将对象序列化为JSON字符串,从而方便地在Redis中存储和检索。
- 兼容性: 通过配置序列化器,可以确保在不同版本的Java应用或不同语言的应用之间共享Redis数据时保持兼容性。只要遵循相同的序列化规则,不同应用就能正确地解析和存储数据。
RedisConfig.java
package com.wunaiieq.tmp_redis_20241217.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
/**
* 创建RedisTemplate:用于执行Redis操作的方法
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate= new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
//设置通用序列化器
//对于其他的列表集合等的类型,不需要额外设置序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer()); //key设置为String的序列化方式
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //value设置为JSON的序列化方式
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
Service方法
对常用的CRUD方法按数据类型进行了封装
package com.wunaiieq.tmp_redis_20241217.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**Hash类型**/
public boolean hset(String key, String field, Object value, long seconds) {
try {
redisTemplate.opsForHash().put(key, field, value);
expire(key, seconds); // 假设有一个通用的expire方法
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public Object hget(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
private void expire(String key, long seconds) {
redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
}
/**List类型**/
public boolean lrpush(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public List<Object> getList(String key, int start, int end) {
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**Set类型**/
public long sset(String key, Object... values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public long sgetSize(String key) {
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
public Set<Object> sgetAll(String key) {
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**String类型**/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public Object get(String key) {
return key == null ? null : redisTemplate.opsForValue().get(key);
}
public boolean setex(String key, Object value, long expire) {
try {
redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**ZSet类型**/
public boolean zadd(String key, Object member, double score) {
try {
return redisTemplate.opsForZSet().add(key, member, score);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public Set<String> zrange(String key, int start, int end) {
try {
Set<Object> range = redisTemplate.opsForZSet().range(key, start, end);
if (range == null || range.isEmpty()) {
return null;
}
return range.stream().map(Object::toString).collect(Collectors.toSet());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
调用示例
@Test
public void test() {
Student student = new Student(1, "wunaiieq");
stringRedisService.set("k1", student);
}