Mall-04---RedisTemplate

262 阅读7分钟
redisRemplate,StringRedisTemplate,Jedis三者中选择

三者区别

Jedis是Redis官方推荐的面向Java的操作Redis的客户端

RedisTemplate,StringRedisTemplate是SpringDataRedis中对JedisApi的高度封装。 SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache,而RedisTemplate,StringRedisTemplate之间的区别:

两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  • RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组然后在存入Redis数据库。
  • StringRedisTemplate使用的是StringRedisSerializer

当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。

但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。 如果为了方便,那么我们直接使用RedisTemplate最好~

下面贴一下我找的一些例子:

Reids的Key的操作

public class MyTest{

	//因为redistempalte默认装配了泛型为<Object,Object>的redistemplate,
	//所以<String,String>也是可以注入的,因为string是object派生类 。
	//如果需要要<String,Object>的redistemplate则需要自己装配
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    public void test1(){
        //给指定键设置过期时间
        redisTemplate.expire("lzj",12, TimeUnit.SECONDS);
        //删除指定键
        redisTemplate.delete("lzj");
        //查找 指定的 键
        redisTemplate.keys("*");
        //判断是否存在键值
        redisTemplate.hasKey("lzj");
        //获取过期时间
        redisTemplate.getExpire("lzj");
        //获取指定格式的过期时间
        redisTemplate.getExpire("lzj",TimeUnit.SECONDS);
        //获取当前传入的key的值序列化为byte[]类型
        redisTemplate.dump("lzj");
        //修改指定键的名字  如果该键不存在则报错
        redisTemplate.rename("lzj","lyx");
        //旧值存在时,将旧值改为新值
        redisTemplate.renameIfAbsent("lzj","lyx");
        //获取指定键的类型
        redisTemplate.type("lzj");
        //将指定的键移动到指定的库中
        redisTemplate.move("lzj",2);
        //随机取一个key
        redisTemplate.randomKey();
        //将key持久化保存 就是把过期或者设置了过期时间的key变为永不过期
        redisTemplate.persist("lzj");
    }
    
}

Redis的String数据结构
public class MyTest{

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    public void test1(){
        //存入数据
        redisTemplate.opsForValue().set("name","lzj");
        //获取数据
        System.out.println(redisTemplate.opsForValue().get("name"));
        //获取多个数据
        System.out.println(redisTemplate.opsForValue().multiGet(Arrays.asList("lzj","lyx","3333")));
        //存入数据并且设置过期时间
        redisTemplate.opsForValue().set("num","123",10, TimeUnit.SECONDS);
        //给指定键值 4 偏移量的位置开始替换内容
        redisTemplate.opsForValue().set("name","lzj",2);
        //设置键的字符串值并返回其旧值
        System.out.println(redisTemplate.opsForValue().getAndSet("name","lyx"));
        //给指定键 的值追加字符串
        redisTemplate.opsForValue().append("test","Hello");
        //存入数据 如果不存在则存入数据返回true 否则不覆盖数据返回false
        System.out.println(redisTemplate.opsForValue().setIfAbsent("lzj","1234"));
        //存入数据并设置过期时间 如果不存在则存入数据返回true 否则不覆盖数据返回false
        System.out.println(redisTemplate.opsForValue().setIfAbsent("lzj","1234",200,TimeUnit.SECONDS));
        //存入数据 如果存在键则覆盖数据 返回true 不存在则不作任何操作 返回false
        System.out.println(redisTemplate.opsForValue().setIfPresent("lyx","1234"));
        //存入数据并设置过期时间 如果存在键则覆盖数据 返回true 不存在则不作任何操作 返回false
        System.out.println(redisTemplate.opsForValue().setIfPresent("lyx","1234",200,TimeUnit.SECONDS));
    }

    @Test
    public void test2(){
        Map<String,String> map = new HashMap<>();
        map.put("1","123");
        map.put("2","123");
        //多个键值的插入
        redisTemplate.opsForValue().multiSet(map);
        //多个键值的插入 如果不存在则存入数据返回true 否则不覆盖数据返回false
        redisTemplate.opsForValue().multiSetIfAbsent(map);
    }

