Jedis
快速入门
- 引入依赖
1 2
| <groupId>redis.chlients</groupId> <artifactId>jedis</xxx>
|
- 建立连接
1 2 3 4 5 6
| void setUp(){ jedis = new Jedis("IP地址" ,6379); jedsi.auth("密码"); jedis.select("1"); }
|
- 操作数据,测试String
1 2 3 4 5 6
| void testString(){ String result = jedis.set("name","张三"); sout Sitrng name = jedis.get("name"); sout }
|
- 关闭连接
1 2 3 4 5
| void tearDown(){ if(jedis != null){ jedis.close(); } }
|
springDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成
其中对Redis的集成模块就叫做SpringDataRedis
官网地址:https://spring.io/projects/spring-data-redis
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
RedisTemplate工具类
使用RedisTemplate统一API来操作Redis
- 导入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
|
- 创建RedisTemplate对象
1 2
| @Resource private RedisTemplate redisTemplate;
|
- 实现对数据的操作
1 2 3 4 5 6 7 8
| @Test void testString() { redisTemplate.opsForValue().set("name","虎哥");
Object name = redisTemplate.opsForValue().get("name"); System.out.println(name); }
|
得到的结果:
需要解决的问题
因为使用redisTemplate.opsForValue().set(“name”,”虎哥”);得到的不是一个String 类型的字符串,而使一个Object对象
所以存入的就会是java对象,那么就需要对对象进行序列化,从而得到我们需要的类型
解决RedisTemplate序列化的两种方案
方案一:
- 自定义RedisTemplate
- 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package second.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.RedisSerializer;
@Configuration public class RedisTemplateConfig {
@Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory);
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setHashKeySerializer(RedisSerializer.string());
redisTemplate.setValueSerializer(jsonRedisSerializer); redisTemplate.setHashValueSerializer(jsonRedisSerializer); return redisTemplate; } }
|
得到的结果
这样就是我们所需要的结果,但是与此同时,他却不满足内存的要求,因为他多了一个@Class:”second.pojo.user” 这是我们自己定义的接收数据的实体类。他将会占用很大的内存。所以我们就不能这么做。就需要再次进行升级
方案二:
- 使用StringRedisTemplate
- 写入Redis时,手动把对象序列化为JSON
- 读取Redis时,手动把读取到的JSON反序列化为对象
通过这样得到的结果才是我们真正需要的结果
而Spring官方也同样推出了一个更为好用的**StringRedisTemplate统一API来操作Redis**
如下:
1 2
| @Resource private StringRedisTemplate stringRedisTemplate;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public ObjectMapper mapper = new ObjectMapper(); @Test void getTest() throws JsonProcessingException { user usr1 = new user("小花", 21); //手动序列化 : 将java对象转换为json String s = mapper.writeValueAsString(usr1); //进行操作 stringRedisTemplate.opsForValue().set("user:300",s); System.out.println("s==" + s); //读取数据 String s1 = stringRedisTemplate.opsForValue().get("user:300"); user user = mapper.readValue(s1, user.class); System.out.println("数据为 : " + user); /** * 得到的数据(在redis中存储的) : * { * "name": "小花", * "age": 21 * } */ }
|