spring+redis实例(二)
这一篇redis实例是基于序列化储存-(写入对象,读取对象)
在spring+redis(一)中我们介绍了在spring中怎么去操作储存redis,基于string的储存,今天我们介绍一下redis基于序列化的储存。
平常在项目里面往数据库存贮的大多数是一个对象,因为我们好多都是面向对象开发。
下面的例子介绍了往redis数据库里面写入session对象:
1.既然是写入一个对象,我们肯定要有一个对象,下面是一个session class:
package com.lcc.api.dto.session; import java.io.Serializable;
import java.util.Map; public class MobileSessionInfo extends SessionInfo implements Serializable { private static final long serialVersionUID = -9170869913976089130L; private Map<String, String> emails; public Map<String, String> getEmails() {
return emails;
} public void setEmails(Map<String, String> emails) {
this.emails = emails;
} @Override
public String toString() {
return new StringBuilder().append("{emails: ").append(emails).append("}").toString();
}
}
package com.lcc.api.dto.session; import java.io.Serializable; public abstract class SessionInfo implements Serializable { private static final long serialVersionUID = 6544973626519192604L; private String key;
// timestamp
private Long createdAt;
// unit: second
private Long expiryTime; public String getKey() {
return key;
} public void setKey(String key) {
this.key = key;
} public Long getCreatedAt() {
return createdAt;
} public void setCreatedAt(Long createdAt) {
this.createdAt = createdAt;
} public Long getExpiryTime() {
return expiryTime;
} public void setExpiryTime(Long expiryTime) {
this.expiryTime = expiryTime;
} @Override
public String toString() {
return new StringBuilder().append("{key: ").append(key).append(", createdAt: ").append(createdAt)
.append(", expiryTime: ").append(expiryTime).append("}").toString();
}
}
2.接下来写一个service去操作写入session对象:
package com.lcc.service.app.impl; import com.lcc.api.dto.session.MobileSessionInfo;
import com.lcc.service.BaseAuthorityService;
import com.lcc.service.app.DeviceService; import java.util.HashMap;
import java.util.Map; public class DeviceServiceImpl implements DeviceService { private BaseAuthorityService authorityService; private Long expiryTime = 24*60*60L; public void setAuthorityService(BaseAuthorityService authorityService) {
this.authorityService = authorityService;
} public void setExpiryTime(Long expiryTime) {
this.expiryTime = expiryTime;
} @Override
public void catchSession(String deviceId) {
MobileSessionInfo session = new MobileSessionInfo();
Map<String, String> emails = new HashMap<String, String>();
session.setKey(deviceId);
session.setEmails(emails);
session.setExpiryTime(expiryTime);
authorityService.saveSessionInfo(session);
}
}
package com.lcc.service; import com.lcc.domain.enums.SessionCacheMode;
import com.lcc.api.dto.session.SessionInfo; public interface BaseAuthorityService { SessionInfo getSessionInfo(String sessionId); void saveSessionInfo(SessionInfo session); SessionCacheMode getCacheMode();
}
package com.lcc.api.domain.enums; public enum SessionCacheMode { LOCAL(1), //
REDIS(2); private Integer value; SessionCacheMode(Integer value) {
this.value = value;
} public Integer getValue() {
return value;
} public static SessionCacheMode fromValue(Integer value) {
for (SessionCacheMode mode : values()) {
if (mode.getValue() == value) {
return mode;
}
}
return null;
}
}
package com.lcc.authority; import com.google.common.collect.Maps;
import com.lcc.api.domain.enums.SessionCacheMode;
import com.lcc.api.dto.session.SessionInfo;
import com.lcc.logger.Logger;
import com.lcc.logger.LoggerFactory;
import com.lcc.service.BaseAuthorityService;
import org.joda.time.LocalDateTime;
import org.springframework.data.redis.core.RedisTemplate; import java.util.Date;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit; public class AuthorityService implements BaseAuthorityService { private static final Logger LOGGER = LoggerFactory.getLogger(AuthorityService.class); private static final String CAHCE_MODE_KEY = "cache-mode"; private RedisTemplate<String, SessionInfo> sessionTemplate; public void setSessionTemplate(RedisTemplate<String, SessionInfo> sessionTemplate) {
this.sessionTemplate = sessionTemplate;
} /**
* session global attributes
* <p>
* default open redis session cache mode
* </p>
*
*/
private static final ConcurrentMap<String, Object> BUCKETS = Maps.newConcurrentMap();
static {
BUCKETS.put(CAHCE_MODE_KEY, SessionCacheMode.REDIS);
} @Override
public SessionInfo getSessionInfo(String sessionId) {
LOGGER.info("get session {}, cache mode {}", sessionId, getCacheMode()); SessionInfo sessionInfo = null;
try {
sessionInfo = sessionTemplate.opsForValue().get(sessionId);
} catch (Exception e) {
LOGGER.error("get session from redis exception", e);
}
return sessionInfo;
} @Override
public void saveSessionInfo(SessionInfo session) {
session.setCreatedAt(LocalDateTime.now().toDate().getTime());
try {
sessionTemplate.opsForValue().set(session.getKey(), session);
sessionTemplate.expire(session.getKey(), session.getExpiryTime(), TimeUnit.SECONDS);
} catch (Exception e) {
LOGGER.error("H5 save session exception, open local cache mode", e);
}
} @Override
public SessionCacheMode getCacheMode() {
return (SessionCacheMode) BUCKETS.get(CAHCE_MODE_KEY);
}
}
3.基本的java class搞定了,然后看下spring配置文件:
<bean class="org.springframework.data.redis.core.RedisTemplate"
id="authorityCacheRedisJdkSerializationTemplate" p:connection-factory-ref="h5SessionRedisConnectionFactory">
<property name="keySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean> <bean id="h5SessionRedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.session.host}" p:port="${redis.session.port}">
<constructor-arg index="0" ref="jedisPoolConfig" />
</bean> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="60"/>
<property name="maxIdle" value="15"/>
<property name="testOnBorrow" value="true"/>
</bean>
<bean id="deviceService" class="com.opentrans.otms.service.xtt.impl.DeviceServiceImpl">
<property name="authorityService" ref="authorityService" />
<property name="expiryTime" value="${session.expiry.time}" />
</bean> <bean id="authorityService" class="com.opentrans.otms.authority.AuthorityService" >
<property name="sessionTemplate" ref="authorityCacheRedisJdkSerializationTemplate" />
</bean>
总结:redis序列化操作和文本操作最主要的区别是RedisTemplate里面两个属性的配置不同:
一个是keySerializer一个是valueSerializer(StringRedisSerializer|JdkSerializationRedisSerializer)
<bean class="org.springframework.data.redis.core.RedisTemplate"
id="truckkCacheRedisJdkSerializationTemplate" p:connection-factory-ref="truckCacheRedisConnectionFactory">
<property name="keySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
</bean> <bean class="org.springframework.data.redis.core.RedisTemplate"
id="authorityCacheRedisJdkSerializationTemplate" p:connection-factory-ref="h5SessionRedisConnectionFactory">
<property name="keySerializer">
<bean
class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean
class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean>
spring+redis实例(二)的更多相关文章
- spring + redis 实例(一)
这一篇主要是redis操作工具类以及基本配置文本储存 首先我们需要定义一个redisUtil去操作底层redis数据库: package com.lcc.cache.redis; import jav ...
- springMVC+Hibernate4+spring整合实例二(实例代码部分)
UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- redis之(二十一)redis之深入理解Spring Redis的使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...
- 使用CacheCloud管理Redis实例
转载来源:http://www.ywnds.com/?p=10610 一.CacheCloud是什么? 最近在使用CacheCloud管理Redis,所以简单说一下,这里主要说一下我碰到的问题.Cac ...
- spring redis入门
小二,上菜!!! 1. 虚拟机上安装redis服务 下载tar包,wget http://download.redis.io/releases/redis-2.8.19.tar.gz. 解压缩,tar ...
- redis 实例2 构建文章投票网站后端
redis 实例2 构建文章投票网站后端 1.限制条件 一.如果网站获得200张支持票,那么这篇文章被设置成有趣的文章 二.如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置 ...
- 分布式缓存技术redis学习—— 深入理解Spring Redis的使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...
- Spring Security4实例(Java config 版) —— Remember-Me
本文源码请看这里 相关文章: Spring Security4实例(Java config版)--ajax登录,自定义验证 Spring Security提供了两种remember-me的实现,一种是 ...
随机推荐
- Java多线程和并发(四),线程返回值获取方式和Callable接口
目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Cal ...
- Selenium 环境安装
前言: 本人在学习Selenium时,用的版本是Python3.6+Selenium3,后续写的所有学习资料都是基于这套环境.在安装Selenium3前,请确保本机已安装好了Python3,如未安装可 ...
- C_clock()测试代码(循环)运行时间
clock() 传送门(百度百科) clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock(voi ...
- python 学习之路(1)
1变量的使用以及原理 先定义一个变量 变量的类型 变量的命名 01变量的命名 变量名 = 值 左边是变量名 右边是值 又叫做赋值 上面是ipython的交互模式的 那我们看看在pycharm里面如何输 ...
- [JZOJ6400]:Game(贪心+线段树+二分)
题目描述 小$A$和小$B$在玩一个游戏,他们两个人每人有$n$张牌,每张牌有一个点数,并且在接下来的$n$个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小$A$通过 ...
- 关于synchronized和ReentrantLock之多线程同步详解
一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...
- linux 加多播协议(IGMP)
可能你所用的内核编译时没有选中multicast的选项. 追问 感谢您的回复,但是我还是不太明白你说的multicast选项是什么意思.能更详细的说一下吗,谢谢.或者能直接用QQ或者MSN帮忙看看 ...
- de4dot 反混淆
de4dot .NET deobfuscator and unpacker. Description de4dot is an open source (GPLv3) .NET deobfuscato ...
- 在CentOS7上搭建Kubernetes
来源 中文教程 http://blog.51cto.com/devingeng/2096495?from=singlemessage 官方文档 https://kubernetes.io/docs/s ...
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门
创建新项目 修改为jar包的方式 把上一个工程内的代码 java下的com复制过来 由于配置文件没有,所以一运行就会报错 factory文件夹整个删除 dao的实现类 这里删除 测试类保留这两行代码 ...