    @Test
    public void test3(){
        //返回键的值的长度
        System.out.println(redisTemplate.opsForValue().size("lzj"));
        System.out.println(redisTemplate.opsForValue().multiGet(Arrays.asList("lzj","lyx","3333")));
        //给指定键 加1如果值不是数字则抛出异常 不存在指定键创建一个初始为0的加1 增加成功则返回增加后的值
        System.out.println(redisTemplate.opsForValue().increment("lzj"));
        //给指定键 加指定整数如果值不是数字则抛出异常 不存在指定键创建一个初始为0的加指定整数 增加成功则返回增加后的值
        System.out.println(redisTemplate.opsForValue().increment("1",1));
        //给指定键 加指定浮点数如果值不是数字则抛出异常 不存在指定键创建一个初始为0的加指定浮点数 增加成功则返回增加后的值
        System.out.println(redisTemplate.opsForValue().increment("1",1.2));
        //给指定键 减1如果值不是数字则抛出异常 不存在指定键创建一个初始为0的减1 减少成功则返回增加后的值
        System.out.println(redisTemplate.opsForValue().decrement("1"));
        //给指定键 减指定整数如果值不是数字则抛出异常 不存在指定键创建一个初始为0的减指定整数 减少成功则返回增加后的值
        System.out.println(redisTemplate.opsForValue().decrement("1",3));
    }

}

Redis的List数据结构

public class MyTest { @Autowired private RedisTemplate<String,String> redisTemplate;

@Test
public void test1(){
    //存入List数据 做左边推入一个 如果键不存在 则创建一个空的并左推入
    redisTemplate.opsForList().leftPush("list1","1");
    //存入List数据 做左边推入多个 如果键不存在 则创建一个空的并左推入
    redisTemplate.opsForList().leftPushAll("list1","88","999");
    //存入List数据 做右边推入一个 如果键不存在 则创建一个空的并右推入
    redisTemplate.opsForList().rightPush("list1","3");
    //存入List数据 做右边推入多个 如果键不存在 则创建一个空的并右推入
    redisTemplate.opsForList().leftPushAll("list1","77","6666");
    //返回指定List数据下标的值
    System.out.println(redisTemplate.opsForList().index("",2));
    //移除2个指定List数据元素内容为1
    redisTemplate.opsForList().remove("list1",2,"1");
    //左边推出一个
    System.out.println(redisTemplate.opsForList().leftPop("list1"));
    //移除集合中左边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
    System.out.println(redisTemplate.opsForList().leftPop("list1",2, TimeUnit.SECONDS));
    //右边推出一个
    System.out.println(redisTemplate.opsForList().rightPop("list1"));
    //移除集合中右边的元素在等待的时间里,如果超过等待的时间仍没有元素则退出。
    System.out.println(redisTemplate.opsForList().rightPop("list1",2, TimeUnit.SECONDS));
    //给指定键List数据下标为1的元素替换成2
    redisTemplate.opsForList().set("list1",1,"2");
    //查看指定键List数据元素个数
    redisTemplate.opsForList().size("list1");
    //获取指定健List数据 从开始到结束下标
    redisTemplate.opsForList().range("list1",0,-1).forEach(System.out::println);
    //移除列表的最后一个元素,并将该元素添加到另一个列表(如果这另一个List不存在就创建一个空的添加)并返回
    redisTemplate.opsForList().rightPopAndLeftPush("list1","list2");
    // 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
    redisTemplate.opsForList().rightPopAndLeftPush("list1","list2",80,TimeUnit.SECONDS);
    

}

@Test
public void test2(){
    //指定键List数据右边推出一个元素
    System.out.println(redisTemplate.opsForList().rightPop("list1"));
    //指定键List数据右边推出一个元素,如果List元素 等待10秒 10秒内没有元素就不操作,有就推出
    System.out.println(redisTemplate.opsForList().rightPop("list1",10, TimeUnit.SECONDS));
    //指定键List数据左边推出一个元素,如果List元素 等待10秒 10秒内没有元素就不操作,有就推出
    System.out.println(redisTemplate.opsForList().leftPop("list1"));
    //指定键List数据左边推出一个元素
    System.out.println(redisTemplate.opsForList().leftPop("list1",10, TimeUnit.SECONDS));
    //给指定键List数据下标为1的元素替换成2
    redisTemplate.opsForList().set("list1",1,"2");
    //查看指定键List数据元素个数
    redisTemplate.opsForList().size("list1");
    //如果存在该键的List数据 则向左推入一个元素 不存在的话不操作
    redisTemplate.opsForList().leftPushIfPresent("list1","1");
    //如果存在该键的List数据 则向右推入一个元素 不存在的话不操作
    redisTemplate.opsForList().rightPushIfPresent("list1","1");

}

}

