目录

  • Jedis的基本使用
  • Jedis常用api
  • 操作key相关api
  • 操作String相关api
  • 操作List相关api
  • 操作Set相关api
  • 操作ZSet相关api
  • 操作Hash相关api
  • Jedis连接池的基本概念
  • JedisPool的基本使用
  • Jedis连接池工具类
  • Demo

Jedis的基本使用

跳转到目录

  • Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如JavaC、C#、C++、php、Node.js、Go等。 在官方网站里列一些Java的客户端,有JedisRedisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,Jedis同样也是托管在github上,地址: https://github.com/xetorthio/jedis
1、引入依赖
<!--引入jedis连接依赖-->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.9.0</version>
</dependency>
2、创建jedis对象
public static void main(String[] args) {
  //1.创建jedis对象
  Jedis jedis = new Jedis("192.168.40.4", 6379);//1.redis服务必须关闭防火墙  2.redis服务必须开启远程连接
  jedis.select(0);//选择操作的库默认0号库
  //2.执行相关操作
  //....
  //3.释放资源
  jedis.close();
}
Jedis常用API

跳转到目录

方法

解释

new Jedis(host, port)

创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口

set(key,value)

设置字符串类型的数据

get(key)

获得字符串类型的数据

hset(key,field,value)

设置哈希类型的数据

hget(key,field)

获得哈希类型的数据

lpush(key,values)

设置列表类型的数据

lpop(key)

列表左面弹栈

rpop(key)

列表右面弹栈

del(key)

删除指定的key

操作key相关api

跳转到目录

public class TestKey {
    private Jedis jedis;

    @Before
    public void before(){
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
        jedis.close();
    }


    //测试key相关
    @Test
    public void testKeys(){
        //删除一个key
        jedis.del("name");
        //删除多个key
        //jedis.del("name","age");

        //判断一个key是否存在exits
        Boolean name = jedis.exists("name");
        System.out.println(name);

        //设置一个key超时时间 expire pexpire
        //Long age = jedis.expire("age", 100);
        //System.out.println(age);

        //获取一个key超时时间 ttl
        Long age1 = jedis.ttl("newage");
        System.out.println(age1);

        //随机获取一个key
        String s = jedis.randomKey();

        //修改key名称
       // jedis.rename("age","newage");

        //查看可以对应值的类型
        String name1 = jedis.type("name");
        System.out.println(name1);
        String maps = jedis.type("maps");
        System.out.println(maps);
    }

}
操作String相关api

跳转到目录

public class TestString {
    private Jedis jedis;

    @Before
    public void before(){
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
        jedis.close();
    }

    //测试String相关
    @Test
    public void testString(){
        //set
        jedis.set("name","小陈");
        //get
        String s = jedis.get("name");
        System.out.println(s);
        //mset
        jedis.mset("content","好人","address","海淀区");
        //mget
        List<String> mget = jedis.mget("name", "content", "address");
        mget.forEach(v-> System.out.println("v = " + v));
        //getset
        String set = jedis.getSet("name", "小明");
        System.out.println(set);

        //............
    }
}
操作List相关api

跳转到目录

public class TestList {
    private Jedis jedis;

    @Before
    public void before(){
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
        jedis.close();
    }

    //测试List相关
    @Test
    public void testList(){

        //lpush
        jedis.lpush("names1","张三","王五","赵柳","win7");

        //rpush
        jedis.rpush("names1","xiaomingming");

        //lrange

        List<String> names1 = jedis.lrange("names1", 0, -1);
        names1.forEach(name-> System.out.println("name = " + name));

        //lpop rpop
        String names11 = jedis.lpop("names1");
        System.out.println(names11);

        //llen
        jedis.linsert("lists", BinaryClient.LIST_POSITION.BEFORE,"xiaohei","xiaobai");
    
    }

}
操作Set相关api

跳转到目录

public class TestSet {
    private Jedis jedis;

    @Before
    public void before(){
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
        jedis.close();
    }


    //测试SET相关
    @Test
    public void testSet(){

        //sadd
        jedis.sadd("names","zhangsan","lisi");

        //smembers
        jedis.smembers("names");

        //sismember
        jedis.sismember("names","xiaochen");

        //...
    }

}
操作Zset相关api

跳转到目录

public class TestZSet {
    private Jedis jedis;

    @Before
    public void before(){
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
        jedis.close();
    }


    //测试ZSET相关
    @Test
    public void testZset(){

        //zadd
        jedis.zadd("names",10,"张三");

        //zrange
        jedis.zrange("names",0,-1);

        //zcard
        jedis.zcard("names");

        //zrangeByScore
        jedis.zrangeByScore("names","0","100",0,5);

        //..

    }

}
操作Hash相关api

