第三章 Redis 客户端的使用 Java版【Redis入门教程】

Redis入门教程目录:【Redis入门教程目录】

Redis客户端

我们知道Redis是C语言开发的,如果想用别的语言操作Redis,那就需要用到别的语言的客户端。我们前面介绍过Redis的其中一个特性就是客户端多,几乎所有语言都有Redis的客户端,比如Java语言的JedisPython语言的redis-pyPHP语言的PredisGo语言的Redigo等等。这些客户端也都是遵循了Redis给的协议,然后按照协议去开发出对应语言的客户端。如Redis官方提供的redis-cli客户端其实就是一个Shell客户端

Jedis的使用

本篇我就讲Java语言的客户端Jedis,使用其他语言的读者可以阅读相关客户端的文档。要使用Jedis,首先确保我们已经添加了Jedis的依赖,这里我使用Maven配置



    redis.clients
    jedis
    3.0.1

复制代码

Jedis的直连

import redis.clients.jedis.Jedis;
 
public class RedisJava {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("127.0.0.1",6379);
        jedis.set("name", "redis");
        System.out.println("redis 存储的字符串为: "+ jedis.get("name"));
    }
}
复制代码

运行以上Java程序,输出

redis 存储的字符串为: redis
复制代码

Jedis的连接池

import redis.clients.jedis.Jedis;
 
public class RedisPool {
    public static void main(String[] args) {
        //初始化连接池
        JedisPoolConfig config=new JedisPoolConfig();
        JedisPool jedisPool=new JedisPool(config,"127.0.0.1",6379);
        
        Jedis jedis=null;
        try{
            jedis=jedisPool.getResource(); // 获取连接
            jedis.set("name", "redis"); // 设置值
            String value=jedis.get("name"); // 获取值
            System.out.println(value);
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            if(jedis!=null){
                jedis.close();
            }
            if(jedisPool!=null){
                jedisPool.close();
            }
        }
    }
}
复制代码

运行以上Java程序,输出

redis
复制代码

Spring-data-redis的使用

前面我们使用了Jedis实现对Redis的操作,这里再介绍使用基于Spring的Spring-data-redis操作Redis,Spring就不用我过多介绍了,相信学Java的都认识它。
Jedis与Spring-data-redis的区别和关系:

  • Jedis:Jedis是Redis的Java客户端,通过它可以对Redis进行操作,与之功能相似的还包括Lettuce等。
  • Spring-data-redis:Spring-data-redis对Redis的操作依赖Jedis或Lettuce,实际上是对Jedis、Lettuce这些客户端的封装,提供一套与客户端无关的api供应用使用,从而你在从一个redis客户端切换为另一个客户端,不需要修改业务代码。

添加依赖

在使用Spring-data-redis前首先确保我们已经添加了相关依赖,这里我使用Maven配置


    org.springframework
    spring-core
    5.1.3.RELEASE




    org.springframework
    spring-web
    5.1.3.RELEASE




    org.springframework
    spring-jdbc
    5.1.3.RELEASE




    org.springframework
    spring-webmvc
    5.1.3.RELEASE




    org.springframework
    spring-context
    5.1.3.RELEASE




    org.springframework
    spring-context-support
    5.1.3.RELEASE




    org.springframework
    spring-aop
    5.1.3.RELEASE




    org.springframework
    spring-test
    5.1.3.RELEASE
    test





    mysql
    mysql-connector-java
    8.0.13




    javax.servlet
    javax.servlet-api
    4.0.1
    provided




    redis.clients
    jedis
    2.7.0




    org.springframework.data
    spring-data-redis
    1.5.0.RELEASE

复制代码

Spring和Spring-data-redis整合

通过XML配置文件将Spring-data-redis连接池Redis模板注入到Spring容器中。Redis模板有2个,分别是RedisTemplateStringRedisTemplate,这两个模板的区别是采用的序列化策略不一样,前者采用的是Java原生的序列化后者采用的是String序列化。模板的好处是为Redis的交互提供了高级抽象,用户无需关注Redis的连接管理、序列化等问题,把更多注意力放在业务上。 redis.properties:

