Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。Redis是 NoSQL技术阵营中的一员,它通过多种键值数据类型来适应不同场景下的存储需求,借助一些高层级的接口使用其可以胜任,如缓存、队列系统的不同角色。通过jedis可以在java客户端对redis进行一些操作。

注意:这一篇结合上一篇redis的常用操作看更佳,连接如下:redis常用操作

目录

1、jedis入门案例

2、string类型常见操作

3、list类型常见操作

4、hash类型常见操作

5、set类型常见操作

6、sorted类型常见操作

7、key的常见操作

8、redis数据可持久化


1、jedis入门案例

这里需要注意的是正常这样写会报错,我们首先需要导入jedis的jar包,同时我们需要进行如下3步操作:

  1. redis服务器是否开启,需要使用命令开启redis服务器
  2. linux的防火墙是否关闭,对于防火墙可开放对应端口,或者直接关闭防火墙,开放对应端口如下,输入:systemctl stop firewalld.service   执行停止运行防火墙命令
  3. 我们需要在redis.conf文件中设置密码,我将密码改为123456,即requirepass 123456
public class RedisTest {
    public static void main(String[] args) {
        test1() ;
    }

    private static void test1() {
        Jedis jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        jedis.set("foo","bar") ;
        System.out.println(jedis.get("foo"));
    }
}

2、string类型常见操作

import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisTest {
    private static Jedis jedis ;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        test1() ;
    }

    private static void test1() {
        //测试set和get
        jedis.set("username","tom") ;
        System.out.println(jedis.get("username"));

        //演示mset和mget
        jedis.mset("password","123","age","18") ;
        List<String> values = jedis.mget("username","password","age") ;
        System.out.println(values);

        //演示append,setrange,getrange
        jedis.append("username", " is boy") ;
        System.out.println(jedis.get("username"));
        jedis.setrange("username",7,"girl") ;
        System.out.println(jedis.get("username"));
        System.out.println(jedis.getrange("username",0,-1));
        
    }
}

3、list类型常见操作

import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;

import java.util.List;

public class RedisTest {
    private static Jedis jedis ;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        test1() ;
    }

    private static void test1() {
      //测试lpush和lrange
        jedis.lpush("names","张三","李四","tom","john");
        List<String> list = jedis.lrange("names",0,-1) ;
        System.out.println(list);

        //测试lset
//        jedis.lset("names",1,"王五") ;
//        List<String> list1 = jedis.lrange("names",0,-1) ;
//        System.out.println(list1);
        System.out.println(jedis.lindex("names",1));

        //测试linsert
        jedis.linsert("names", BinaryClient.LIST_POSITION.BEFORE,"tom","steve") ;
        List<String> list1 = jedis.lrange("names",0,-1) ;
        System.out.println(list1);

        //测试lrem
        jedis.lrem("names",2,"tom") ;
        List<String> list2 = jedis.lrange("names",0,-1) ;
        System.out.println(list2);

    }
}

4、hash类型常见操作

import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class RedisTest {
    private static Jedis jedis ;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        test1() ;
    }

    private static void test1() {
        //hset和hget测试
        jedis.hset("user","username","tom") ;
        String value = jedis.hget("user","username") ;
        System.out.println(value);

        //hmset和hmget
        Map<String,String> map = new HashMap<String,String>() ;
        map.put("password","123") ;
        map.put("age","15") ;
        map.put("sex","male") ;
        map.put("username","james") ;
        jedis.hmset("user",map) ;
        List<String> hmget = jedis.hmget("user", "username", "password", "age");
        System.out.println(hmget) ;

        //测试hgetall hkeys kvals
        Map<String, String> user = jedis.hgetAll("user");
        for(String key : user.keySet()){
            System.out.println(key + "   " + map.get(key));
        }

        Set<String> user1 = jedis.hkeys("user");
        System.out.println(user1);

        List<String> user2 = jedis.hvals("user");
        System.out.println(user2);

        //测试hdel
        jedis.hdel("user","username","password") ;
        Map<String, String> user3 = jedis.hgetAll("user");
        System.out.println(user3);


    }
}

5、set类型常见操作

