在java中操作Redis(1)

174 阅读5分钟

四:在Java中操作Redis(!!!)

1.使用"Jedis"操作Redis

1.使用"Jedis"操作Redis中的数据
2."注意":  方法名和命令是一样的 !!!!!!!!!
3.案例:

public void testRedis(){

  
        
    //1.获取连接,连接到Redis
        Jedis jedis=new Jedis("localhost",6379); //指定连接的Redis服务(localhost本地)

    //2.执行具体操作
    
    
       "(1)下面以String类型数据进行操作!!!"
           //eg:我们要操作一个字符串类型的数据 比如向Redis中存入一个string类型的值 --key-value
        jedis.set("username","xiaoming");

          //get查询
        String value= jedis.get("username");
        System.out.println(value);

         //del删除
        jedis.del("username");
    
     "(2)下面以哈希类型数据进行操作!!!"
           //操作哈希类型的数据: eg:向Redis中存入(hset)一个哈希类的值 key-value
        jedis.hset("myhash","addr","beijing");

        //获取哈希的值:hget , 指定key,指定value
        String hValue = jedis.hget("myhash", "addr");
        System.out.println("hValue="+hValue);

    
    "(3)java中Redis的通用命令!!!"
        Set<String> keys = jedis.keys("*");  (=keys *)

    
     //3.关闭连接
        jedis.close();
    
    
    }

2.使用Spring Data Redis 操作Redis(!!!!!!!!!!)

1."在Spring Boot项目中,使用Spring Data Redis来简化Redis操作!!!!!!!!!"
  //操作Redis:通过redisTemplate模板类 调用相应的方法可以获取相应的对象,然后通过相应的对象来操作相应的数据!!!
  Spring Data Redis 底层是对jedis作的封装
2.导入maven坐标:spring-boot-starter-data-redis
    
    

Spring Data Redis

Spring Data Redis 提供了一个高度封装的类:" RedisTemplate ",针对jedis客户端中大量的api进行来归类封装,将同一类型操作封装为operation接口,具体分类如下:
  
  ValueOperations:简单K-V操作 (eg:String类型的数据) 
  SetOperations:set类型数据操作 
  ZSetOperations:zset类型数据操作(eg:有序集合类型的数据)
  HashOperations:针对map类型的数据操作
  ListOperations:针对list类型的数据进行操作
  
  注意:"5个接口,来操作5种对应的数据类型"
  

(1)Spring Data Redis 操作String数据

public class SpringDataRedisTest {

    @Autowired
    private RedisTemplate redisTemplate; //只要application.yml中写了配置,就可以注入进来

 //操作Redis:通过redisTemplate模板类 调用相应的方法可以获取相应的对象,然后通过相应的对象来操作相应的数据!!!

    /**
     * (1)操作String类型数据,即简单的K-V
     * -->通过redisTemplate调用opsForValue()方法获得ValueOperations对象,然后使用这个对象来通过set等方法对String数据进行操作
     */
    @Test
    public void testString(){
       /*ValueOperations valueOperations = redisTemplate.opsForValue(); //获取对象
       valueOperations.set("city","beijing"); */

        //a:通过set方法为String类型数据赋值
        redisTemplate.opsForValue().set("city123","beijing"); //连着写
        //b:通过get方法获取
        String value=(String) redisTemplate.opsForValue().get("city123");
        System.out.println("Value="+value);
        //c:设置过期时间
        redisTemplate.opsForValue().set("key0","value0",10l, TimeUnit.SECONDS); //key-value 10 单位:秒
        //d:只有key不存在时设置key的值,如果key存在就不执行 (set key value)
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city123", "nanjing");
        System.out.println("aBoolean="+aBoolean); //false:代表"city123"已经存在,不会执行这条语句
    }
}

(2)Spring Data Redis 操作Hash数据

