一 使用 JedisAPI 操作 Redis
Jedis 集成了 redis 的一些命令操作,封装了对 redis 命令的 Java 客户端。
1 使用 Jedis 操作 Redis 单机版
1.1 创建一个jar工程
1.2 修改 POM 文件添加 Jedis 坐标
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.y</groupId>
<artifactId>jedisDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
1.3 测试 Jedis 操作 Redis 单机版
package com.y;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
public class TestJedis {
public static void main(String[] args) throws Exception {
TestJedis test = new TestJedis();
test.testJedisSingle();
}
public void testJedisSingle(){
Jedis jedis = new Jedis("192.168.178.3",6379);
String result = jedis.set("name","tom");
System.out.println(result);
String str = jedis.get("name");
System.out.println(str);
Long l = jedis.hset("user", "username", "jery");
System.out.println(l);
String hres = jedis.hget("user","username");
System.out.println(hres);
jedis.close();
}
}
1.4 测试使用连接池操作 Redis 单机版
package com.y;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
public class TestJedis {
public static void main(String[] args) throws Exception {
TestJedis test = new TestJedis();
test.testJedisPool();
}
public void testJedisPool(){
JedisPool pool = new JedisPool("192.168.178.3",6379);
Jedis jedis = pool.getResource();
String result = jedis.set("name","tom");
System.out.println(result);
String str = jedis.get("name");
System.out.println(str);
Long l = jedis.hset("user", "username", "jery");
System.out.println(l);
String hres = jedis.hget("user","username");
System.out.println(hres);
jedis.close();
}
}
2 使用 Jedis 操作 Redis 集群
package com.y;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
public class TestJedis {
public static void main(String[] args) throws Exception {
TestJedis test = new TestJedis();
test.testJeidsCluster();
}
public void testJeidsCluster() throws Exception{
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.178.3",8001));
nodes.add(new HostAndPort("192.168.178.3",8002));
nodes.add(new HostAndPort("192.168.178.3",8003));
nodes.add(new HostAndPort("192.168.178.3",8004));
nodes.add(new HostAndPort("192.168.178.3",8005));
nodes.add(new HostAndPort("192.168.178.3",8006));
JedisCluster jc = new JedisCluster(nodes);
String result = jc.set("name","tom");
System.out.println(result);
String str = jc.get("name");
System.out.println(str);
Long l = jc.hset("user", "username", "jery");
System.out.println(l);
String hres = jc.hget("user","username");
System.out.println(hres);
jc.close();
}
}
七、 Spring 整合 Jedis
1 整合单机版
1.1 创建一个jar工程
1.2 修改 POM 文件添加 Jedis 与 Spring 的坐标
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.y</groupId>
<artifactId>spring-JedisDemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.3.RELEASE</version>
</dependency>
</dependencies>
</project>
1.3 创建 JedisDao 接口与接口实现类
JedisDao :
package com.y.dao;
public interface JedisDao {
public String set(String key ,String value);
public String get (String key);
public Long hset(String hkey,String key,String value );
public String hget(String hkey, String key);
}
JedisDaoImpl :
package com.y.dao.impl;
import org.springframework.beans.factory.annotation.Autowired;
import com.y.dao.JedisDao;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisSingleDaoImpl implements JedisDao {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
return jedis.set(key, value);
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
return jedis.get(key);
}
@Override
public Long hset(String hkey, String key, String value) {
Jedis jedis = jedisPool.getResource();
return jedis.hset(hkey, key, value);
}
@Override
public String hget(String hkey, String key) {
Jedis jedis = jedisPool.getResource();
return jedis.hget(hkey, key);
}
}
1.4 在 Spring 配置文件中整合 Jedis
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.y.dao"></context:component-scan>
<!-- jedisPool 的配置 -->
<bean id="poolconfig" 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="true" />
<!-- 在空闲时检查有效性, 默认 false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false 报异常,ture 阻塞 直到超时, 默认 true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig">
<ref bean="poolconfig" />
</constructor-arg>
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>6379</value>
</constructor-arg>
</bean>
<bean id="jedisSingleDaoImpl" class="com.y.dao.impl.JedisSingleDaoImpl"></bean>
</beans>
1.5 测试单机版
package com.y;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.y.dao.JedisDao;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class Test {
public static void main(String[] args) {
Test.testJedisSingle();
}
public static void testJedisPool(){
JedisPool jp =new JedisPool("192.168.178.3",6379);
Jedis jedis = jp.getResource();
jedis.set("name", "tom");
String str = jedis.get("name");
System.out.println(str);
jedis.close();
}
public static void testJedisSingle(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-Jedis.xml");
JedisDao jd = (JedisDao) ac.getBean("jedisClusterDaoImpl");
String str = jd.set("端午节","五月五日");
System.out.println(str);
String result = jd.get("端午节");
System.out.println(result);
}
}
2 整合集群版
2.1 添加 JedisDao 实现类。基于 JedisCluster 的实现
JedisDao与单机版一样,实现类JedisClusterDaoImpl为:
package com.y.dao.impl;
import org.springframework.beans.factory.annotation.Autowired;
import com.y.dao.JedisDao;
import redis.clients.jedis.JedisCluster;
public class JedisClusterDaoImpl implements JedisDao {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Long hset(String hkey, String key, String value) {
return jedisCluster.hset(hkey, key, value);
}
@Override
public String hget(String hkey, String key) {
return jedisCluster.hget(hkey, key);
}
}
2.2 在 Spring 配置文件中整合 JedisCluster
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.y.dao"></context:component-scan>
<!-- jedisPool 的配置 -->
<bean id="poolconfig" 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="true" />
<!-- 在空闲时检查有效性, 默认 false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false 报异常,ture 阻塞 直到超时, 默认 true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig">
<ref bean="poolconfig" />
</constructor-arg>
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>6379</value>
</constructor-arg>
</bean>
<bean id="JedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>8001</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>8002</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>8003</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>8004</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>8005</value>
</constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host">
<value>192.168.178.3</value>
</constructor-arg>
<constructor-arg name="port">
<value>8006</value>
</constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg name="poolConfig">
<ref bean="poolconfig" />
</constructor-arg>
</bean>
<bean id="jedisClusterDaoImpl" class="com.y.dao.impl.JedisClusterDaoImpl"></bean>
</beans>
2.3 测试集群版
package com.y;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.y.dao.JedisDao;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class Test {
public static void main(String[] args) {
Test.testJedisCluster();
}
public static void testJedisPool(){
JedisPool jp =new JedisPool("192.168.178.3",6379);
Jedis jedis = jp.getResource();
jedis.set("name", "tom");
String str = jedis.get("name");
System.out.println(str);
jedis.close();
}
public static void testJedisCluster(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-Jedis.xml");
JedisDao jd = (JedisDao) ac.getBean("jedisClusterDaoImpl");
String str = jd.set("端午节","五月五日");
System.out.println(str);
String result = jd.get("端午节");
System.out.println(result);
}
}
八、 Redis Desktop Manager 的使用
1 创建与 Redis 的链接
![8125328c3f9f8deaacc883561c7a220d.png](https://i-blog.csdnimg.cn/blog_migrate/3357e3a3c4e06ee23cd5fc71da3e45bd.jpeg)
![e6ed6a7dc030ef9108eff9f0ea88b827.png](https://i-blog.csdnimg.cn/blog_migrate/56423ca71992e1f37139e1cf256f2931.png)
![c423150ba413215fd2f26aff87019fa6.png](https://i-blog.csdnimg.cn/blog_migrate/95ed684e98d4a1d9c15cfc872d2ad486.png)
九、 实战案例
1 需求
- 实现用户添加功能。
- 实现用户查询功能,并使用 Redis 作为查询缓存。
- 实现用户更新功能,同步缓存。
2 数据库的表结构
CREATE TABLE `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) DEFAULT NULL,
`userage` int(11) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
3 创建项目
创建一个war项目。
4 修改 POM 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.y</groupId>
<artifactId>redis_parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.y</groupId>
<artifactId>usermanager</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<!-- JSP相关 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- Jackson Json处理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
<!-- tomcat插件,由于子项目不一定每个都是web项目,所以该插件只是声明,并未开启 -->
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<path>/</path>
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
</project>
5 框架整合
![bdb9ca03f4a6d98477fc48b33bcd3047.png](https://i-blog.csdnimg.cn/blog_migrate/aed1194131ad7b2ff5fb4bf37c4eaac0.jpeg)
![24c3a02f30c28b3b917aa2a6334213de.png](https://i-blog.csdnimg.cn/blog_migrate/f37f7259b72f874ef0b15af7994a4b23.png)
6 实现业务
6.1 UserMapper 与 UserMapper 映射配置文件
UserMapper 接口 :
package com.y.mapper;
import java.util.List;
import com.y.pojo.User;
public interface UserMapper {
public void insertUser(User user);
public List<User> selectUserAll();
User findUserById(int userid);
void updateUser(User user);
}
映射配置文件 :
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.y.mapper.UserMapper" >
<insert id="insertUser" parameterType="com.y.pojo.User">
insert into user(username,userage) values(#{username},#{userage})
</insert>
<select id="selectUserAll" resultType="com.y.pojo.User">
select * from user
</select>
<select id="findUserById" resultType="com.y.pojo.User">
select * from user where userid = #{userid}
</select>
<update id="updateUser" parameterType="com.y.pojo.User">
update user set username = #{username},userage = #{userage} where userid=#{userid}
</update>
</mapper>
6.2UserService接口和UserServiceImpl实现类
UserService接口 :
package com.y.service;
import com.y.pojo.User;
public interface UserService {
void addUser(User user);
User findUserById(int userid);
void updateUser(User user);
}
UserServiceImpl实现类 :
package com.y.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.y.commons.JsonUtils;
import com.y.jedisdao.JedisDao;
import com.y.mapper.UserMapper;
import com.y.pojo.User;
import com.y.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private JedisDao jedisDao;
@Value("${REDIS_USERS_PRIFX}")
private String REDIS_USERS_PRIFX;
@Override
public void addUser(User user) {
this.userMapper.insertUser(user);
}
//实现查询缓存业务
@Override
public User findUserById(int userid) {
//先查询内存中的redis有没有如果有则返回,如果没有,从关系型数据库查
try {
String json = this.jedisDao.get(this.REDIS_USERS_PRIFX + ":" + userid);
if (json != null && json.length() > 0) {
System.out.println(".........................");
User user = JsonUtils.jsonToPojo(json, User.class);
return user;
}
} catch (Exception e) {
e.printStackTrace();
}
//从关系型数据库查,
User user = this.userMapper.findUserById(userid);
System.out.println(",,,,,,,,,,,,,,,,,,,,,,,,,,,,,");
//从关系型数据库中查完后放入到redis中
try {
String res = JsonUtils.objectToJson(user);
this.jedisDao.set(this.REDIS_USERS_PRIFX + ":" + userid, res);
this.jedisDao.expire(this.REDIS_USERS_PRIFX + ":" + userid, 60);
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
// 更新用户同步缓存
@Override
public void updateUser(User user) {
this.userMapper.updateUser(user);
try{
this.jedisDao.del(this.REDIS_USERS_PRIFX+":"+user.getUserid());
}catch(Exception e){
e.printStackTrace();
}
}
}