#ip地址
redis.host.ip=192.168.174.129
#端口号
redis.port=6379
#如果有密码
redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=3000

#最大空闲数
redis.maxIdle=6
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600maxIdle
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=20
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=3000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=4
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
复制代码

spring-redis.xml:


"classpath:redis.properties" ignore-unresolvable="true"/>


"jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    
    "maxIdle" value="${redis.maxIdle}" />
    
    "maxTotal" value="${redis.maxTotal}" />
    
    "maxWaitMillis" value="${redis.maxWaitMillis}" />
    
    "minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
    
    "numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />
    
    "timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />



"connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    
    "poolConfig" ref="jedisPoolConfig">
    
    "hostName" value="${redis.host.ip}">
    
    
    
    "port" value="${redis.port}">
    
    "timeout" value="${redis.timeout}">



"redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    "connectionFactory" ref="connectionFactory" />
    



"stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    "connectionFactory" ref="connectionFactory" />

复制代码

SpringSpring-data-redis整合完成之后,一般为了方便使用模板,我们会将模板进一步封装成自己的Dao工具类,这里我仅封装几个操作,如下 RedisDaoImpl.java

@Repository
public class RedisDaoImpl implements RedisDao {
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    public void setString(Object redisKey, Object redisValue) {
        ValueOperations valueOperations = stringRedisTemplate.opsForValue();
        valueOperations.set(redisKey, redisValue);

    }

    public Object getString(Object redisKey) {
        ValueOperations valueOperations = stringRedisTemplate.opsForValue();
        return valueOperations.get(redisKey);
    }

    /**
     * @description: 通过redisKey 批量(map)设置redisValue(hash)
     * @param: [redisKey, redisValue]
     * @return: void
     * @author: Xue 8
     * @date: 2019/2/14
     */
    public void setHashAll(Object redisKey, Map redisValue){
        HashOperations hashOperations = stringRedisTemplate.opsForHash();
        hashOperations.putAll(redisKey, redisValue);
    }

    /**
     * @description: 通过redisKey、hashKey、hashValue设置单个redisValue(hash)
     * @param: [redisKey, hashKey, hashValue]
     * @return: void
     * @author: Xue 8
     * @date: 2019/2/14
     */
    public void setHash(Object redisKey, Object hashKey, Object hashValue){
        HashOperations hashOperations = stringRedisTemplate.opsForHash();
        hashOperations.put(redisKey, hashKey, hashValue);
    }

    /**
     * @description: 通过redisValue、hashKey获取hashValue
     * @param: [redisKey, hashKey]
     * @return: java.lang.Object
     * @author: Xue 8
     * @date: 2019/2/14
     */
    public Object getHashValue(Object redisKey, Object hashKey){
        HashOperations hashOperations = stringRedisTemplate.opsForHash();
        return hashOperations.get(redisKey, hashKey);
    }

    /**
     * @description: 通过redisKey获取hash
     * @param: [redisKey]
     * @return: java.util.Map
     * @author: Xue 8
     * @date: 2019/2/14
     */
    public Map getHash(Object redisKey){
        HashOperations hashOperations = stringRedisTemplate.opsForHash();
        return hashOperations.entries(redisKey);
    }

    /**
     * @description: 通过redisKey设置redisValue(List)
     * @param: [redisKey, redisValue]
     * @return: void
     * @author: Xue 8
     * @date: 2019/2/14
     */
    public void setList(Object redisKey, List redisValue){
        ListOperations listOperations = stringRedisTemplate.opsForList();
        listOperations.leftPushAll(redisKey, redisValue);
    }

}
复制代码 
   

之后在需要操作到Redis的地方,直接调用RedisDaoImpl即可。

转载于:https://juejin.im/post/5c664b1e51882562914ec10c

你可能感兴趣的:(第三章 Redis 客户端的使用 Java版【Redis入门教程】)