Spring整合Redis完整实例代码

做过大型软件系统的同学都知道,随着系统数据越来越庞大,越来越复杂,随之带来的问题就是系统性能越来越差,尤其是频繁操作数据库带来的性能损耗更为严重。很多业绩大牛为此提出了众多的解决方案和开发了很多框架以优化这种频繁操作数据库所带来的性能损耗,其中,尤为突出的两个缓存服务器是Memcached和Redis。今天,我们不讲Memcached和Redis本身,这里主要为大家介绍如何使spring与Redis整合。

1、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>
 <groupId>com.x.redis</groupId>
 <artifactId>springredis</artifactId>
 <version>0.0.1-SNAPSHOT</version> 

 <dependencies>
 <dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-redis</artifactId>
  <version>1.0.2.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>3.1.2.RELEASE</version>
  <scope>test</scope>
 </dependency> 

 <dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.1.0</version>
 </dependency> 

  <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.8.2</version>
  <scope>test</scope>
 </dependency>
 </dependencies>
</project>

2、spring配置文件(applicationContext.xml)

<?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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

 <context:property-placeholder location="classpath:redis.properties" /> 

 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
  <property name="maxIdle" value="${redis.maxIdle}" />
  <property name="maxActive" value="${redis.maxActive}" />
  <property name="maxWait" value="${redis.maxWait}" />
  <property name="testOnBorrow" value="${redis.testOnBorrow}" />
 </bean> 

 <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
  p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> 

 <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
  <property name="connectionFactory" ref="connectionFactory" />
 </bean>   

 <bean id="userDao" class="com.lyz.dao.impl.UserDaoImpl" />
</beans>

3、redis.properties

# Redis settings
redis.host=192.168.157.130
redis.port=6379
redis.pass=liuyazhuang 

redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true

4、User实体类

package com.lyz.entity;
import java.io.Serializable; 

/**
 * user实体类
 * @author liuyazhuang
 *
 */
public class User implements Serializable { 

 private static final long serialVersionUID = -6011241820070393952L; 

 private String id; 

 private String name; 

 private String password; 

 public User() { 

 } 

 public User(String id, String name, String password) {
  super();
  this.id = id;
  this.name = name;
  this.password = password;
 } 

 /**
  * 获得id
  * @return the id
  */
 public String getId() {
  return id;
 } 

 /**
  * 设置id
  * @param id the id to set
  */
 public void setId(String id) {
  this.id = id;
 } 

 /**
  * 获得name
  * @return the name
  */
 public String getName() {
  return name;
 } 

 /**
  * 设置name
  * @param name the name to set
  */
 public void setName(String name) {
  this.name = name;
 } 

 /**
  * 获得password
  * @return the password
  */
 public String getPassword() {
  return password;
 } 

 /**
  * 设置password
  * @param password the password to set
  */
 public void setPassword(String password) {
  this.password = password;
 }
}

5、User操作的接口IUserDao

package com.lyz.dao;
import java.util.List;
import com.lyz.entity.User;
/**
 * user操作接口
 * @author liuyazhuang
 *
 */
public interface IUserDao { 

 /**
  * 新增
  * @param user
  * @return
  */
 boolean add(User user); 

 /**
  * 批量新增 使用pipeline方式
  * @param list
  * @return
  */
 boolean add(List<User> list); 

 /**
  * 删除
  * @param key
  */
 void delete(String key); 

 /**
  * 删除多个
  * @param keys
  */
 void delete(List<String> keys); 

 /**
  * 修改
  * @param user
  * @return
  */
 boolean update(User user); 

 /**
  * 通过key获取
  * @param keyId
  * @return
  */
 User get(String keyId);
}

6、基本的抽象类

package com.lyz.dao.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer; 

/**
 * 基本的抽象类
 * @author liuyazhuang
 *
 * @param <K>
 * @param <V>
 */
public abstract class AbstractBaseRedisDao<K, V> { 

 @Autowired
 protected RedisTemplate<K, V> redisTemplate; 

