您现在的位置是:首页 >技术教程 >Redis整合网站首页技术教程

Redis整合

_当时年少春衫薄 2024-06-14 17:18:18
简介redis整合

目录

一、事务

二、乐观锁

三、Jedis

 四、Springboot整合Redis

4.1创建springboot项目,勾选对应的依赖

 4.2源码分析

 4.3配置文件

4.4测试

4.5自定义序列化方式

4.5.1JSON序列化

4.5.2String序列化


一、事务

事务本质:一组命令的集合,一个事物的所有命令都会被序列化,会按照顺序执行。

Redis事务没有隔离级别的概念。

Redis单条命令保存原子性,但事务不保证原子性。

redis事务流程:

  • 开启事务(Multi)
  • 命令入队(......)
  • 执行事务(exec)

 放弃事务:

二、乐观锁

悲观锁:认为什么时候都会出现问题,无论如何都会加锁

乐观锁:认为什么时候都不会出错,所以不会加锁,更新数据时需要判断一下,在此期间是否有人修改过这个数据。

Redis实施监控:

 多线程修改时,使用watch可以当做redis的乐观锁操作

如果监控失败,获取最新值

三、Jedis

1.导入jedis的包

2.编码测试

 输出PONG则说明连接成功

 手写一个事务

 四、Springboot整合Redis

4.1创建springboot项目,勾选对应的依赖

主要依赖

        <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>

 4.2源码分析

 4.3配置文件

spring:
  redis:
    # Redis服务器地址
    host: 19.1.5.11
    # Redis服务器端口号
    port: 6379
    # 使用的数据库索引,默认是0
    database: 0
    # 连接超时时间
    timeout: 1800000
     # 设置密码
    password: "123456"
    lettuce:
      pool:
        # 最大阻塞等待时间,负数表示没有限制
        max-wait: -1
        # 连接池中的最大空闲连接
        max-idle: 5
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中最大连接数,负数表示没有限制
        max-active: 20

4.4测试

    
    private RedisTemplate   redisTemplate;

    @Test
    void testOne() {
        redisTemplate.opsForValue().set("name","卷心菜");
        String name = (String) redisTemplate.opsForValue().get("name");
        System.out.println(name); //卷心菜
    }

用redis客户端查看时发现乱码,原因是未自定义序列化

4.5自定义序列化方式

4.5.1JSON序列化

定义RedisConfig.java配置类

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        // 创建模板
        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;
    }
}

 问题:在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销

4.5.2String序列化

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化

 方法二:

    @Autowired
    private StringRedisTemplate redisTemplate;
    // JSON工具
    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testOne() {
        redisTemplate.opsForValue().set("name", "卷心菜");
    }
    @Test
    void testTwo() throws IOException {
        Person person = new Person("我是一棵卷心菜", 21);
        //  手动序列化
        String json = mapper.writeValueAsString(person);
        redisTemplate.opsForValue().set("person", json);
        String personJson = redisTemplate.opsForValue().get("person");
        // 反序列化
        Person person1 = mapper.readValue(personJson, Person.class);
        System.out.println(person1);
    }

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。