Spring整合Redis

RedisConfig

注解:@Configuration

redisTemplate

参数:RedisConectionFactory factory

返回值:RedisTemplate<String, Object>

方法体逻辑:

  1. 实例化一个RedisTemplate
  2. 设置连接工厂
  3. 设置Key的序列化方式
    1. setKeySerializer(RedisSerializer.string())
  4. 设置value的序列化方式
    1. setValueSerializer(RedisSerializer.json())
  5. 设置hash的key的序列化方式
    1. setHashKeySerializer(RedisSerializer.string())
  6. 设置hash的value的序列化方式
    1. setHashValueSerializer(RedisSerializer.json())
  7. template.afterPropertiesSet
  8. return
	@Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 实例化一个redis模板
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 为redis模板添加一个添加连接工厂
        redisTemplate.setConnectionFactory(factory);
        // 设置普通Key的序列化方式
        redisTemplate.setKeySerializer(RedisSerializer.string());
        // 设置普通Value的序列化方式
        redisTemplate.setValueSerializer(RedisSerializer.json());
        // 设置HashKey的序列化方式
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 设置HashValue的序列化方式
        redisTemplate.setHashValueSerializer(RedisSerializer.json());
        // 设置已经完成配置的标识
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

测试一下使用redisTemplate操作Redis数据库

  1. String
  2. Hash
  3. List
  4. Set
  5. SortedSet
  6. keys相关的操作
  7. bound

当需要多次访问的时候,可以使用BoundValueOperations来绑定一个key,这样子就不需要每次都把可以传入redisTemplate来进行操作

  1. 编程式事务
    1. redisTemplate.execute
    2. operations.multi()开始事务
    3. 中间
    4. return operations.exec()

在事务中,Redis的每个命令会先存放在队列中,事务提交的时候才会一并提交,因此使用redis管理事务的时候,中间不能查询。

@Autowired
    private RedisTemplate redisTemplate;
    
    @Test
    public void testRedis() {
//         1. 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));
//         2. Hash
        String redisHashKey = "test:hash";
        redisTemplate.opsForHash().put(redisHashKey, "count", 1);
        System.out.println(redisTemplate.opsForHash().get(redisHashKey, "count"));
        System.out.println(redisTemplate.opsForHash().increment(redisHashKey, "count", 1));
        System.out.println(redisTemplate.opsForHash().get(redisHashKey, "count"));
//         3. List
        String redisListKey = "test:list";
        redisTemplate.opsForList().leftPush(redisListKey, 1);
        redisTemplate.opsForList().leftPush(redisListKey, 2);
        redisTemplate.opsForList().leftPush(redisListKey, 3);
        redisTemplate.opsForList().leftPush(redisListKey, 4);
        redisTemplate.opsForList().leftPush(redisListKey, 5);
        redisTemplate.opsForList().leftPush(redisListKey, 6);
        System.out.println(redisTemplate.opsForList().rightPop(redisListKey));
        System.out.println(redisTemplate.opsForList().range(redisListKey, 0, 4));
//         4. Set
        String redisSetKey = "test:set";
        redisTemplate.opsForSet().add(redisSetKey, 1, 2, 3, 4, 5);
        redisTemplate.opsForSet().add(redisSetKey, 6);
        Set members = redisTemplate.opsForSet().members(redisSetKey);
        System.out.println(members);
//         5. SortedSet
        String redisZSetKey = "test:ZSet";
        redisTemplate.opsForZSet().add(redisZSetKey, "学生1", 91);
        redisTemplate.opsForZSet().add(redisZSetKey, "学生2", 81);
        redisTemplate.opsForZSet().add(redisZSetKey, "学生3", 71);
        redisTemplate.opsForZSet().add(redisZSetKey, "学生4", 61);
        redisTemplate.opsForZSet().add(redisZSetKey, "学生5", 51);
        redisTemplate.opsForZSet().add(redisZSetKey, "学生6", 41);
        redisTemplate.opsForZSet().add(redisZSetKey, "学生7", 31);

        // 统计有序集合内的元素的数量
        System.out.println(redisTemplate.opsForZSet().zCard(redisZSetKey));
        // 查找指定key的score
        System.out.println(redisTemplate.opsForZSet().score(redisZSetKey, "学生1"));
        // 查找指定key的排序,默认是升序的,reverse之后为降序
        System.out.println(redisTemplate.opsForZSet().reverseRank(redisZSetKey, "学生7"));
        // 查找指定区间的key,默认升序
        System.out.println(redisTemplate.opsForZSet().reverseRange(redisZSetKey, 0, 2));


//         6. keys相关的操作
//         删除key
        redisTemplate.delete("test:ZSet");
        // 判断key是否存在
        System.out.println(redisTemplate.hasKey("test:ZSet"));
        // 设置key的生存时间
        redisTemplate.expire("test:set", 10, TimeUnit.SECONDS);

//         7. bound 访问同一个Key的好帮手  BoundXXXOperations
//        String redisKey = "test:count";
//        BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
//        operations.increment();
//        operations.increment();
//        operations.increment();
//        operations.increment();
//        operations.increment();
//        System.out.println(operations.get());

//         8. Redis的编程式事务
        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");
                operations.opsForSet().add(redisKey, "lisi");
                operations.opsForSet().add(redisKey, "wangwu");
                // 提交事务
                return operations.exec();
            }
        });
        System.out.println(obj);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值