跳转到目录

public class TestHash {
    private Jedis jedis;

    @Before
    public void before(){
        this.jedis = new Jedis("192.168.202.205", 7000);
    }

    @After
    public void after(){
        jedis.close();
    }

    //测试HASH相关
    @Test
    public void testHash(){
        //hset
        jedis.hset("maps","name","zhangsan");
        //hget
        jedis.hget("maps","name");
        //hgetall
        jedis.hgetAll("mps");
        //hkeys
        jedis.hkeys("maps");
        //hvals
        jedis.hvals("maps");
        //....
    }
}

Jedis连接池的基本概念

跳转到目录

  • jedis连接资源创建销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术jedisPool创建时初始化一些连接资源存储到连接池中,使用jedis连接资源时不需要创建,而是从连接池中获取一个资源进行redis的操作,使用完毕后,不需要销毁该jedis连接资源,而是将该资源归还给连接池,供其他请求使用。
JedisPool的基本使用

跳转到目录

/**
 * 候选版本: release candidate稳定候选版
 * @author guizy
 */
public class RedisUtilRC {

    private static JedisPool pool = null;

    static {
        //1. 配置连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 初始化
        poolConfig.setMinIdle(10);
        // 最大空闲
        poolConfig.setMaxIdle(5);
        // 最多有多少个
        poolConfig.setMaxWaitMillis(100);

        //2. 获取连接(使用连接池)
        pool = new JedisPool(poolConfig, "localhost", 6379);
    }

    public static Jedis getConnecttion(){

        // 从连接池中获取
        Jedis connection = pool.getResource();

        return connection;

    }

    public static void closePool(){
        pool.close();
    }

    public static void main(String[] args) {

       /* //1. 配置连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 初始化
        poolConfig.setMinIdle(10);
        // 最大空闲
        poolConfig.setMaxIdle(5);
        // 最多有多少个
        poolConfig.setMaxWaitMillis(100);

        //2. 获取连接(使用连接池)
        JedisPool pool = new JedisPool(poolConfig, "localhost", 6379);
        // 从连接池中获取
        Jedis connection = pool.getResource();

        //3. 操作方法
        String str = connection.get("test");
        System.out.println(str);

        //4. 归还给连接池
        connection.close();*/

    }
}
Jedis连接池工具类

跳转到目录

/**
 * 候选版本: release candidate稳定候选版
 *
 * @author ZYGui
 */
public class RedisUtil2 {

    private static JedisPool pool = null;

    static {
        //1. 配置连接池
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

        /*
            除了 properties来读取配置文件往外
            在Java.util包 resourceBundle就是用来解析properties
        */

        // 读取配置文件
        ResourceBundle rb = ResourceBundle.getBundle("redis");
        int minIdle = Integer.parseInt(rb.getString("redis.minIdle"));
        int maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
        int maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
        int maxWaitMillis = Integer.parseInt(rb.getString("redis.maxWaitMillis"));
        String host = rb.getString("redis.host");
        int port = Integer.parseInt(rb.getString("redis.port"));

        poolConfig.setMinIdle(minIdle);
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMaxWaitMillis(maxWaitMillis);
        poolConfig.setMaxTotal(maxTotal);

        pool = new JedisPool(poolConfig, host, port);

		/*
		Properties properties = new Properties();
        try {
            properties.load(RedisUtil.class.getClassLoader().getResourceAsStream("redis.properties"));
            int minIdle = Integer.parseInt(properties.getProperty("redis.minIdle"));
            int maxIdle = Integer.parseInt(properties.getProperty("redis.maxIdle"));
            int maxTotal = Integer.parseInt(properties.getProperty("redis.maxTotal"));
            int maxWaitMillis = Integer.parseInt(properties.getProperty("redis.maxWaitMillis"));
            String host = properties.getProperty("redis.host");
            int port = Integer.parseInt(properties.getProperty("redis.port"));

            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);
            poolConfig.setMaxTotal(maxTotal);

            pool = new JedisPool(poolConfig, host, port);

        } catch (Exception e){
        }
		*/

    }

    public static Jedis getConnecttion() {

        // 从连接池中获取
        Jedis connection = pool.getResource();

        return connection;

    }

    public static void closePool() {
        pool.close();
    }

    public static void main(String[] args) {

        Jedis connection = getConnecttion();

        String str = connection.get("test");
        System.out.println(str);

        connection.close();
    }
}

Demo

