Redis快速入门

Redis快速入门,分两个客户端:Jedis和SpringDataRedis

ae47afafee6b8c6f753eafea7fb856f7.png

使用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>}

使用:

cc9c66871c40a280bcc481fe85953a6a.png

本文由凯哥Java(微信公众号:kaigejava),个人博客:www.kaigejava.com 发布于博客园

小福利

凯哥自己开发的,领取外卖、打车、咖啡、买菜、各大电商的优惠券的公¥众¥号:凯哥优惠淘。如下图:

527c8a82983e56a30f4299fc76e1956a.png

 

 

二:springDataRedis

springData介绍:

d4bc5e13b92d57b9064c69cf36a2bb09.png

springDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同类型中:

3767ccf855085245c8f6b69ec61c5a7f.png

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:写测试类:

be8f475a47992a5630fe4da4d39b1307.png

需要注意:在测试类上,一定要写入@RunWith(SpringRunner.class)这个注解。如果不写,会报redisTemplate空指针异常。

执行完成之后,我们到Redis库中查看:

77d8228783454b7cc47dd8b09b86991d.png

为什么存入进去的数据,是乱码的呢?而且,有一个name,是我们自己set的,乱码的这个是我们通过RedisTemplate插入的,我们来看看RedisTemplate源码

RedisTemplate需要设置序列化:

cccaf00acc58fcb9f8c19ac7e3087b53.png

我们跟set源码,会发现,set是使用了value的序列化:

4518ddf00cde8993f01966a2dcd339b5.png

跟着源码,我们知道,默认使用的是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<StringObject> 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对象:

97565123b146e6327d6c52fd8d9b8ae8.png

233d453949c817b108d2742d3f122a19.png

存入值,我们发现在Redis库中,对象中多了类全路径。

这样有个缺点:增加了额外的内存开销的。那么这个时候怎么办呢?

我们可以规定,在使用String类型的时候,存入对象的是,需要先将对象序列化,然后获取后,在将对象反序列即可。

 

posted @   kaizi1992  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
历史上的今天:
2021-01-31 阿里云【七天深入MySQL实战营】
点击右上角即可分享
微信分享提示