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)

d6bbb5b6d9b84afe9bd52a885ae93fd4.png

 放弃事务:

 

89c3c92a6440439fb551bc184b728c02.png

二、乐观锁

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

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

Redis实施监控:

e53a8d2187ad4de2a5e664c1e4811a1c.png

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

815ce97f1cab4db59d9227446a4352ef.png

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

b4a3d1af06fb4fa1bdfcaae87446cae6.png

三、Jedis

1.首先在resources文件夹下写一个配置文件,我的文件名是:redis.properties,内容如下:

# 自己的ip地址
redis.host=12.16.25.1 
# 端口号
redis.port=6379
redis.maxTotal=30
redis.maxIdle=10

2.然后写一个工具类,用来获取jedis对象

public class JedisUtils {
    private static JedisPool jp = null;
    private static String host = null;
    private static int port;
    private static int maxTotal;
    private static int maxIdle;
    static {
        ResourceBundle rb = ResourceBundle.getBundle("redis");
        JedisPoolConfig jpc = new JedisPoolConfig();
        host = rb.getString("redis.host");
        port = Integer.parseInt(rb.getString("redis.port"));
        maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
        maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
        jp = new JedisPool(jpc, host, port);
    }
    public static Jedis getJedis() {
        return jp.getResource();
    }
}

3.编码测试

e5ca0c685331446c8a7b906fc7df4460.png

 

b76cc46de41f4adfb591916dc3cb2a68.png

 输出PONG则说明连接成功

 手写一个事务

f7cb88882a7f4330be81e032ddff0501.png

 四、Springboot整合Redis

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

d511279f0fd34938baaa8bf278f48ddd.png

主要依赖

        <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源码分析

71e869e6f71d4de994b39923901bcf2e.png

 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对象时,手动完成对象的序列化和反序列化

6d31aa2313994535a25dc0a6600ddf61.png

34ad7baa523f4014ab194e2a88608634.png

 

 方法二:

    @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);
    }

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将Redis整合到MyBatis-Plus中,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中引入了Redis的相关依赖,比如`spring-boot-starter-data-redis`。 2. 在Spring Boot的配置文件中,配置Redis的连接信息,包括主机、端口、密码等。 ```yaml spring: redis: host: localhost port: 6379 password: your_password ``` 3. 在MyBatis-Plus的配置文件中,配置Redis作为缓存的实现。 ```java @Configuration public class MyBatisPlusConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public CacheManager cacheManager() { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间 .disableCachingNullValues() // 禁止缓存null值 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(redisConnectionFactory) .cacheDefaults(redisCacheConfiguration); return builder.build(); } } ``` 4. 在需要缓存的Mapper接口上添加`@CacheNamespace`注解,指定使用Redis作为缓存。 ```java @CacheNamespace(implementation = RedisCache.class) public interface UserMapper extends BaseMapper<User> { // ... } ``` 这样,MyBatis-Plus就会将查询结果缓存在Redis中,提高数据查询的效率。 请注意,以上仅是一个简单的示例,实际应用中可能还需要根据具体需求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几两春秋梦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值