在前面的文章给大家详细的介绍了Redis各种知识点,本文主要给大家介绍下java程序怎么操作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中都是一样的
好了本文介绍到此。下次再见~~