Jedis
快速入门
引入依赖
<groupId>redis.chlients</groupId> <artifactId>jedis</xxx>
1.建立连接
void setUp(){ jedis = new Jedis("IP地址" ,6379); jedsi.auth("密码"); jedis.select("1"); //选择数据库 }
1.操作数据,测试String
void testString(){ String result = jedis.set("name","张三"); sout Sitrng name = jedis.get("name"); sout }
1.关闭连接
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.导入依赖
<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>
1.创建RedisTemplate对象
@Resource private RedisTemplate redisTemplate;
1.实现对数据的操作
@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
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; /** * 创建配置文件的原因: * 但我们进行写入操作时,在redis数据库中存储的确实一段\xAC\xED\x00\x05t\x00\x06\xE8\x99\x8E\xE5\x93\xA5 */ @Configuration public class RedisTemplateConfig { @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ //创建redisTemplate对象 RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>(); //连接工厂 redisTemplate.setConnectionFactory(redisConnectionFactory); //创建json序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); //设置key序列化 redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setHashKeySerializer(RedisSerializer.string()); //设置value序列化 redisTemplate.setValueSerializer(jsonRedisSerializer); redisTemplate.setHashValueSerializer(jsonRedisSerializer); //返回 return redisTemplate; } }
得到的结果
这样就是我们所需要的结果,但是与此同时,他却不满足内存的要求,因为他多了一个@Class:”second.pojo.user” 这是我们自己定义的接收数据的实体类。他将会占用很大的内存。所以我们就不能这么做。就需要再次进行升级
方案二:
- 使用StringRedisTemplate
- 写入Redis时,手动把对象序列化为JSON
- 读取Redis时,手动把读取到的JSON反序列化为对象
通过这样得到的结果才是我们真正需要的结果
而Spring官方也同样推出了一个更为好用的**StringRedisTemplate统一API来操作Redis**
如下:
@Resource private StringRedisTemplate stringRedisTemplate;
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 * } */ }