基于Spring-Data-Redis存储JavaBean对象
生活随笔
收集整理的這篇文章主要介紹了
基于Spring-Data-Redis存储JavaBean对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
redis是使用比較廣泛的緩存開源工具,一開始保存String對象的數據很方便,但是在保存一個對象上面費了點時間。下面就使用redis保存pojo對象。
1、安裝redis
這個講的很詳細:http://www.cnblogs.com/koal/p/5484916.html
2、新建一個maven工程
在pom.xml中添加配置文件
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" xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- 引入properties配置文件 --><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:pool-config-ref="poolConfig" /><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="connectionFactory" /></bean><bean id="userDao" class="com.ruijie.dao.impl.UserDaoImpl"></bean></beans>在配置redisTemplate時盡量使用RedisTemplate,不要使用StringRedisTemplate,在保存Pojo的時候會出現轉型失敗。
redis的配置文件
java代碼
public class User implements Serializable {private static final long serialVersionUID = 1L;public static final String OBJECT_KEY = "USER";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;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getKey() {return getId();}public String getObjectKey() {return OBJECT_KEY;}}必須要實現Serializable 接口,不然不能序列化。
public class AbstractBaseRedisDao<K,V> {@Autowired protected RedisTemplate<K, V> redisTemplate;public RedisTemplate<K, V> getRedisTemplate() {return redisTemplate;}/** * 獲取 RedisSerializer */ protected RedisSerializer<String> getRedisSerializer() { return redisTemplate.getStringSerializer(); } } public interface IUserDao {/*** 新增用戶* @return*/boolean add(User user);/*** 批量新增,使用list的方式* @param users* @return*/boolean batchAdd(List<User> users);/*** 刪除一條數據* @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);}實現類:
public class UserDaoImpl extends AbstractBaseRedisDao<String, Serializable>implements IUserDao {@Overridepublic boolean add(final User user) {boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection)throws DataAccessException {ValueOperations<String, Serializable> valueOper = redisTemplate.opsForValue();valueOper.set(user.getId(), user);return true;}}, false, true);return result;}@Overridepublic boolean batchAdd(final List<User> users) {boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {@Overridepublic Boolean doInRedis(RedisConnection connection)throws DataAccessException {ValueOperations<String, Serializable> valueOper = redisTemplate.opsForValue();for (User user : users) {valueOper.set(user.getId(), user);}return true;}}, false, true);return result;}@Overridepublic void delete(String key) {List<String> list = new ArrayList<String>();list.add(key);delete(list);}@Overridepublic void delete(List<String> keys) {redisTemplate.delete(keys);}@Overridepublic boolean update(final User user) {String id = user.getId();if (get(id) == null) {throw new NullPointerException("數據行不存在, key = " + id);}boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {public Boolean doInRedis(RedisConnection connection)throws DataAccessException {ValueOperations<String, Serializable> valueOper = redisTemplate.opsForValue();valueOper.set(user.getId(), user);return true;}});return result;}@Overridepublic User get(final String keyId) {User result = redisTemplate.execute(new RedisCallback<User>() {public User doInRedis(RedisConnection connection)throws DataAccessException {ValueOperations<String, Serializable> operations = redisTemplate.opsForValue();User user = (User) operations.get(keyId);return user;}});return result;}}這樣程序就算是完成了,下面對緩存進行增刪該查等操作。
@ContextConfiguration(locations = { "classpath*:application.xml" }) public class RedisTest extends AbstractJUnit4SpringContextTests {@Autowiredprivate IUserDao userDao;/*** 測試單個增加*/@Testpublic void addUser() {User user = new User("110", "張三", "12345677");boolean result = userDao.add(user);System.out.println(result);}/*** 批量新增 一條一條的方式 606ms,效率更高*/@Testpublic void testAddUsers2() {List<User> list = new ArrayList<User>();for (int i = 10; i < 50000; i++) {User user = new User();user.setId("user" + i);user.setName("ruijie" + i);list.add(user);}long begin = System.currentTimeMillis();boolean result = userDao.batchAdd(list);System.out.println(System.currentTimeMillis() - begin);System.out.println(result);}/*** 修改*/@Testpublic void testUpdate() {User user = new User();user.setId("user110");user.setName("new_password");boolean result = userDao.update(user);System.out.println(result);}/*** 單個刪除*/@Testpublic void testDelete() {userDao.delete("user110");}/*** 測試批量刪除*/@Testpublic void testDeletes() {List<String> list = new ArrayList<String>();for (int i = 100; i < 1000; i++) {list.add("user"+i);}userDao.delete(list);}/*** 獲取*/@Testpublic void testGet() {String key = "user110";User user = userDao.get(key);Assert.assertNotNull(user);System.out.println(user.getName());}public void setUserDao(IUserDao userDao) {this.userDao = userDao;} }如果是使用單元測試,以上代碼是可以順利測試通過的,但是不是用單元測試,而使用一般的類進行測試,例如:
@ContextConfiguration(locations = {"classpath*:redis-application.xml"}) public class RedisTask {@Autowiredprivate IUserDao userDao;/*** 增加單個AP信息*/public void addUser(User user) {boolean result = userDao.add(user);}public IUserDao getUserDao() {return userDao;}public void setUserDao(IUserDao userDao) {this.userDao = userDao;}public static void main(String[] args) {RedisTask task = new RedisTask();User user = new User();user.setId("12");user.setName("張三");user.setPassword("123423");task.addUser(user);} }會出現userDao空指針異常。是因為注解沒有生效以及Spring的配置文件沒有生效,在Spring的配置文件中加入:
<context:annotation-config />將注解方式生效。
以及在main方法中
這樣添加Pojo到redis緩存中就可以了。
總結
以上是生活随笔為你收集整理的基于Spring-Data-Redis存储JavaBean对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a股主板上市公司是什么意思 国家主板发行
- 下一篇: java美元兑换,(Java实现) 美元