Redis的Set数据结构
public class MyTest {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    public void test1(){
        //向键为set1的添加元素1(若没有该键,创建一个新的,并加入元素)
        redisTemplate.opsForSet().add("set1","1");
        //查询指定键的包含所有元素
        System.out.println(redisTemplate.opsForSet().members("set1"));
        //查询指定键的包含元素个数
        System.out.println(redisTemplate.opsForSet().size("set1"));
        //查询指定键是否有该元素
        System.out.println(redisTemplate.opsForSet().isMember("set1","1"));
        //指定键随机推出一个元素 并返回
        System.out.println(redisTemplate.opsForSet().pop("set1"));
        //移除指定键里面的指定元素
        redisTemplate.opsForSet().remove("set1","1","2");
        //将指定键的指定元素移动到指定键中
        redisTemplate.opsForSet().move("set1","1","set3");
        
        //获取两个集合的差集
        redisTemplate.opsForSet().difference("set1","set2").forEach(System.out::println);
        //获取两个集合的差集,并存入一个集合中
        redisTemplate.opsForSet().differenceAndStore("set1","set2","set3");
        //求指定键与另外一个集合的差集
        redisTemplate.opsForSet().difference("set1",Arrays.asList("1","2","3")).forEach(System.out::println);
        //求指定键与另外一个集合的差集,并存入一个集合中
        redisTemplate.opsForSet().differenceAndStore("set1",Arrays.asList("1","2","3"),"set3");
        
        //获取两个集合的交集
        redisTemplate.opsForSet().intersect("set1","set2").forEach(System.out::println);
        //获取两个集合的交集,并存入一个集合中
        redisTemplate.opsForSet().intersectAndStore("set1","set2","set3");
        //求指定键与另外一个集合的交集
        redisTemplate.opsForSet().intersect("set1",Arrays.asList("1","2","3"));
        //求指定键与另外一个集合的交集,并存入一个集合中
        redisTemplate.opsForSet().intersectAndStore("set1",Arrays.asList("1","2","3"),"set3");
        
        //获取两个集合的并集
        redisTemplate.opsForSet().union("set1","set2").forEach(System.out::println);
        //获取两个集合的并集,并存入一个集合中
        redisTemplate.opsForSet().unionAndStore("set1","set2","set3");
        //求指定键与另外一个集合的并集
        redisTemplate.opsForSet().union("set1",Arrays.asList("1","2","3")).forEach(System.out::println);
        //求指定键与另外一个集合的并集,并存入一个集合中
        redisTemplate.opsForSet().unionAndStore("set1",Arrays.asList("1","2","3"),"set3");
        

        //随机获取集合中的一个元素
        redisTemplate.opsForSet().randomMember("set1");
        //随机返回集合中指定数量的元素。随机的元素可能重复
        redisTemplate.opsForSet().randomMembers("set1",2);
        //随机返回集合中指定数量的元素。随机的元素不会重复
        redisTemplate.opsForSet().distinctRandomMembers("set1",2);
        //获取集合的游标。通过游标可以遍历整个集合
        Cursor<String> curosr = redisTemplate.opsForSet().scan("set1", ScanOptions.NONE);
        while(curosr.hasNext()){
            String item = curosr.next();
            System.out.println(item);
        }
    }
}

StringRedisTemplate使用

导入依赖

配置文件

注入stringRedisTemplate,调用api

StringRedisTemplate的api几乎和RedisTemplate相同