zoukankan      html  css  js  c++  java
  • Redis客户端操作之Jedis

      在前面的文章给大家详细的介绍了Redis各种知识点,本文主要给大家介绍下java程序怎么操作Redis数据。


    Redis之集群环境搭建


      Redis官网中提供了各种语言的客户端,使用起来很方便,本文主要介绍java中常用的Jedis
    在这里插入图片描述在这里插入图片描述

    Jedis

      Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对redis各类API进行封装调用,通过这些API我们会非常方便的操作我们的Redis数据库。

    redis配置的修改

    1.注释掉绑定的信息

      在redis.conf的配置文件中bind配置的信息表示的是redis服务可以接收外部访问的地址,这个主要还是为了提高安全性,我们在学习阶段可以将这个信息直接注释掉,这样的话任意的外部ip地址都可以访问。bind是protected-mode配合使用的

    bind 127.0.0.1
    

    2.关闭保护模式

      redis3.2版本后新增protected-mode配置,默认是yes,即开启。设置外部网络连接redis服务,设置方式如下:
    1、关闭protected-mode模式,此时外部网络可以直接访问
    2、开启protected-mode保护模式,需配置bind ip或者设置访问密码

    创建项目

    创建maven的java项目,添加如下maven坐标

    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    	<version>2.9.0</version>
    </dependency>
    <dependency>
    	<groupId>junit</groupId>
    	<artifactId>junit</artifactId>
    	<version>3.8.1</version>
    </dependency>
    

    Redis单机版

    案例代码:

    	/**
    	 * 测试是否连接成功
    	 */
    	public void ping(){
    		Jedis jedis = new Jedis("192.168.88.124", 6379);
    		System.out.println(jedis.ping());
    		
    	}
    
    	/**
    	 * 设置key/value对
    	 */
    	public void set(){
    		Jedis jedis = new Jedis("192.168.88.124", 6379);
    		jedis.set("name", "張三");
    		jedis.set("age", "18");
    		jedis.close();
    	}
    	
    	/**
    	 * 通过key获取对应的value
    	 */
    	public void get(){
    		Jedis jedis = new Jedis("192.168.88.124", 6379);
    		String name = jedis.get("name");
    		String age = jedis.get("age");
    		System.out.println(name+"--"+age);
    		jedis.close();
    	}
    	
    	/**
    	 * 通过Jedis的连接池Pool
    	 */
    	public void testJedisPool() {
    		// 创建Jedis连接池
    		JedisPool pool = new JedisPool("192.168.88.124", 6379);
    		// 从连接池中获取Jedis对象
    		Jedis jedisItem = pool.getResource();
    		
    		String name = jedisItem.get("name");
    		System.out.println(name);
    		
    		jedisItem.close();
    		pool.close();
    	}
    	
    	/**
    	 * 操作incr方法自增1
    	 */
    	public void incr(){
    		Jedis jedis = new Jedis("192.168.88.124", 6379);
    		Long age = jedis.incr("age");
    		System.out.println(age);
    	}
    

    redis中的数据
    在这里插入图片描述
    操作控制台的输出
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    Redis集群版

    	/**
    	 * 操作Redis集群的数据
    	 * @throws IOException 
    	 */
    	public void testRedisCluster() throws IOException{
    		JedisPoolConfig pool = new JedisPoolConfig();
    		// 设置最大的空闲数
    		pool.setMaxIdle(2);
    		// 设置最大连接数
    		pool.setMaxTotal(30);
    		Set<HostAndPort> nodes = new HashSet<>();
    		nodes.add(new HostAndPort("192.168.88.121", 7001));
    		nodes.add(new HostAndPort("192.168.88.121", 7002));
    		nodes.add(new HostAndPort("192.168.88.121", 7003));
    		nodes.add(new HostAndPort("192.168.88.121", 7004));
    		nodes.add(new HostAndPort("192.168.88.121", 7005));
    		nodes.add(new HostAndPort("192.168.88.121", 7006));
    		JedisCluster jedis = new JedisCluster(nodes,pool );
    		String name = jedis.set("name","lisi");
    		System.out.println(name);
    		jedis.close();
    		pool.clone();
    	}
    

    在这里插入图片描述

    Jedis整合Spring

      Jedis单独使用情况还是比较少的,实际开发中和spring整合使用的场景还是比较多的,所以此处介绍下和spring一块使用的情况
    maven坐标

    	<dependencies>
    		<dependency>
    			<groupId>redis.clients</groupId>
    			<artifactId>jedis</artifactId>
    			<version>2.9.0</version>
    		</dependency>
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>3.8.1</version>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>4.3.3.RELEASE</version>
    		</dependency>
    	</dependencies>
    

    在这里插入图片描述

    Redis单机环境

    spring的配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    	<!-- 连接池配置 -->
    	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    		<!-- 最大连接数 -->
    		<property name="maxTotal" value="30" />
    		<!-- 最大空闲连接数 -->
    		<property name="maxIdle" value="10" />
    		<!-- 每次释放连接的最大数目 -->
    		<property name="numTestsPerEvictionRun" value="1024" />
    		<!-- 释放连接的扫描间隔(毫秒) -->
    		<property name="timeBetweenEvictionRunsMillis" value="30000" />
    		<!-- 连接最小空闲时间 -->
    		<property name="minEvictableIdleTimeMillis" value="1800000" />
    		<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
    		<property name="softMinEvictableIdleTimeMillis" value="10000" />
    		<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
    		<property name="maxWaitMillis" value="1500" />
    		<!-- 在获取连接的时候检查有效性, 默认false -->
    		<property name="testOnBorrow" value="false" />
    		<!-- 在空闲时检查有效性, 默认false -->
    		<property name="testWhileIdle" value="false" />
    		<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
    		<property name="blockWhenExhausted" value="false" />
    	</bean>
    	<!-- jedis客户端单机版 -->
    	<bean id="redisClient" class="redis.clients.jedis.JedisPool">
    		<constructor-arg name="host" value="192.168.88.124"></constructor-arg>
    		<constructor-arg name="port" value="6379"></constructor-arg>
    		<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
    	</bean>
    </beans>
    

    测试代码

    public void test1(){
    	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    	JedisPool pool = ac.getBean("redisClient",JedisPool.class);
    	Jedis jedis = pool.getResource();
    	String type = jedis.set("address", "sz");
    	System.out.println(type);
    	jedis.close();
    	pool.close();
    }
    

    在这里插入图片描述
    在这里插入图片描述

    Redis集群环境

    配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    	<!-- 连接池配置 -->
    	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    		<!-- 最大连接数 -->
    		<property name="maxTotal" value="30" />
    		<!-- 最大空闲连接数 -->
    		<property name="maxIdle" value="10" />
    		<!-- 每次释放连接的最大数目 -->
    		<property name="numTestsPerEvictionRun" value="1024" />
    		<!-- 释放连接的扫描间隔(毫秒) -->
    		<property name="timeBetweenEvictionRunsMillis" value="30000" />
    		<!-- 连接最小空闲时间 -->
    		<property name="minEvictableIdleTimeMillis" value="1800000" />
    		<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
    		<property name="softMinEvictableIdleTimeMillis" value="10000" />
    		<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
    		<property name="maxWaitMillis" value="1500" />
    		<!-- 在获取连接的时候检查有效性, 默认false -->
    		<property name="testOnBorrow" value="false" />
    		<!-- 在空闲时检查有效性, 默认false -->
    		<property name="testWhileIdle" value="false" />
    		<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
    		<property name="blockWhenExhausted" value="false" />
    	</bean>
    	<!-- jedis客户端集群版 -->
    	<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
    		<constructor-arg name="nodes">
    			<set>
    				<bean class="redis.clients.jedis.HostAndPort">
    					<constructor-arg name="host" value="192.168.88.121"></constructor-arg>
    					<constructor-arg name="port" value="7001"></constructor-arg>
    				</bean>
    				<bean class="redis.clients.jedis.HostAndPort">
    					<constructor-arg name="host" value="192.168.88.121"></constructor-arg>
    					<constructor-arg name="port" value="7002"></constructor-arg>
    				</bean>
    				<bean class="redis.clients.jedis.HostAndPort">
    					<constructor-arg name="host" value="192.168.88.121"></constructor-arg>
    					<constructor-arg name="port" value="7003"></constructor-arg>
    				</bean>
    				<bean class="redis.clients.jedis.HostAndPort">
    					<constructor-arg name="host" value="192.168.88.121"></constructor-arg>
    					<constructor-arg name="port" value="7004"></constructor-arg>
    				</bean>
    				<bean class="redis.clients.jedis.HostAndPort">
    					<constructor-arg name="host" value="192.168.88.121"></constructor-arg>
    					<constructor-arg name="port" value="7005"></constructor-arg>
    				</bean>
    				<bean class="redis.clients.jedis.HostAndPort">
    					<constructor-arg name="host" value="192.168.88.121"></constructor-arg>
    					<constructor-arg name="port" value="7006"></constructor-arg>
    				</bean>
    			</set>
    		</constructor-arg>
    		<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
    	</bean>
    </beans>
    

    测试代码

    public void test1() throws IOException{
    	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    	JedisCluster jedis = ac.getBean("redisClient",JedisCluster.class);
    	String type = jedis.set("address", "sz-cluster");
    	System.out.println(type);
    	jedis.close();
    }
    

    在这里插入图片描述

    添加Jedis到Dao

      Redis是一个NOSQL数据库,我们常用来做缓存数据库。所以在实际操作的时候我们经常会把他的操作封装起来作为Dao层

    Redis单机环境

    创建接口

    package com.dpb.dao;
    /**
     * Jedis接口
     * @author dengp
     *
     */
    public interface IJedisClient {
    	
    	String get(String key);
    
    	String set(String key, String value);
    
    	String hget(String hkey, String key);
    
    	long hset(String hkey, String key, String value);
    
    	long incr(String key);
    
    	long expire(String key, int second);
    
    	long ttl(String key);
    
    	long del(String...key);
    
    	long hdel(String hkey, String...fields);
    }
    
    

    创建接口实现类

    @Component
    public class JedisClientImpl implements IJedisClient{
    
    	@Resource
    	private JedisPool jedisPool;
    
    	@Override
    	public String get(String key) {
    		Jedis jedis = jedisPool.getResource();
    		String string = jedis.get(key);
    		jedis.close();
    		return string;
    	}
    
    	@Override
    	public String set(String key, String value) {
    		Jedis jedis = jedisPool.getResource();
    		String string = jedis.set(key, value);
    		jedis.close();
    		return string;
    	}
    
    	@Override
    	public String hget(String hkey, String key) {
    		Jedis jedis = jedisPool.getResource();
    		String string = jedis.hget(hkey, key);
    		jedis.close();
    		return string;
    	}
    
    	@Override
    	public long hset(String hkey, String key, String value) {
    		Jedis jedis = jedisPool.getResource();
    		Long result = jedis.hset(hkey, key, value);
    		jedis.close();
    		return result;
    	}
    
    	@Override
    	public long incr(String key) {
    		Jedis jedis = jedisPool.getResource();
    		Long result = jedis.incr(key);
    		jedis.close();
    		return result;
    	}
    
    	@Override
    	public long expire(String key, int second) {
    		Jedis jedis = jedisPool.getResource();
    		Long result = jedis.expire(key, second);
    		jedis.close();
    		return result;
    	}
    
    	@Override
    	public long ttl(String key) {
    		Jedis jedis = jedisPool.getResource();
    		Long result = jedis.ttl(key);
    		jedis.close();
    		return result;
    	}
    
    	@Override
    	public long del(String...keys) {
    		Jedis jedis = jedisPool.getResource();
    		Long code = jedis.del(keys);
    		jedis.close();
    		return code;
    	}
    
    	@Override
    	public long hdel(String hkey, String...fields) {
    		Jedis jedis = jedisPool.getResource();
    		Long code = jedis.hdel(hkey, fields);
    		jedis.close();
    		return code;
    	}
    }
    

    测试

    注意添加扫描
    在这里插入图片描述
    spring的配置文件和上面的单机Spring的是一样的,测试代码也是一样的

    	public void test1(){
    		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    		JedisPool pool = ac.getBean("redisClient",JedisPool.class);
    		Jedis jedis = pool.getResource();
    		String type = jedis.set("address", "sz-dao");
    		System.out.println(type);
    		jedis.close();
    		pool.close();
    	}
    

    在这里插入图片描述

    Redis集群环境

    接口的实现

    @Component
    public class JedisClusterClientImpl implements JedisClient {
    
    	@Autowired
    	private JedisCluster jedisCluster;
    	
    	@Override
    	public String get(String key) {
    		return jedisCluster.get(key);
    	}
    
    	@Override
    	public String set(String key, String value) {
    		return jedisCluster.set(key, value);
    	}
    
    	@Override
    	public String hget(String hkey, String key) {
    		return jedisCluster.hget(hkey, key);
    	}
    
    	@Override
    	public long hset(String hkey, String key, String value) {
    		return jedisCluster.hset(hkey, key, value);
    	}
    
    	@Override
    	public long incr(String key) {
    		return jedisCluster.incr(key);
    	}
    
    	@Override
    	public long expire(String key, int second) {
    		return jedisCluster.expire(key, second);
    	}
    
    	@Override
    	public long ttl(String key) {
    		return jedisCluster.ttl(key);
    	}
    
    	@Override
    	public long del(String... key) {
    		return 0;
    	}
    
    	@Override
    	public long hdel(String hkey, String... fields) {
    		// TODO Auto-generated method stub
    		return 0;
    	}
    
    }
    

    其他的配置操作和spring整合Jedis中都是一样的

    好了本文介绍到此。下次再见~~

  • 相关阅读:
    css优先级
    常用CSS缩写语法总结
    老婆,同床不仅是老公生理的需要,更是心理的需要
    地震预测与概率(转)
    转载:如何研究系统的体系结构
    在RIA应用中,定义DTO作为工作划分的依据或接口
    需求分析应包含理解需求描述本身意思还包括给出解决方案
    今天规定了完成作业的时间,小东西到是按时完成了,基本上是吓写的,看来要严格要求了
    生活不能实验,结果只有一个,不要相信概率
    让人头疼的概率论游戏
  • 原文地址:https://www.cnblogs.com/dengpengbo/p/10386293.html
Copyright © 2011-2022 走看看