跳转到目录

  • 案例需求:
  • 提供index.html页面,页面中有一个省份下拉列表
  • 当页面加载完成后发送ajax请求,加载所有省份
  • 注意:使用redis缓存一些不经常发生变化的数据
  • 数据库的数据一旦发生改变,则需要更新缓存
  • 数据库的表执行 增删改的相关操作,需要将redis缓存数据清除,再次存入
  • service对应的增删改方法中,将redis数据删除。(因为不删除,数据仍然是redis缓存中的)
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="js/jquery-3.3.1.js"></script>

    <script>
        $(function () {
           /*
            * 注意: 当在Servlet中 设置 response.setContentType("application/json;charset=utf-8");
            *   不 需要将 JSON字符串 转为 JSON对象
            *   var JsonObj = JSON.parse(data);
            * */
            //发送ajax请求,加载所有省份数据
            $.get("http://localhost:8080/redis/provinceServlet",{},function (data) {
                //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]

                //1.获取select
                var province = $("#province");
                //2.遍历json数组
                $(data).each(function () {
                    //3.创建<option>
                    var option = "<option name='"+this.id+"'>"+this.name+"</option>";

                    //4.调用select的append追加option
                    province.append(option);
                });
            });


            /*
            * 注意: 当在Servlet中 设置 response.setContentType("text/html;charset=utf-8");
            *   下面两种方式都需要将 JSON字符串 转为 JSON对象
            *   var JsonObj = JSON.parse(data);
            * */
            //发送ajax请求,加载所有省份数据
            // $.get("http://localhost:8080/redis/provinceServlet",{},function (data) {
            //     //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,"name":"陕西"}]
            //
            //     //1.获取select
            //     var province = $("#province");
            //     var JsonObj = JSON.parse(data);
            //     //2.遍历json数组
            //     $(JsonObj).each(function () {
            //         //3.创建<option>
            //         var option = "<option name='"+this.id+"'>"+this.name+"</option>";
            //
            //         //4.调用select的append追加option
            //         province.append(option);
            //     });
            //
            // });
            // $.ajax({
            //     url: "http://localhost:8080/redis/provinceServlet",
            //     type: "get",
            //     success:function (data) {
            //         var jsonObj = JSON.parse(data);
            //         for (pro of jsonObj) {
            //             alert(pro.id);
            //             //3.创建<option>
            //             var option = "<option name='"+pro.id+"'>"+pro.name+"</option>";
            //             //4.调用select的append追加option
            //             $("#province").append(option);
            //         }
            //     }
            // })
        });
        
    </script>

</head>
<body>

<select id="province">
    <option>--请选择省份--</option>

</select>
</body>
</html>
  • domain
package com.sunny.domain;

public class Province {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • Dao
public class ProvinceDaoImpl implements ProvinceDao {

    //1. 声明成员变量
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

    @Override
    public List<Province> findAll() {
        // 定义sql
        String sql = "SELECT * FROM province";
        // 执行
        return template.query(sql, new BeanPropertyRowMapper<>(Province.class));
    }
}
  • Service
public class ProvinceServiceImpl implements ProvinceService {

    private ProvinceDao dao = new ProvinceDaoImpl();

    @Override
    public List<Province> findAll() {
        return dao.findAll();
    }

    /**
     * 使用redis缓存
     * @return
     */
    @Override
    public String findAllJson() {

        //1. 先从redis中查询数据
        //1.1 获取redis客户端连接
        Jedis jedis = RedisUtil.getConnecttion();
        String province_json = jedis.get("province");

        //2. 判断province_json是否为null
        if (province_json == null || province_json.length() == 0){
            // redis中没有数据
            System.out.println("redis中没有数据, 查询数据库...");
            
            //2.1 从数据库中查询
            List<Province> ps = dao.findAll();
            
            //2.2 将list序列化为json
            ObjectMapper mapper = new ObjectMapper();
            try {
                province_json = mapper.writeValueAsString(ps);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }

            //2.3 将json数据存入redis
            jedis.set("province", province_json);
            //归还连接
            jedis.close();
        } else {
            System.out.println("redis中有数据, 查询缓存...");
        }
        return province_json;
    }
}
  • Servlet
@WebServlet("/provinceServlet")
public class ProvinceServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/json;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        //1. 调用Service查询
        // ProvinceService service = new ProvinceServiceImpl();
        // List<Province> list = service.findAll();
        //2. 序列化List为JSON
        // ObjectMapper mapper = new ObjectMapper();
        // String json = mapper.writeValueAsString(list);
        // System.out.println(json); //[{"id":1,"name":"北京"},{"id":2,"name":"上海"},{"id":3,"name":"广州"},{"id":4,
        // "name":"陕西"}]

        // 添加缓存的调用
        ProvinceService service = new ProvinceServiceImpl();
        String json = service.findAllJson();
        System.out.println(json);

        //3. 响应结果
        response.getWriter().write(json);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}