Redis客户端RedisTemplate入门学习

Redis的Java客户端

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxV4MxL7-1667447585968)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221101232218071.png)]

Jedis客户端入门

1.引入依赖

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>

2.建立连接并操作

//建立连接
    @BeforeEach
    void setUp() {

        //建立连接
        jedis = new Jedis("ip", 6379);
        //设置密码
        jedis.auth("redhat");
        //选择库
        jedis.select(0);
    }

    //测试string
    @Test
   public void testString() {
        //插入数据,方法名称就是redis命令名称,非常简单
        String result = jedis.set("name", "张三");
        System.out.println("result"+result);
        //获取数据
        String name=jedis.get("name");
        System.out.println("name = "+name);
    }

    @Test
    public void testHash(){
        //插入hash
        jedis.hset("zzx","age","18");
        jedis.hset("zzx","name","zzx");
        Map<String, String> map = jedis.hgetAll("zzx");
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            System.out.println("k:"+entry.getKey()+"   "+"v:"+entry.getValue());
        }
    }
    //释放资源
    @AfterEach
    void tearDown(){
        //释放资源
        if (jedis!=null){
            jedis.close();
        }
    }

Jedis连接池

jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。

连接对象工厂池

public class JedisConnectionFactory {
    private static final JedisPool jedisPool;

    static {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //最大连接数
        jedisPoolConfig.setMaxTotal(8);
        //最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        //最小空闲连接
        jedisPoolConfig.setMinIdle(0);
        //设置最长等待时间,ms
        jedisPoolConfig.setMaxWaitMillis(200);
        jedisPool =new JedisPool(jedisPoolConfig,"ip",6379,1000,"redhat");
    }
    //获取Jedis连接对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

SpringDataRedis介绍

SpringData是spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模式
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK,JSON,字符串,Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

RedisTemplate工具类中的api:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ay8m61TE-1667447585970)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221102135048331.png)]

SpringDataRedis快速入门

SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单

1.引入依赖

        <!--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.配置文件

spring:
  redis:
    host: ip
    port: 6379
    password: redhat
    lettuce:
      pool:
        max-active: 8 #最大连接数
        max-idle: 8 #最大空闲连接
        min-idle: 0 #最小空闲连接
        max-wait: 100 #连接等待时间

SpringDataRedis的序列化方式

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PaXa6EhQ-1667447585970)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221102231405030.png)]

缺点:

  • 可读性差
  • 内存占用较大

改变RedisTemplate的序列化方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QvCQT2Ry-1667447585971)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221102231844912.png)]

key一般用StringRedisSerializer

value一般用GenericJackson2JsonRedisSerializer

修改序列化方式

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //创建Template
        RedisTemplate<String,Object> redisTemplate =new RedisTemplate<>();
        //设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer=new GenericJackson2JsonRedisSerializer();

        //key和hashKey采用String序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());

        //value和hashValue采用JSON序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);

        return redisTemplate;
    }
}

StringRedisTemplate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBDO74fe-1667447585971)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221103111125978.png)]

在之前使用jsonRedisSerializer序列化器时产生的@class这个字段会造成资源浪费,为了节省内存空间,我们并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String的key和Value。当需要存储Java对象时手动完成对象的序列化和反序列化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4StB2fD-1667447585972)(C:\Users\20745\AppData\Roaming\Typora\typora-user-images\image-20221103111934779.png)]

StringRedisTemplate的作用

由于StringRedisTemplate的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:

总结RedisTemplate的两种序列化实践方案:

方案一:

  1. 自定义RedisTemplate
  2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

  1. 使用StringRedisTemplate
  2. 写入Redis时,手动把对象序列化为JSON
  3. 读写Redis时,手动把读取到的JSON反序列化为对象

Redistemplate操作Hash类型

import com.alibaba.fastjson.JSON;
import com.cdcas.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.Map;

@SpringBootTest
class RedisDemoApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        //插入一条String类型数据
        redisTemplate.opsForValue().set("name","李四");
        //读取一条String类型数据
        Object name =redisTemplate.opsForValue().get("name");
        System.out.println("name = "+name);
    }
    @Test
    void testSaveUser(){
        //写入数据
        redisTemplate.opsForValue().set("user:100",new User("赵志鑫",21));
        //获取数据
        User user=(User) redisTemplate.opsForValue().get("user:100");
        System.out.println(user);
    }
    @Test
    void testStringTemplate(){
        //准备对象
        User user=new User("虎牙",18);
        //手动序列化
        String userJson= JSON.toJSONString(user);
        //写入json数据
        System.out.println(user);
        stringRedisTemplate.opsForValue().set("user",userJson);
        //获取json数据
        String userFromRedis = stringRedisTemplate.opsForValue().get("user");
        User parseObject = JSON.parseObject(userFromRedis, User.class);
        System.out.println("=============================");
        System.out.println("从redis中获取的对象"+parseObject);
    }
    @Test
    void testHash(){
        stringRedisTemplate.opsForHash().put("cdcas:user:100","name","赵志鑫");
        stringRedisTemplate.opsForHash().put("cdcas:user:100","forMe","哈哈");
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("cdcas:user:100");
        System.out.println("entries ="+entries);
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值