Jedis-Redis的客户端--入门

来源:互联网 发布:北京python培训班 编辑:程序博客网 时间:2024/06/05 01:20

你可以选择用命令来操作redis,也可以使用客户端来操作redis。现在基本上主流的语言都有客户端支持redis的操作,比如java的客户端:有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis

关于jedis的安装就是傻瓜式安装,很简单。

下面介绍jedis的使用
1.新建一个maven项目并添加jedis依赖

<!-- redis的客户端--jedis -->        <dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>            <version>2.6.0</version>        </dependency>

这里写图片描述

2.编写jedis的第一个例子

package cn.itcast.redis;import redis.clients.jedis.Jedis;public class JedisDemo {    public static void main(String[] args) {        // 构造jedis对象        Jedis jedis = new Jedis("127.0.0.1", 6379);        // 向redis中添加数据        jedis.set("mytest", "123");        // 从redis中读取数据        String value = jedis.get("mytest");        System.out.println(value);        // 关闭连接        jedis.close();    }}

以上说明Jedis通过Java代码连接到Redis服务拿到数据。
该示例中存在的问题是:每次都要创建连接并关闭,所以要使用连接池。

3.编写jedis的第二个例子:Jedis连接池

package cn.itcast.redis;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class JedisPoolDemo {    public static void main(String[] args) {        // 构建连接池配置信息        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();        // 设置最大连接数        jedisPoolConfig.setMaxTotal(50);        // 构建连接池        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);        // 从连接池中获取连接        Jedis jedis = jedisPool.getResource();        // 读取数据        System.out.println(jedis.get("mytest"));        // 将连接还回到连接池中        jedisPool.returnResource(jedis);        // 释放连接池        jedisPool.close();    }}

4.编写jedis的第三例子:分片式集群
一个Jedis可以同时开启多个Redis服务
这里写图片描述
如果此时我们要做一个set abc 123操作,那么问题来了,连接了三个Redis我把数据放在哪个里面呢?如果每个里面都放abc 123没意义。
此时会计算key的hash值,把abc 123放到对应的Redis上。那么就要保证set与get计算的是同一个Redis才能获取对应的数据,该算法叫一致性哈希算法。

分片式集群存在的问题:
1、 水平扩展集群时,必须做数据的迁移
如果在上示意图基础上再添加一个Redis那么计算key的hash值就会发生变化。如果数据不迁移就会导致拿不到数据。做数据扩展是很不方便的。
2、 集群由客户端控制,每个集群中的节点并不知道自己处于集群环境
各Redis不知道自己处于集群环境,那么维护这个集群就会变得困难,全部由客户端维护也是不现实的。

存在上述两个问题是不是就说明分片式集群就不可用了呢?不是的,在redis3.0发布之前,都是使用分片式集群。

下面为分片式集群使用的代码:

package cn.itcast.redis;import java.util.ArrayList;import java.util.List;import redis.clients.jedis.JedisPoolConfig;import redis.clients.jedis.JedisShardInfo;import redis.clients.jedis.ShardedJedis;import redis.clients.jedis.ShardedJedisPool;/** * 集群式的连接池 *  */public class ShardedJedisPoolDemo {    public static void main(String[] args) {        // 构建连接池配置信息        JedisPoolConfig poolConfig = new JedisPoolConfig();        // 设置最大连接数        poolConfig.setMaxTotal(50);        // 定义集群信息        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();        shards.add(new JedisShardInfo("127.0.0.1", 6379));        shards.add(new JedisShardInfo("186.0.0.15", 6379));        // 定义集群连接池        ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig, shards);        ShardedJedis shardedJedis = null;        try {            // 从连接池中获取到jedis分片对象            shardedJedis = shardedJedisPool.getResource();            // 从redis中获取数据            String value = shardedJedis.get("mytest");            System.out.println(value);        } catch (Exception e) {            e.printStackTrace();        } finally {            if (null != shardedJedis) {                // 关闭,检测连接是否有效,有效则放回到连接池中,无效则重置状态                shardedJedis.close();            }        }        // 关闭连接池        shardedJedisPool.close();    }}

熟悉了redis的使用方法,下面介绍redis与spring的集成