/**
     * (2)操作Hash类型数据
     * -->通过redisTemplate调用opsForHash()方法获得HashOperations对象,然后使用这个对象来通过put等方法对Hash数据进行操作
     */
    @Test
    public void testHash(){

        //获取hashOperations对象
        HashOperations hashOperations = redisTemplate.opsForHash();

        //a:存值:使用Hash"存储"对象的数据 (eg:为对象002存储数据)
        hashOperations.put("002","name","ikun");
        hashOperations.put("002","aeg","20");
        hashOperations.put("002","addr","beijing");

        //b:取值
        String age = (String)hashOperations.get("002", "age");
        System.out.println("age="+age);

        //c:获取hash结构中所有的字段(field)
        Set keys = hashOperations.keys("002");
        for (Object key : keys) {
            System.out.println(key);
        }

        //d:获取hash结构中所有的值value
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }

(3)Spring Data Redis 操作List列表数据


    /**
     * (3)操作List类型数据
     *  -->通过redisTemplate调用opsForList()方法获得listOperations对象,然后使用这个对象来通过leftPush等方法对List数据进行操作
     */

    @Test
    public void testList(){

        //获得listOperations对象
        ListOperations listOperations = redisTemplate.opsForList();

        //a:存数据(leftPus):根据插入的顺序进行排序,且可以有重复元素
        listOperations.leftPush("mylist1","a"); //存一个
        listOperations.leftPushAll("mylist1","b","c","d");//存多个

        //b:取值:range()
        List<String> mylist = listOperations.range("mylist1", 0, -1);
        for (String value : mylist) {
            System.out.println(value);
        }

        //c:获取列表长度:size()
        Long size = listOperations.size("mylist1");
        System.out.println("size="+size);

        //d:rightPop() key :移除并获取列表中的"最后一个元素"
        Object o = listOperations.rightPop("mylist1");
        System.out.println(o);
    }

(4)Spring Data Redis 操作Set无序集合数据

 /**
     * (4)操作Set类型数据:无序且不可重复
     * -->通过redisTemplate调用opsForSet()方法获得setOperations对象,然后使用这个对象来通过add()等方法对Set数据进行操作
     */

    @Test
    public void testSet(){
        //获取setOperations对象
        SetOperations setOperations = redisTemplate.opsForSet();

        //a:存值:add()
        setOperations.add("myset","a","b","c","a");

        //b:取值:members()
        Set<String>myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }

        //c:删除成员:remove()
        setOperations.remove("myset","a","b");

        System.out.println("111");
        //取值:members()
        myset = setOperations.members("myset");
        for (String o : myset) {
            System.out.println(o);
        }

(5)Spring Data Redis 操作ZSet有序集合数据


    /**
     * (5)操作ZSet有序集合:有序(是根据分数从小到大进行排序)且不可重复
     * -->通过redisTemplate调用opsForZSet()方法获得zSetOperations对象,然后使用这个对象来通过add()等方法对ZSet数据进行操作
     */

    @Test
    public void testZSet(){
        //获取zSetOperations对象
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //a:存值:add() key-value-source(double类型)
        zSetOperations.add("myZset","a",10.0);
        zSetOperations.add("myZset","b",11.0);
        zSetOperations.add("myZset","c",12.0);
        zSetOperations.add("myZset","a",13.0); //会覆盖原来a的值,所以a=13

        //b:取值:range()
        Set<String> myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println("s="+s);
        }
        
        ------------------->: b、c、a

        //c:修改分数:incrementScore():为myZset成员的b元素,增加20分
        zSetOperations.incrementScore("myZset","b",20.0);

        //取值:range()
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println("修改完分数之后的排序s1="+s);
        }
        
         ------------------->: c、a、b


        //d:删除成员:remove()
        zSetOperations.remove("myZset","a","b");

        //取值:range()
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println("删除a,b元素之后的排序s2="+s);
        }
        
         ------------------->: c

    }

(6)通用操作:针对不同的数据类型都可以操作

 /**
     * (6)通用操作
     *
     */
    @Test
    public void testCommon(){

        //a:获取Redis中所有的key -->keys("*")
        Set keys = redisTemplate.keys("*");
        for (Object key : keys) {
            System.out.println("key="+key);
        }

        //b:判断某个key是否存在 -->hasKey("key名称")
        Boolean b = redisTemplate.hasKey("itcast");
        System.out.println(b);

        //c:删除指定key -->delete("key名称")
        redisTemplate.delete("myZset");

        //d:获取指定key对应的value的数据类型 --type("key名称")
        DataType dataType = redisTemplate.type("mySet");
        System.out.println("Myset的数据类型是:"+dataType);
    }