 /**
  * 设置redisTemplate
  * @param redisTemplate the redisTemplate to set
  */
 public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
  this.redisTemplate = redisTemplate;
 } 

 /**
  * 获取 RedisSerializer
  * <br>------------------------------<br>
  */
 protected RedisSerializer<String> getRedisSerializer() {
  return redisTemplate.getStringSerializer();
 }
}

7、IUserDao的实现类UserDaoImpl

package com.lyz.dao.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.util.Assert;
import com.lyz.dao.IUserDao;
import com.lyz.entity.User;
/**
 * 接口的实现类
 * @author liuyazhuang
 *
 */
public class UserDaoImpl extends AbstractBaseRedisDao<String, User> implements IUserDao { 

 /**
  * 新增
  * @param user
  * @return
  */
 public boolean add(final User user) {
  boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
   public Boolean doInRedis(RedisConnection connection)
     throws DataAccessException {
    RedisSerializer<String> serializer = getRedisSerializer();
    byte[] key = serializer.serialize(user.getId());
    byte[] name = serializer.serialize(user.getName());
    return connection.setNX(key, name);
   }
  });
  return result;
 } 

 /**
  * 批量新增 使用pipeline方式
  *@param list
  *@return
  */
 public boolean add(final List<User> list) {
  Assert.notEmpty(list);
  boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
   public Boolean doInRedis(RedisConnection connection)
     throws DataAccessException {
    RedisSerializer<String> serializer = getRedisSerializer();
    for (User user : list) {
     byte[] key = serializer.serialize(user.getId());
     byte[] name = serializer.serialize(user.getName());
     connection.setNX(key, name);
    }
    return true;
   }
  }, false, true);
  return result;
 } 

 /**
  * 删除
  * @param key
  */
 public void delete(String key) {
  List<String> list = new ArrayList<String>();
  list.add(key);
  delete(list);
 } 

 /**
  * 删除多个
  * @param keys
  */
 public void delete(List<String> keys) {
  redisTemplate.delete(keys);
 } 

 /**
  * 修改
  * @param user
  * @return
  */
 public boolean update(final User user) {
  String key = user.getId();
  if (get(key) == null) {
   throw new NullPointerException("数据行不存在, key = " + key);
  }
  boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
   public Boolean doInRedis(RedisConnection connection)
     throws DataAccessException {
    RedisSerializer<String> serializer = getRedisSerializer();
    byte[] key = serializer.serialize(user.getId());
    byte[] name = serializer.serialize(user.getName());
    connection.set(key, name);
    return true;
   }
  });
  return result;
 } 

 /**
  * 通过key获取
  * @param keyId
  * @return
  */
 public User get(final String keyId) {
  User result = redisTemplate.execute(new RedisCallback<User>() {
   public User doInRedis(RedisConnection connection)
     throws DataAccessException {
    RedisSerializer<String> serializer = getRedisSerializer();
    byte[] key = serializer.serialize(keyId);
    byte[] value = connection.get(key);
    if (value == null) {
     return null;
    }
    String name = serializer.deserialize(value);
    return new User(keyId, name, null);
   }
  });
  return result;
 }
} 

8、测试类RedisTest

