4.7spring整合redis

93 阅读2分钟

1.命令行操作redis

FMR6QH_H%K3C44GYEJ)R0.png 常用的类型String list hash set zset。

string命令:set key value 。get key。incr key decr key +1 -1

hash hset hget

list可以当做队列,栈使用。 lpush lpop rpush rpop push是从左往右push。llen看长度 lindex 0 查看索引为0的值。 lrange 0 2 查看索引从0-2的值

set sadd key 1 2 3 4  scard key 查看元素数量 spop key 随机弹出一个值(可以实现抽奖) smembers key查看全部元素

zset有序集合 zadd key 10 aa 20 bb 30 cc 要在值边上加个分数。 zcard key 统计值的数量。 zscore key value获取该值的分数。 zrank key value 获取该值的排名 。zrange key 0 2 取位于0-2排名的三个值,升序的。

全局命令:keys查出所有key。 keys test 查看test开头的key

type key 查看key的类型。 exists key查看该值是否存在。 del key删除key。expire key 10 当前key10秒后过期

2.springboot操作redis

FMR6QH_H%K3C44GYEJ)R0.png

@RunWith(SpringRunner.class)
@SpringBootTest
//这个注解,测试时,就能和开发的主启动类(配置类)用于一样的配置
@ContextConfiguration(classes = CommunityApplication.class)
public class RedisTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testString(){
        String key = "test:count";
        redisTemplate.opsForValue().set(key,1);
        System.out.println(redisTemplate.opsForValue().get(key));
        System.out.println(redisTemplate.opsForValue().increment(key,10));
    }

    @Test
    public void testHash(){
        String key = "test:user";
        redisTemplate.opsForHash().put(key,"id",1);
        redisTemplate.opsForHash().put(key,"name","niaho");
        System.out.println(redisTemplate.opsForHash().get(key,"id"));
        System.out.println(redisTemplate.opsForHash().get(key,"name"));
    }

    @Test
    public void testList(){
        String key = "test:ids";
        redisTemplate.opsForList().leftPush(key,1);
        redisTemplate.opsForList().leftPush(key,2);
        System.out.println(redisTemplate.opsForList().size(key));
        System.out.println(redisTemplate.opsForList().index(key,0));
        System.out.println(redisTemplate.opsForList().range(key,0,2));
        redisTemplate.opsForList().leftPop(key);
        System.out.println(redisTemplate.opsForList().range(key,0,2));
    }

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

    @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));
        System.out.println(redisTemplate.opsForZSet().score(redisKey, "八戒"));
        System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey, "八戒"));
        System.out.println(redisTemplate.opsForZSet().reverseRange(redisKey, 0, 2));
    }

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

        System.out.println(redisTemplate.hasKey("test:user"));

        redisTemplate.expire("test:students", 10, TimeUnit.SECONDS);
    }

    // 多次使用同一个key,可以将其绑定,下次使用命令不需要再次填写key
    @Test
    public void testBoundOperations() {
        String redisKey = "test:count";
        BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
        operations.increment();
        operations.increment();
        operations.increment();
        operations.increment();
        operations.increment();
        System.out.println(operations.get());
    }

3.redis的事务

/**
 * 编程式事务
 * 由于redis的事务没有ACID,不是关系型数据库。所以redis的事务是下面这样的:
 * 把命令全部放入一个队列,等commit时,在一起批量执行,所以你想在事务中查询,不会立刻出结果。
 * 所以在事务中加入查询没意义。
 * 而声明式事务,直接加在一个方法上,方法里面的所以代码都被此事务约束。
 * 现在我们需要事务只是作用于方法中的几行代码,所以我们要编程式事务。
 *
 */
@Test
public void testTransaction() {
    Object result = redisTemplate.execute(new SessionCallback() {
        @Override
        public Object execute(RedisOperations redisOperations) throws DataAccessException {
            String redisKey = "text:tx";

            // 启用事务
            redisOperations.multi();
            redisOperations.opsForSet().add(redisKey, "zhangsan");
            redisOperations.opsForSet().add(redisKey, "lisi");
            redisOperations.opsForSet().add(redisKey, "wangwu");

            System.out.println(redisOperations.opsForSet().members(redisKey));

            // 提交事务
            return redisOperations.exec();
        }
    });
    System.out.println(result);
}