日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

基于Spring-Data-Redis存储JavaBean对象

發布時間:2024/10/8 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Spring-Data-Redis存储JavaBean对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

redis是使用比較廣泛的緩存開源工具,一開始保存String對象的數據很方便,但是在保存一個對象上面費了點時間。下面就使用redis保存pojo對象。
1、安裝redis
這個講的很詳細:http://www.cnblogs.com/koal/p/5484916.html
2、新建一個maven工程
在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/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.luo</groupId><artifactId>redis_project</artifactId><version>0.0.1-SNAPSHOT</version><properties><!-- spring版本號 --><spring.version>3.2.8.RELEASE</spring.version><!-- junit版本號 --><junit.version>4.10</junit.version></properties><dependencies><!-- 添加Spring依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><!--單元測試依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!--spring單元測試依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency><!-- Redis 相關依賴 --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>1.0.0.RELEASE</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.0.0</version></dependency></dependencies> </project>

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的配置文件

#redis中心 #綁定的主機地址 redis.host=192.168.54.31 #指定Redis監聽端口,默認端口為6379 redis.port=6379 #授權密碼 redis.password=123456 #最大空閑數:空閑鏈接數大于maxIdle時,將進行回收 redis.maxIdle=100 #最大連接數:能夠同時建立的“最大鏈接個數” redis.maxActive=300 #最大等待時間:單位ms redis.maxWait=1000 #使用連接時,檢測連接是否成功 redis.testOnBorrow=true #當客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能 redis.timeout=10000

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方法中

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("redis-application.xml");RedisTask redisTask = (RedisTask) applicationContext.getBean("redisTask");

這樣添加Pojo到redis緩存中就可以了。

總結

以上是生活随笔為你收集整理的基于Spring-Data-Redis存储JavaBean对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。