java中使用redis ---- 基本类型及HyperLogLog/BitMap

maven导入redis的包

		<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

redis配置

在application.properties中输入

#RedisProperties
spring.data.redis.database=11
spring.data.redis.host=localhost
spring.data.redis.port=6379

config类

@Configuration
public class RedisConfig {

    // RedisConnectionFactory also is a bean, when you use it, spring will automatically load it.
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // Set serialization mode of the key
        template.setKeySerializer(RedisSerializer.string());
        // Set serialization mode of the value
        template.setValueSerializer(RedisSerializer.json());
        // Set serialization mode of the key of hash
        template.setValueSerializer(RedisSerializer.string());
        // Set serialization mode of the value of hash
        template.setValueSerializer(RedisSerializer.json());

        template.afterPropertiesSet();
        return template;
    }
}

test

将redis启动起来:redis-server

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = MyCommunityApplication.class)
public class RedisTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testStrings(){
        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));
    }

    @Test
    public void testHashes(){
        String redisKey = "test:user";

        redisTemplate.opsForHash().put(redisKey, "id", 1);
        redisTemplate.opsForHash().put(redisKey, "username", "qjl");

        System.out.println(redisTemplate.opsForHash().get(redisKey, "id"));
        System.out.println(redisTemplate.opsForHash().get(redisKey, "username"));
    }

    @Test
    public void testLists(){
        String redisKey = "list:ids";

        redisTemplate.opsForList().leftPush(redisKey, "id");
        redisTemplate.opsForList().leftPush(redisKey, "name");

        System.out.println(redisTemplate.opsForList().size(redisKey));
        System.out.println(redisTemplate.opsForList().index(redisKey, 1));
        System.out.println(redisTemplate.opsForList().range(redisKey, 0, 2));
    }

    @Test
    public void testSortedSets(){
        String redisKey = "test:students";

        redisTemplate.opsForZSet().add(redisKey, "qjl", 80);
        redisTemplate.opsForZSet().add(redisKey, "zhj", 90);

        System.out.println(redisTemplate.opsForZSet().zCard(redisKey));
        System.out.println(redisTemplate.opsForZSet().score(redisKey,"qjl"));
        System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey, "qjl"));
    }

    @Test
    public void testKeys(){
        redisTemplate.delete("test:user");

        System.out.println(redisTemplate.hasKey("test:user"));
        redisTemplate.expire("test:student", 10, TimeUnit.SECONDS);
    }

    @Test
    public void testHyperLogLog(){
        String redisKey = "test:hll:01";
        redisTemplate.delete(redisKey);

        for(int i = 1; i <= 10000; ++ i){
            redisTemplate.opsForHyperLogLog().add(redisKey, i);
        }

        String redisKey2 = "test:hll:02";
        redisTemplate.delete(redisKey2);
        for(int i = 5001; i <= 15000; ++ i){
            redisTemplate.opsForHyperLogLog().add(redisKey2, i);
        }

        long size = redisTemplate.opsForHyperLogLog().size(redisKey);
        System.out.println(size);

        String redisKey3 = "test:hll:03";
        redisTemplate.delete(redisKey3);
        redisTemplate.opsForHyperLogLog().union(redisKey3, redisKey2, redisKey);
        System.out.println(redisTemplate.opsForHyperLogLog().size(redisKey3));
    }

    @Test
    public void testBitMap(){
        String redisKey = "test:bm:01";
        redisTemplate.delete(redisKey);

        redisTemplate.opsForValue().setBit(redisKey, 1, true);
        redisTemplate.opsForValue().setBit(redisKey, 4, true);
        redisTemplate.opsForValue().setBit(redisKey, 7, true);

        System.out.println(redisTemplate.opsForValue().getBit(redisKey, 0));
        System.out.println(redisTemplate.opsForValue().getBit(redisKey, 1));
        System.out.println(redisTemplate.opsForValue().getBit(redisKey, 4));

        Object obj = redisTemplate.execute(new RedisCallback() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.stringCommands().bitCount(redisKey.getBytes());
            }
        });
        System.out.println(obj);

        String redisKey2 = "test:bm:02";
        redisTemplate.delete(redisKey2);
        redisTemplate.opsForValue().setBit(redisKey2, 2, true);
        redisTemplate.opsForValue().setBit(redisKey2, 4, true);
        redisTemplate.opsForValue().setBit(redisKey2, 9, true);

        String redisKey3 = "test:bm:03";
        redisTemplate.delete(redisKey3);
        Object obj2 = redisTemplate.execute(new RedisCallback() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                connection.stringCommands().bitOp(RedisStringCommands.BitOperation.OR,
                        redisKey3.getBytes(), redisKey2.getBytes(), redisKey.getBytes());
                return connection.stringCommands().bitCount(redisKey3.getBytes());
            }
        });
        System.out.println(obj2);
    }
}

如果某个字段频繁使用,也可以将其绑定到redisTemplate上:

    @Test
    public void testBoundOperation(){
        String redisKey = "test:count";
        BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
        // 如果是set类型,就是redisTemplate.boundSetOps(redisKey);

        operations.increment();
        operations.increment();
        operations.increment();

        System.out.println(operations.get());
    }

编程式事务:

@Test
    public void testTransactional(){
        Object object = redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations operations) throws DataAccessException {
                String redisKey = "test:key";

                operations.multi();	// 开启事务

                operations.opsForSet().add(redisKey, "zhangsan");
                operations.opsForSet().add(redisKey, "lisi");
                operations.opsForSet().add(redisKey, "qjl");
                operations.opsForSet().add(redisKey, "zhj");

                System.out.println(operations.opsForSet().members(redisKey));	// 此时尚未执行redis语句
                // 在java代码的multi和exec之间的所有redis命令被redis加到事务执行命令队列
                // 但是java代码这个时候就已经被执行了,但是members那条命令不回立刻返回结果
                // 所以这个时候sout拿不到结果就输出空。到最后exec,redis把队列里的命令都执行了
                // 返回一个结果,最后打印出来。感觉就是把multi和exec之间的redis命令抽取出来了

                return operations.exec();
            }
        });
        System.out.println(object);
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值