package com.lyz.test;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import com.lyz.dao.IUserDao;
import com.lyz.entity.User;
/**
 * Redis测试类
 * @author liuyazhuang
 *
 */
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class RedisTest extends AbstractJUnit4SpringContextTests { 

 @Autowired
 private IUserDao userDao; 

 /**
  * 新增
  */
 @Test
 public void testAddUser() {
  User user = new User();
  user.setId("user1");
  user.setName("liuyazhuang");
  boolean result = userDao.add(user);
  Assert.assertTrue(result);
 } 

 /**
  * 批量新增 普通方式
  */
 @Test
 public void testAddUsers1() {
  List<User> list = new ArrayList<User>();
  for (int i = 10; i < 50000; i++) {
   User user = new User();
   user.setId("user" + i);
   user.setName("liuyazhuang" + i);
   list.add(user);
  }
  long begin = System.currentTimeMillis();
  for (User user : list) {
   userDao.add(user);
  }
  System.out.println(System.currentTimeMillis() - begin);
 } 

 /**
  * 批量新增 pipeline方式
  */
 @Test
 public void testAddUsers2() {
  List<User> list = new ArrayList<User>();
  for (int i = 10; i < 1500000; i++) {
   User user = new User();
   user.setId("user" + i);
   user.setName("liuyazhuang" + i);
   list.add(user);
  }
  long begin = System.currentTimeMillis();
  boolean result = userDao.add(list);
  System.out.println(System.currentTimeMillis() - begin);
  Assert.assertTrue(result);
 } 

 /**
  * 修改
  */
 @Test
 public void testUpdate() {
  User user = new User();
  user.setId("user1");
  user.setName("liuyazhuang");
  boolean result = userDao.update(user);
  Assert.assertTrue(result);
 } 

 /**
  * 通过key删除单个
  */
 @Test
 public void testDelete() {
  String key = "user1";
  userDao.delete(key);
 } 

 /**
  * 批量删除
  */
 @Test
 public void testDeletes() {
  List<String> list = new ArrayList<String>();
  for (int i = 0; i < 10; i++) {
   list.add("user" + i);
  }
  userDao.delete(list);
 } 

 /**
  * 获取
  */
 @Test
 public void testGetUser() {
  String id = "user1";
  User user = userDao.get(id);
  Assert.assertNotNull(user);
  Assert.assertEquals(user.getName(), "liuyazhuang");
 } 

 /**
  * 设置userDao
  * @param userDao the userDao to set
  */
 public void setUserDao(IUserDao userDao) {
  this.userDao = userDao;
 }
} 

9、温馨提示

