Spring整合Redis完整实例代码

网友投稿 221 2023-05-22


Spring整合Redis完整实例代码

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

1、pom构建

4.0.0

com.x.redis</groupId>

springredis

0.0.1-SNAPSHOT

org.springframework.data

spring-data-redis

1.0.2.RELEASE

org.springframework

spring-test

3.1.2.RELEASE

test

redis.clients

jedis

2.1.0

junit

junit

4.8.2

test

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

xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:p="http://springframework.org/schema/p"

xmlns:context="http://springframework.org/schema/context"

xmlns:jee="http://springframework.org/schema/jee" xmlns:tx="http://springframework.org/schema/tx"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="

http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context.xsd">

p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>

xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:p="http://springframework.org/schema/p"

xmlns:context="http://springframework.org/schema/context"

xmlns:jee="http://springframework.org/schema/jee" xmlns:tx="http://springframework.org/schema/tx"

xmlns:aop="http://springframework.org/schema/aop"

xsi:schemaLocation="

http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context.xsd">

p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>

p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>

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 list);

/**

* 删除

* @param key

*/

void delete(String key);

/**

* 删除多个

* @param keys

*/

void delete(List 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

* @param

*/

public abstract class AbstractBaseRedisDao {

@Autowired

protected RedisTemplate redisTemplate;

/**

* 设置redisTemplate

* @param redisTemplate the redisTemplate to set

*/

public void setRedisTemplate(RedisTemplate redisTemplate) {

this.redisTemplate = redisTemplate;

}

/**

* 获取 RedisSerializer

*
------------------------------

*/

protected RedisSerializer 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 implements IUserDao {

/**

* 新增

* @param user

* @return

*/

public boolean add(final User user) {

boolean result = redisTemplate.execute(new RedisCallback() {

public Boolean doInRedis(RedisConnection connection)

throws DataAccessException {

RedisSerializer 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 list) {

Assert.notEmpty(list);

boolean result = redisTemplate.execute(new RedisCallback() {

public Boolean doInRedis(RedisConnection connection)

throws DataAccessException {

RedisSerializer 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 list = new ArrayList();

list.add(key);

delete(list);

}

/**

* 删除多个

* @param keys

*/

public void delete(List 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() {

public Boolean doInRedis(RedisConnection connection)

throws DataAccessException {

RedisSerializer 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() {

public User doInRedis(RedisConnection connection)

throws DataAccessException {

RedisSerializer 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 list = new ArrayList();

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 list = new ArrayList();

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 list = new ArrayList();

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序 跳转方式总结
下一篇:struts1实现简单的登录功能实例(附源码)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~