Spring整合Redis

Spring整合Redis

redis可以用来做缓存等高效率的工作,因为是存在内存中,所有读取速度会非常的快,然后命令也是很简单的,所以项目中就是要多用多练习,但是项目中不能使用命令进行操作redis呀,所以我们要学用 Spring整合Redis

导入依赖

  • 导包是一切的开始哈,没这步啥也不是
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
  • 版本号的话,可以自己去Maven中去选择哈,因为,我使用的是SpringBoot 集成的,所以为了包与包之间的兼容性,我就让他直接选择版本了哈。
  • 导包结束后,我们还需要对redis进行一定的参数配置

application.properties (redis配置)

spring.redis.database=11
spring.redis.host=localhost
spring.redis.port=6379
  • 然后还需要搞一个配置类 我们定义为: RedisConfig
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){

        RedisTemplate<String,Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 设置这个Key的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // 设置普通的Value的序列化方式
        template.setValueSerializer(RedisSerializer.json());
        // 设置哈希的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置hash的value序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

        // 使前面的东东生效
        template.afterPropertiesSet();
        return template;
    }

}

  • 作用满,重载个方法,然后设置下五种数据类型的序列化,
  • 为什么要进行重载呢,就是因为系统自带的那个返回的是Object,而我们的key总是为String类型的,所以我们在自己搞一个。
  • 到这里我们就可以进行测试了,然后如果你的redis是采用压缩包的形式,记得把服务器打开哦,程序安装的就不用了,因为,他会自己开的。

创建测试类,然后将我们配置好的Bean注入进去

    @Autowired
    private RedisTemplate redisTemplate;

字符串类型(String)

    @Test
    public void testStrings(){              // 向 redis 数据库中存放 String字符串 类型的数据
        String redisKey = "test:count";
        redisTemplate.opsForValue().set(redisKey,1);
        System.out.println(redisTemplate.opsForValue().get(redisKey));
        System.out.println(redisTemplate.opsForValue().increment(redisKey));
        System.out.println(redisTemplate.opsForValue().decrement(redisKey));
    }

哈希类型(Hash)

    @Test
    public void testHashes(){               // 向 redis 数据库中存放 hash哈希 类型的数据
        String redisKey = "test:user";
        redisTemplate.opsForHash().put(redisKey,"username","saobao");
        redisTemplate.opsForHash().put(redisKey,"age","18");
        // 取值
        System.out.println(redisTemplate.opsForHash().get(redisKey,"username"));
        System.out.println(redisTemplate.opsForHash().get(redisKey,"age"));
    }

列表类型(List)

    @Test
    public void testLists(){                // 向 redis 数据库中存放 List列表 类型的数据
        String redisKey = "test:ids";
        redisTemplate.opsForList().leftPush(redisKey,101);
        redisTemplate.opsForList().leftPush(redisKey,102);
        redisTemplate.opsForList().leftPush(redisKey,103);

        System.out.println(redisTemplate.opsForList().size(redisKey));
        System.out.println(redisTemplate.opsForList().index(redisKey,0)); // 获取0号索引的数据
        System.out.println(redisTemplate.opsForList().range(redisKey,0,2)); // 获取 0 - 2 范围内的数据

        // 删除 ,弹出数据
        redisTemplate.opsForList().leftPop(redisKey);
        redisTemplate.opsForList().rightPop(redisKey);
    }

集合类型(Set)

    @Test
    public void testSets(){                 // 向 redis 数据库中存放 set集合 类型的数据
        String redisKey = "test:teachers";
        redisTemplate.opsForSet().add(redisKey,"刘备","张飞","关羽","赵云","诸葛亮");
        // 取数据
        System.out.println(redisTemplate.opsForSet().size(redisKey));
        System.out.println(redisTemplate.opsForSet().pop(redisKey));  // 随机弹出一个数据
        System.out.println(redisTemplate.opsForSet().members(redisKey));  // 取所有数据
    }

有序集合类型(SortedSet)

    @Test
    public void testSortedSets(){
        String redisKey = "test:students";
        redisTemplate.opsForZSet().add(redisKey,"唐僧",80);
        redisTemplate.opsForZSet().add(redisKey,"悟空",90);
        redisTemplate.opsForZSet().add(redisKey,"猪八戒",50);
        redisTemplate.opsForZSet().add(redisKey,"沙僧",70);
        redisTemplate.opsForZSet().add(redisKey,"白龙马",60);

        System.out.println(redisTemplate.opsForZSet().zCard(redisKey));                     // 统计key中有多少个数据
        System.out.println(redisTemplate.opsForZSet().score(redisKey,"猪八戒"));
        System.out.println(redisTemplate.opsForZSet().rank(redisKey,"猪八戒"));            // 由大到小进行排名
        System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey,"猪八戒"));     // 由小到大进行排名
        System.out.println(redisTemplate.opsForZSet().range(redisKey,0,2));             // 小到大取前三
        System.out.println(redisTemplate.opsForZSet().reverseRange(redisKey,0,2));      // 大到小取前三

    }

redis 公共API

    @Test
    public void testKeys(){        // 公共API
        System.out.println(redisTemplate.hasKey("test:user"));          //  判断一个key是否存在
        redisTemplate.delete("test:user");                          // 删除一个key
        System.out.println(redisTemplate.hasKey("test:user"));
        redisTemplate.expire("test:students",10, TimeUnit.SECONDS);  // 10秒后删除  ,延迟删除key
    }
  • 要记下来哦!!!

然后当发生一个key要被多次访问的时候,我们可以进行key的注入,这样可以方便后面的使用

关键字Key绑定

    @Test
    public void testBoundOperations(){                      // 多次访问同一个key
        String redisKey = "test:count";
        BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
        operations.increment();
        operations.increment();   // 增加
        operations.increment();
        System.out.println(operations.get());
    }
  • mysql作为关系型数据库,有他必须遵守的 ACID 原则
  • 而 我们的 redis 作为非关系型数据库,我们虽然不严格要求 ACID 标准
  • 但是我们也有自己的事务管理,同时也有相同的
  • 声明式事务编程式事务
  • 然后我们一般使用 编程式事务 ,因为我们的redis有个不同的就是
  • 在事务进行中的时候,是无法进行查询操作的,只有等提交后我们才可以进行查询
  • 而声明式事务采用的是注解的方法,最小的针对单位就是 方法
  • 而编程式事务可以 针对到 几行代码,

编程式事务(redis)

    @Test
    public void testTransactional() {   // 编程式事务
        Object obj = redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                String redisKey = "test:tx";
                operations.multi();    // 启动事务
                operations.opsForSet().add(redisKey,"zhangSan","liSi","wanLaoWu");
                System.out.println(operations.opsForSet().members(redisKey));
                return operations.exec();  // 提交事务
            }
        });
        System.out.println(obj);
    }
  • 详细记忆,牢记牢记
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木木不会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值