Redis学习笔记_03:事务+Jedis+SpringBoot整合
发布日期:2021-04-30 21:00:55 浏览次数:140 分类:精选文章

本文共 5489 字,大约阅读时间需要 18 分钟。

Redis学习笔记_03

一、事务

1. 简介

Redis事务是Redis提供的一种操作方式,类似于传统数据库中的事务处理。与传统数据库的ACID原子性不同,Redis的事务本身并不保证原子性,但单条命令的执行是原子性的。

Redis事务的本质是一组命令的集合。每条命令在事务中都会被序列化,执行时按顺序执行,确保不会有其他命令的干扰。然而,Redis没有隔离级别的概念,这意味着事务处理可能存在脏读、不可重复读等问题,但这也是Redis设计的特点。

2. Redis事务操作

正常流程

开启事务(multi)后,所有命令都会被加入队列,直到提交(exec)时才执行。以下是典型的流程示例:

127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> get k1QUEUED127.0.0.1:6379> set k3 v3QUEUED127.0.0.1:6379> exec1) OK2) OK3) "v1"4) OK

事务取消

可以通过DISCARD命令放弃当前事务,或者使用multi discard命令手动取消事务。例如:

127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> DISCARDOK127.0.0.1:6379> exec(error) ERR EXEC without MULTI

事务错误

Redis事务在执行过程中可能出现两种类型的错误:

  • 编译时错误:如命令语法错误,所有命令不执行。
  • 运行时错误:如命令逻辑错误,可能导致部分命令执行失败,但不会影响事务的隔离性。
  • 例如:

    127.0.0.1:6379> multiOK127.0.0.1:6379> set k1 v1QUEUED127.0.0.1:6379> set k2 v2QUEUED127.0.0.1:6379> INCR k1QUEUED127.0.0.1:6379> get k2QUEUED127.0.0.1:6379> exec1) OK2) OK3) (error) ERR value is not an integer or out of range4) "v2"

    3. 监控

    Redis支持乐观锁机制,通过watch命令对特定键进行监控。在多线程环境下,watch可以避免并发问题。

    乐观锁实现

  • 获取键的版本号。
  • 在更新时比较版本号,若版本号改变则表示被其他进程修改,放弃操作并重试。
  • 4. Jedis

    Jedis是Redis官方推荐的Java客户端,用于在Java应用中操作Redis。以下是Jedis的基本使用方法:

    导入依赖

    在项目中添加Jedis的依赖:

    redis.clients
    jedis
    3.2.0

    编码测试

    import redis.clients.jedis.Jedis;public class TestPing {    public static void main(String[] args) {        Jedis jedis = new Jedis("127.0.0.1", 6379);        System.out.println(jedis.ping());    }}

    常用API

    Jedis提供了丰富的API,涵盖String、List、Set、Hash、ZSet等数据结构的操作。所有API命令与Redis命令一致,使用方式类似。

    事务支持

    import com.alibaba.fastjson.JSONObject;import redis.clients.jedis.Transaction;public class TestTX {    public static void main(String[] args) {        Jedis jedis = new Jedis("127.0.0.1", 6379);        JSONObject jsonObject = new JSONObject();        jsonObject.put("hello", "world");        jsonObject.put("name", "zhangsan");                Transaction multi = jedis.multi();        try {            multi.set("user1", jsonObject.toJSONString());            multi.set("user2", jsonObject.toJSONString());            multi.exec();        } catch (Exception e) {            multi.discard();        } finally {            System.out.println(jedis.get("user1"));            System.out.println(jedis.get("user2"));            jedis.close();        }    }}

    5. Spring Boot整合

    在Spring Boot中整合Redis,可以使用spring-boot-starter-data-redis依赖。默认使用Lettuce客户端,而非Jedis。

    配置

    spring.redis.host=127.0.0.1spring.redis.port=6379

    测试

    import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;@SpringBootTestpublic class Redis02SpringbootApplicationTests {    @Autowired    private RedisTemplate redisTemplate;    @Test    void contextLoads() {        redisTemplate.opsForValue().set("name", "zhangsan");        System.out.println(redisTemplate.opsForValue().get("name"));        redisTemplate.opsForValue().set("mykey", "关注狂神说公众号");        System.out.println(redisTemplate.opsForValue().get("mykey"));    }}

    自定义RedisTemplate

    可通过自定义序列化器实现对象存储。以下是一个RedisTemplate的自定义配置:

    package com.kuang.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig {    @Bean    @SuppressWarnings("all")    public RedisTemplate
    redisTemplate(RedisConnectionFactory factory) { RedisTemplate
    template = new RedisTemplate<>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }}

    6. Redis.conf详解

    Redis配置文件redis.conf包含了大量的配置选项,以下是一些关键配置:

    单位

    单位对大小写不敏感,例如GGB有区别。

    快照(持久化)

    Redis支持两种持久化方式:RDB和AOF。RDB是将数据持久化为二进制文件,AOF记录每一步命令操作。

    APPEND ONLY模式

    默认是使用RDB持久化,开启AOF模式可通过appendonly选项配置。

    安全

    可以设置Redis的密码,默认为无密码。

    客户端限制

    可以限制客户端的最大连接数,例如maxclients 10000

    RDB压缩

    默认开启RDB文件的压缩,可以节省存储空间。

    AOF配置

    默认关闭AOF模式,开启可以通过appendonlyappendfsync配置同步频率。

    备份

    bgsave命令用于异步持久化,允许继续处理客户端命令。

    7. Redis监控

    通过Redis监控工具可以实时监控Redis服务器的状态,包括内存使用、连接数、持久化进度等。

    8. Redis持久化

    Redis支持两种持久化方式:

  • RDB:将数据持久化为二进制文件,恢复时读取整个文件。
  • AOF:记录每一步命令操作,恢复时重新执行命令。
  • 默认使用RDB持久化,AOF主要用于高并发场景。

    9. Redis高级功能

    Redis提供了许多高级功能,如地理分布(Geo),超级键(HyperLogLog),动态键(Redis661),等等。

    这些功能可以根据实际需求灵活配置,提升Redis的性能和可用性。


    以上内容涵盖了Redis的核心知识和实际应用技巧,希望对您的学习有所帮助!

    上一篇:【刷题】蓝桥杯——兰顿蚂蚁——C++
    下一篇:Leetcode--925. 长按键入

    发表评论

    最新留言

    很好
    [***.229.124.182]2026年06月14日 03时46分27秒