import redis.clients.jedis.Jedis;
import java.util.Set;

    public class RedisTest {
    private static Jedis jedis ;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        test1() ;
    }

    private static void test1() {
        //测试sadd smembers
        jedis.sadd("language1","java","c","python","matlab") ;
        Set<String> language1 = jedis.smembers("language1");
        System.out.println(language1);

        //测试srem
        jedis.srem("language1","c") ;
        Set<String> language11 = jedis.smembers("language1");
        System.out.println(language11);

        //测试sdiff
        jedis.sadd("l1","java","c","IOS","android") ;
        jedis.sadd("l2","java","python","c++") ;
        Set<String> sdiff = jedis.sdiff("l1", "l2");
        System.out.println(sdiff);

        //测试sinter
        Set<String> sinter = jedis.sinter("l1", "l2");
        System.out.println(sinter);

        //测试sunion
        Set<String> sunion = jedis.sunion("l1", "l2");
        System.out.println(sunion);


    }
}

6、sorted类型常见操作

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

    public class RedisTest {
    private static Jedis jedis ;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        test1() ;
    }

    private static void test1() {
        //测试zadd zrange zrangeByScore
        Map<String,Double> map = new HashMap<String,Double>() ;
        map.put("张三",18.00) ;
        map.put("李四",19.00) ;
        map.put("王五",17.23) ;
        map.put("马六",19.02) ;
        jedis.zadd("zkey",map) ;
        Set<String> zkey = jedis.zrange("zkey", 0, -1);
        System.out.println(zkey);

        Set<String> zkey1 = jedis.zrangeByScore("zkey", 17, 18);
        System.out.println(zkey1);

        //zrangeWithScores
        Set<Tuple> zkey2 = jedis.zrangeWithScores("zkey", 0, -1);
        for(Tuple t : zkey2){
            System.out.println(t.getScore() + " " + t.getElement());
        }

        //zrank
        System.out.println(jedis.zrank("zkey","李四")) ;

        //zscore
        System.out.println(jedis.zscore("zkey","李四"));

        //zrem
        jedis.zrem("zkey","李四") ;
        System.out.println(jedis.zrange("zkey",0,-1));
        

    }
}

7、key的常见操作

import redis.clients.jedis.Jedis;

import java.util.Set;


public class RedisTest {
    private static Jedis jedis ;
    public static void main(String[] args) {
        jedis = new Jedis("192.168.102.129") ;
        jedis.auth("123456") ;
        test1() ;
    }

    private static void test1() {
        //keys pattern
        Set<String> s = jedis.keys("*") ;
        System.out.println(s);

        //del
        jedis.del("user") ;
        System.out.println(s);

        //key的时间设置
        jedis.expire("username",200) ;
        Long ttl = jedis.ttl("username");
        System.out.println(ttl);
        jedis.persist("username") ;
        

    }
}

8、redis数据可持久化

8.1 redis数据持久化机制介绍

1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。   

2). AOF(append only file)持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

3). 同时应用AOF和RDB。

4). 无持久化:可通过配置的方式禁用Redis服务器的持久化功能,这样我们就可以将Redis视为一个功能加强版的memcached了.

8.2 ROB和AOF对比

  1. RDB存在哪些优势呢?

    1). 数据的备份和恢复非常方便,因为一个数据库只有一个持久化文件

    2). 性能最大化。对于Redis的服务进程而言,在开始持久化时,它唯一需要做的只是fork出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行IO操作了。

    3). 相比于AOF机制,如果数据集很大,RDB的启动效率会更高。

     2.RDB又存在哪些劣势呢?

    1).系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

    2). 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。

     3.AOF的优势有哪些呢?

1). 该机制可以带来更高的数据安全性,即数据持久性。Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步。

2).对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。

3). 如果日志过大,Redis可以自动启用rewrite机制迅速“瘦身”(也可手动触发aof的rewrite操作,命令: bgrewriteaof)

    4). AOF日志格式清晰、易于理解,很容易用AOF日志文件完成数据的重建。

    4.AOF的劣势有哪些呢?

    1). 对于相同数量的数据集而言,AOF文件通常要大于RDB文件。

    2). 根据同步策略的不同,AOF在运行效率上往往会慢于RDB。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效。