1.快速入门
4.释放资源
<!--jedis依赖--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.7.0</version> </dependency>
public class JedisTest { private Jedis jedis; @BeforeEach public void setUp(){ //1.建立连接 jedis=new Jedis("192.168.181.135",6379); //2.设置密码 jedis.auth("123"); //3.选择库 jedis.select(0); } @Test public void testString(){ //存入数据 String result = jedis.set("name", "李四"); System.out.println("result:"+result); //取出数据 String name = jedis.get("name"); System.out.println("name:"+name); } @Test public void testHash(){ //插入数据 jedis.hset("stu1","name","ls"); jedis.hset("stu1","age","20"); //取出数据 Map<String, String> stu1 = jedis.hgetAll("stu1"); System.out.println("stu1:"+stu1); } @AfterEach void tearDown() { //否则有空指针异常的风险 if(jedis!=null){ jedis.close(); } } }
2.Jedis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式
public class JedisConnectionFactory { private static final JedisPool jedisPool; static { //配置连接池 JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(10); poolConfig.setMaxIdle(10); poolConfig.setMinIdle(0); poolConfig.setMaxWaitMillis(1000); //创建连接池对象 jedisPool=new JedisPool(poolConfig,"192.168.181.135",6379,1000,"123"); } public static Jedis getJedis(){ return jedisPool.getResource(); } }@BeforeEach public void setUp(){ //1.建立连接 //jedis=new Jedis("192.168.181.135",6379); jedis = JedisConnectionFactory.getJedis(); //2.设置密码 this.jedis.auth("123"); //3.选择库 this.jedis.select(0); }
3.SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis
提供了对不同Redis客户端的整合(Lettuce和Jedis)
支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
1.RedisTemplt快速入门
SpringDataRedis的使用步骤:
1.引入spring–boot–starter–data–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>
2.在application.yml配置Redis信息
spring: redis: host: 192.168.181.135 port: 6379 password: 123 lettuce: #用lettuce实现连接池 pool: max-active: 8 #最大连接数量 max-idle: 8 #最大空闲连接 min-idle: 0 #最小空闲连接 max-wait: 1000 #连接等待时间
3.注入RedisTemplate
@Autowired private RedisTemplate redisTemplate; @Test void testString (){ //写入一条String类型的数据 redisTemplate.opsForValue().set("name","lyl"); //读取出一条String类型的数据 Object name = redisTemplate.opsForValue().get("name"); System.out.println("name:"+name); }
2.SpringDataRedis的序列化方式
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:
缺点:
可读性差
我们可以自定义RedisTemplate的序列化方式,代码如下:
@Configuration public class RedisConfig { @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){ //创建RedisTemplate对象 RedisTemplate<String,Object> template=new RedisTemplate<>(); //设置连接工厂 template.setConnectionFactory(connectionFactory); //创建JSON序列化工具 GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); //设置key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); //设置value的序列化 template.setValueSerializer(genericJackson2JsonRedisSerializer); template.setHashKeySerializer(genericJackson2JsonRedisSerializer); //返回 return template; } }
为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。
3.使用StringRedisTemplate
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:
@SpringBootTest class RedisStringDemoApplicationTests { @Autowired private StringRedisTemplate stringRedisTemplate; @Test void contextLoads() { } @Test void testString (){ //写入一条String类型的数据 stringRedisTemplate.opsForValue().set("name","lyl"); //读取出一条String类型的数据 Object name = stringRedisTemplate.opsForValue().get("name"); System.out.println("name:"+name); } //Json工具 private static final ObjectMapper mapper=new ObjectMapper(); @Test void testStudent() throws JsonProcessingException { //准备对象 Student st = new Student("lll", 20); //手动序列化 String json = mapper.writeValueAsString(st); //写入一条数据 stringRedisTemplate.opsForValue().set("stu:3",json); //读取数据 String s = stringRedisTemplate.opsForValue().get("stu:3"); //手动反序列化 Student student = mapper.readValue(s, Student.class); System.out.println(s); System.out.println(student); } }
4.RedisTemplate的两种序列化实践方案:
方案一:
1.自定义RedisTemplate
2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
1.使用StringRedisTemplate
2.写入Redis时,手动把对象序列化为JSON
原文地址:https://blog.csdn.net/weixin_57219176/article/details/130508439
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_12427.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!