项目下载地址:Spring-Redis_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解java之redis篇(spring-data-redis整合)

    1,利用spring-data-redis整合 项目使用的pom.xml: <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/ma

  • 详解redis与spring的整合(使用缓存)

    1.实现目标 通过redis缓存数据.(目的不是加快查询的速度,而是减少数据库的负担) 2.所需jar包 注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错.因为commons-pooljar的目录根据版本的变化,目录结构会变.前面的版本是org.apache.pool,而后面的版本是org.apache.pool2... 3.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的val

  • Spring-data-redis操作redis知识总结

    什么是spring-data-redis spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使用了jedis,然后后来决定弃用掉改用jdbc-redis就比较麻烦了,spring-data-redis提供了redis的java客

  • 详解Redis 缓存 + Spring 的集成示例

    <整合 spring 4(包括mvc.context.orm) + mybatis 3 示例>一文简要介绍了最新版本的 Spring MVC.IOC.MyBatis ORM 三者的整合以及声明式事务处理.现在我们需要把缓存也整合进来,缓存我们选用的是 Redis,本文将在该文示例基础上介绍 Redis 缓存 + Spring 的集成. 1. 依赖包安装 pom.xml 加入: <!-- redis cache related.....start --> <dependency

  • 详解Spring Boot使用redis实现数据缓存

    基于spring Boot 1.5.2.RELEASE版本,一方面验证与Redis的集成方法,另外了解使用方法. 集成方法 1.配置依赖 修改pom.xml,增加如下内容. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.配置R

  • Spring整合Redis完整实例代码

    做过大型软件系统的同学都知道,随着系统数据越来越庞大,越来越复杂,随之带来的问题就是系统性能越来越差,尤其是频繁操作数据库带来的性能损耗更为严重.很多业绩大牛为此提出了众多的解决方案和开发了很多框架以优化这种频繁操作数据库所带来的性能损耗,其中,尤为突出的两个缓存服务器是Memcached和Redis.今天,我们不讲Memcached和Redis本身,这里主要为大家介绍如何使spring与Redis整合. 1.pom构建 <project xmlns="http://maven.apach

  • SpringBoot整合MongoDB完整实例代码

    目录 一.新建项目 二.docker-compose 配置mongoDB 三.SpringBoot配置MongoDB 问题:Exception authenticating MongoCredential 四.编写测试类 五.源码地址 一.新建项目 我们这次直接从IEDA创建项目,具体配置如下,还是万年的Java8. 二.docker-compose 配置mongoDB docker-compose.yml的具体配置如下,注意的是本地的文件夹data2022可以根据需要改成自己的名称,如果本地还

  • java 使用memcached以及spring 配置memcached完整实例代码

    Memcached是一个高性能的分布式内存对象缓存系统,本文介绍了java 使用memcached以及spring 配置memcached完整实例代码,分享给大家 本文涉及以下内容: 1,要使用的jar包 2,java 使用memcached 3,spring 配置memcached 导入jar java_memcached-release_2.6.6.jar commons-pool-1.5.6.jar slf4j-api-1.6.1.jar slf4j-simple-1.6.1.jar 示例

  • Spring基于注解整合Redis完整实例

    在<Redis之--Spring整合Redis>一文中,向大家介绍了如何将spring与Redis整合起来,但不是基于注解的形式,很多同学都希望能够通过注解的形式来简单的将Spring与Redis整合起来,这样,在使用的时候,只需要在相应的方法上加上注解,便可以使方法轻松的调用Redis的缓存.那么今天就来向大家介绍如何用基于注解的形式来整合Spring与Redis. 一.项目搭建 今天,我们不使用hibernate来操作数据库了,我们今天选择的框架是: Spring4(包括mvc.conte

  • Spring整合redis的操作代码

    目录 导入坐标 配置文件 进行操作 StringRedisTemplate jedis 导入坐标 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 配置文件 spring: redis: host: localhost port: 6

  • 消息队列 RabbitMQ 与 Spring 整合使用的实例代码

    一.什么是 RabbitMQ RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然. RabbitMQ 是由 Erlang 语言开发,安装 RabbitMQ 服务需要先安装 Erlang 语言包. 二.如何与 Spring 集成 1. 我们都需要哪些 Jar 包? 抛开单独使用 Spring 的包不说,

  • spring整合redis实现数据缓存的实例代码

    数据缓存原因:有些数据比较多,如果每次访问都要进行查询,无疑给数据库带来太大的负担,将一些庞大的查询数据并且更新次数较少的数据存入redis,能为系统的性能带来良好的提升. 业务逻辑思路:登入系统,访问数据时,检查redis是否有缓存,有则直接从redis中提取,没有则从数据库查询出,并存入redis中做缓存. 为什么要用redis做缓存: (1)异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录. (2)支持丰富的数据类型:Redis支持最大多数开发人员已经知道

  • Spring Boot整合mybatis(一)实例代码

    sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot-entity,pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:s

  • Spring集成MyBatis完整实例(分享)

    为了梳理前面学习的<Spring整合MyBatis(Maven+MySQL)一>与<Spring整合MyBatis(Maven+MySQL)二>中的内容,准备做一个完整的示例完成一个简单的图书管理功能,主要使用到的技术包含Spring.MyBatis.Maven与MySQL等.最后的运行效果如下: 项目结构如下: 一.新建一个基于Maven的Web项目 1.1.创建一个简单的Maven项目,项目信息如下: 1.2.修改层面信息,在项目上右键选择属性,再选择"Project

  • Spring的事务机制实例代码

    本文研究的主要是Spring的事务机制的相关内容,具体如下. JAVA EE传统事务机制 通常有两种事务策略:全局事务和局部事务.全局事务可以跨多个事务性资源(即数据源,典型的是数据库和消息队列),通常都需要J2EE应用服务器的管理,其底层需要服务器的JTA支持.而局部事务则与底层采用的持久化技术有关,如果底层直接使用JDBC,需要用Connection对象来操事务.如果采用Hibernate持久化技术,则需要使用session对象来操作事务. 通常的,使用JTA事务,JDBC事务及Hibern

随机推荐