Redis快速入门
Redis快速入门,分两个客户端:Jedis和SpringDataRedis
使用Jdedis
1、引入依赖
1 | <!--jedis--><br><dependency><br> <groupId>redis.clients</groupId><br> <artifactId>jedis</artifactId><br> <version> 3.7 . 0 </version><br></dependency><br><!--单元测试--><br><dependency><br> <groupId>org.junit.jupiter</groupId><br> <artifactId>junit-jupiter</artifactId><br> <version> 5.7 . 0 </version><br> <scope>test</scope><br></dependency> |
2、创建测试类:
1 | import org.junit.jupiter.api.AfterEach;<br> import org.junit.jupiter.api.BeforeEach;<br> import org.junit.jupiter.api.Test;<br> import redis.clients.jedis.Jedis;<br> <br> import java.util.HashMap;<br> import java.util.Map;<br> <br> /**<br> * @author 凯哥Java<br>*/ <br> public class JedisTest {<br> <br> private Jedis jedis;<br> <br> @BeforeEach<br> public void initJedis(){<br> jedis = new Jedis( "192.168.50.135" , 6379 );<br> }<br> <br> @Test<br> public void testString(){<br> String result = jedis. set ( "name" , "kaige" );<br> System.out.println( "set Result" +result);<br> String nameValue = jedis. get ( "name" );<br> System.out.println( "v:" +nameValue);<br> }<br> <br> <br> @Test<br> public void hashTest(){<br> Map< String , String > value = new HashMap<>();<br> value.put( "id" , "1" );<br> value.put( "name" , "hset1" );<br> value.put( "age" , "23" );<br> Long result = jedis.hset( "persion_1" ,value);<br> System.out.println( "set Result" +result);<br> String age = jedis.hget( "persion_1" , "age" );<br> System.out.println( "age:" +age);<br> }<br> @AfterEach<br> void tearDown() {<br> if (jedis != null ) {<br> jedis.close();<br> }<br> }<br> <br>} |
说明:
如果生产环境就这么使用,会出问题的。jedis是线程不安全的,而且创建、销毁也是很消耗的。所以使用连接池方式:
创建连接池:
1 | import redis.clients.jedis.Jedis;<br> import redis.clients.jedis.JedisPool;<br> import redis.clients.jedis.JedisPoolConfig;<br> <br> /**<br> * @author 凯哥Java<br> * @description jedis连接池<br>*/ <br> public class JedisFactory {<br> <br> private static final JedisPool jedisPool;<br> <br> static {<br> JedisPoolConfig poolConfig = new JedisPoolConfig();<br> //最大连接数<br> poolConfig.setMaxTotal(8);<br> //最大空闲连接<br> poolConfig.setMaxIdle(8);<br> //等待市场<br> poolConfig.setMaxWaitMillis(1000);<br> //最小空闲连接<br> poolConfig.setMinIdle(0);<br> jedisPool = new JedisPool(poolConfig,"192.168.50.135",6379);<br> }<br> <br> public static Jedis getJedis(){<br> return jedisPool.getResource();<br> }<br> <br>} |
使用:
本文由凯哥Java(微信公众号:kaigejava),个人博客:www.kaigejava.com 发布于博客园
小福利
凯哥自己开发的,领取外卖、打车、咖啡、买菜、各大电商的优惠券的公¥众¥号:凯哥优惠淘。如下图:
二:springDataRedis
springData介绍:
springDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同类型中:
spring 默认使用的是lettuce客户端的。如果要使用jedis的话,需要自己引入相关依赖。
使用springdataRedis步骤:
1:引入依赖
1 | <!--Redis依赖--><br><dependency><br> <groupId>org.springframework.boot</groupId><br> <artifactId>spring-boot-starter-data-redis</artifactId><br></dependency><br><!--连接池依赖--><br><dependency><br> <groupId>org.apache.commons</groupId><br> <artifactId>commons-pool2</artifactId><br></dependency> |
2:配置Redis
application.yaml文件:
1 | spring:<br> redis:<br> host: 192.168 . 50.135 <br> port: 6379 <br> lettuce:<br> pool:<br> max-active: 8 <br> max-idle: 8 <br> min-idle: 0 <br> max-wait: 100ms |
3:写测试类:
需要注意:在测试类上,一定要写入@RunWith(SpringRunner.class)这个注解。如果不写,会报redisTemplate空指针异常。
执行完成之后,我们到Redis库中查看:
为什么存入进去的数据,是乱码的呢?而且,有一个name,是我们自己set的,乱码的这个是我们通过RedisTemplate插入的,我们来看看RedisTemplate源码
RedisTemplate需要设置序列化:
我们跟set源码,会发现,set是使用了value的序列化:
跟着源码,我们知道,默认使用的是jdk自带的序列化工具。
为了解决两个name(一个是正常的name,一个是乱码的name)问题,乱码的缺点:
1:可读性差
2:内存占用较大
我们可以自定义RedisTemplate的序列化方式,代码如下:
1 | import org.springframework.context.annotation.Bean;<br> import org.springframework.context.annotation.Configuration;<br> import org.springframework.data.redis.connection.RedisConnectionFactory;<br> import org.springframework.data.redis.core.RedisTemplate;<br> import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;<br> import org.springframework.data.redis.serializer.RedisSerializer;<br> <br> /**<br> * @author 凯哥Java<br>*/ <br>@Configuration<br> public class RedisConfig {<br> @Bean<br> public RedisTemplate< String , Object > redisTemplate(RedisConnectionFactory connectionFactory){<br> // 创建RedisTemplate对象<br> RedisTemplate<String, Object> template = new RedisTemplate<>();<br> // 设置连接工厂<br> template.setConnectionFactory(connectionFactory);<br> // 创建JSON序列化工具<br> GenericJackson2JsonRedisSerializer jsonRedisSerializer =<br> new GenericJackson2JsonRedisSerializer();<br> // 设置Key的序列化<br> template.setKeySerializer(RedisSerializer.string());<br> template.setHashKeySerializer(RedisSerializer.string());<br> // 设置Value的序列化<br> template.setValueSerializer(jsonRedisSerializer);<br> template.setHashValueSerializer(jsonRedisSerializer);<br> // 返回<br> return template;<br> }<br>} |
配置好自定义的之后,再次执行,就可以了。
通过自定义序列化之后,我们在Redis中存入一个user对象:
存入值,我们发现在Redis库中,对象中多了类全路径。
这样有个缺点:增加了额外的内存开销的。那么这个时候怎么办呢?
我们可以规定,在使用String类型的时候,存入对象的是,需要先将对象序列化,然后获取后,在将对象反序列即可。
本文来自博客园,作者:kaizi1992,转载请注明原文链接:https://www.cnblogs.com/kaigejava/p/17077731.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
2021-01-31 阿里云【七天深入MySQL实战营】