这一篇redis实例是基于序列化储存-(写入对象,读取对象)

在spring+redis(一)中我们介绍了在spring中怎么去操作储存redis,基于string的储存,今天我们介绍一下redis基于序列化的储存。

平常在项目里面往数据库存贮的大多数是一个对象,因为我们好多都是面向对象开发。

下面的例子介绍了往redis数据库里面写入session对象:

1.既然是写入一个对象,我们肯定要有一个对象,下面是一个session class:

  1. package com.lcc.api.dto.session;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Map;
  5.  
  6. public class MobileSessionInfo extends SessionInfo implements Serializable {
  7.  
  8. private static final long serialVersionUID = -9170869913976089130L;
  9.  
  10. private Map<String, String> emails;
  11.  
  12. public Map<String, String> getEmails() {
  13. return emails;
  14. }
  15.  
  16. public void setEmails(Map<String, String> emails) {
  17. this.emails = emails;
  18. }
  19.  
  20. @Override
  21. public String toString() {
  22. return new StringBuilder().append("{emails: ").append(emails).append("}").toString();
  23. }
  24. }
  1. package com.lcc.api.dto.session;
  2.  
  3. import java.io.Serializable;
  4.  
  5. public abstract class SessionInfo implements Serializable {
  6.  
  7. private static final long serialVersionUID = 6544973626519192604L;
  8.  
  9. private String key;
  10. // timestamp
  11. private Long createdAt;
  12. // unit: second
  13. private Long expiryTime;
  14.  
  15. public String getKey() {
  16. return key;
  17. }
  18.  
  19. public void setKey(String key) {
  20. this.key = key;
  21. }
  22.  
  23. public Long getCreatedAt() {
  24. return createdAt;
  25. }
  26.  
  27. public void setCreatedAt(Long createdAt) {
  28. this.createdAt = createdAt;
  29. }
  30.  
  31. public Long getExpiryTime() {
  32. return expiryTime;
  33. }
  34.  
  35. public void setExpiryTime(Long expiryTime) {
  36. this.expiryTime = expiryTime;
  37. }
  38.  
  39. @Override
  40. public String toString() {
  41. return new StringBuilder().append("{key: ").append(key).append(", createdAt: ").append(createdAt)
  42. .append(", expiryTime: ").append(expiryTime).append("}").toString();
  43. }
  44. }

2.接下来写一个service去操作写入session对象:

  1. package com.lcc.service.app.impl;
  2.  
  3. import com.lcc.api.dto.session.MobileSessionInfo;
  4. import com.lcc.service.BaseAuthorityService;
  5. import com.lcc.service.app.DeviceService;
  6.  
  7. import java.util.HashMap;
  8. import java.util.Map;
  9.  
  10. public class DeviceServiceImpl implements DeviceService {
  11.  
  12. private BaseAuthorityService authorityService;
  13.  
  14. private Long expiryTime = 24*60*60L;
  15.  
  16. public void setAuthorityService(BaseAuthorityService authorityService) {
  17. this.authorityService = authorityService;
  18. }
  19.  
  20. public void setExpiryTime(Long expiryTime) {
  21. this.expiryTime = expiryTime;
  22. }
  23.  
  24. @Override
  25. public void catchSession(String deviceId) {
  26. MobileSessionInfo session = new MobileSessionInfo();
  27. Map<String, String> emails = new HashMap<String, String>();
  28. session.setKey(deviceId);
  29. session.setEmails(emails);
  30. session.setExpiryTime(expiryTime);
  31. authorityService.saveSessionInfo(session);
  32. }
  33. }
  1. package com.lcc.service;
  2.  
  3. import com.lcc.domain.enums.SessionCacheMode;
  4. import com.lcc.api.dto.session.SessionInfo;
  5.  
  6. public interface BaseAuthorityService {
  7.  
  8. SessionInfo getSessionInfo(String sessionId);
  9.  
  10. void saveSessionInfo(SessionInfo session);
  11.  
  12. SessionCacheMode getCacheMode();
  13. }
  1. package com.lcc.api.domain.enums;
  2.  
  3. public enum SessionCacheMode {
  4.  
  5. LOCAL(1), //
  6. REDIS(2);
  7.  
  8. private Integer value;
  9.  
  10. SessionCacheMode(Integer value) {
  11. this.value = value;
  12. }
  13.  
  14. public Integer getValue() {
  15. return value;
  16. }
  17.  
  18. public static SessionCacheMode fromValue(Integer value) {
  19. for (SessionCacheMode mode : values()) {
  20. if (mode.getValue() == value) {
  21. return mode;
  22. }
  23. }
  24. return null;
  25. }
  26. }
  1. package com.lcc.authority;
  2.  
  3. import com.google.common.collect.Maps;
  4. import com.lcc.api.domain.enums.SessionCacheMode;
  5. import com.lcc.api.dto.session.SessionInfo;
  6. import com.lcc.logger.Logger;
  7. import com.lcc.logger.LoggerFactory;
  8. import com.lcc.service.BaseAuthorityService;
  9. import org.joda.time.LocalDateTime;
  10. import org.springframework.data.redis.core.RedisTemplate;
  11.  
  12. import java.util.Date;
  13. import java.util.concurrent.ConcurrentMap;
  14. import java.util.concurrent.TimeUnit;
  15.  
  16. public class AuthorityService implements BaseAuthorityService {
  17.  
  18. private static final Logger LOGGER = LoggerFactory.getLogger(AuthorityService.class);
  19.  
  20. private static final String CAHCE_MODE_KEY = "cache-mode";
  21.  
  22. private RedisTemplate<String, SessionInfo> sessionTemplate;
  23.  
  24. public void setSessionTemplate(RedisTemplate<String, SessionInfo> sessionTemplate) {
  25. this.sessionTemplate = sessionTemplate;
  26. }
  27.  
  28. /**
  29. * session global attributes
  30. * <p>
  31. * default open redis session cache mode
  32. * </p>
  33. *
  34. */
  35. private static final ConcurrentMap<String, Object> BUCKETS = Maps.newConcurrentMap();
  36. static {
  37. BUCKETS.put(CAHCE_MODE_KEY, SessionCacheMode.REDIS);
  38. }
  39.  
  40. @Override
  41. public SessionInfo getSessionInfo(String sessionId) {
  42. LOGGER.info("get session {}, cache mode {}", sessionId, getCacheMode());
  43.  
  44. SessionInfo sessionInfo = null;
  45. try {
  46. sessionInfo = sessionTemplate.opsForValue().get(sessionId);
  47. } catch (Exception e) {
  48. LOGGER.error("get session from redis exception", e);
  49. }
  50. return sessionInfo;
  51. }
  52.  
  53. @Override
  54. public void saveSessionInfo(SessionInfo session) {
  55. session.setCreatedAt(LocalDateTime.now().toDate().getTime());
  56. try {
  57. sessionTemplate.opsForValue().set(session.getKey(), session);
  58. sessionTemplate.expire(session.getKey(), session.getExpiryTime(), TimeUnit.SECONDS);
  59. } catch (Exception e) {
  60. LOGGER.error("H5 save session exception, open local cache mode", e);
  61. }
  62. }
  63.  
  64. @Override
  65. public SessionCacheMode getCacheMode() {
  66. return (SessionCacheMode) BUCKETS.get(CAHCE_MODE_KEY);
  67. }
  68. }

3.基本的java class搞定了,然后看下spring配置文件:

  1. <bean class="org.springframework.data.redis.core.RedisTemplate"
  2. id="authorityCacheRedisJdkSerializationTemplate" p:connection-factory-ref="h5SessionRedisConnectionFactory">
  3. <property name="keySerializer">
  4. <bean
  5. class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  6. </property>
  7. <property name="valueSerializer">
  8. <bean
  9. class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  10. </property>
  11. </bean>
  12.  
  13. <bean id="h5SessionRedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
  14. p:host-name="${redis.session.host}" p:port="${redis.session.port}">
  15. <constructor-arg index="0" ref="jedisPoolConfig" />
  16. </bean>
  17.  
  18. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  19. <property name="maxTotal" value="60"/>
  20. <property name="maxIdle" value="15"/>
  21. <property name="testOnBorrow" value="true"/>
  22. </bean>
  1. <bean id="deviceService" class="com.opentrans.otms.service.xtt.impl.DeviceServiceImpl">
  2. <property name="authorityService" ref="authorityService" />
  3. <property name="expiryTime" value="${session.expiry.time}" />
  4. </bean>
  5.  
  6. <bean id="authorityService" class="com.opentrans.otms.authority.AuthorityService" >
  7. <property name="sessionTemplate" ref="authorityCacheRedisJdkSerializationTemplate" />
  8. </bean>

总结:redis序列化操作和文本操作最主要的区别是RedisTemplate里面两个属性的配置不同:

一个是keySerializer一个是valueSerializer(StringRedisSerializer|JdkSerializationRedisSerializer)

  1. <bean class="org.springframework.data.redis.core.RedisTemplate"
  2. id="truckkCacheRedisJdkSerializationTemplate" p:connection-factory-ref="truckCacheRedisConnectionFactory">
  3. <property name="keySerializer">
  4. <bean
  5. class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  6. </property>
  7. <property name="valueSerializer">
  8. <bean
  9. class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  10. </property>
  11. </bean>
  12.  
  13. <bean class="org.springframework.data.redis.core.RedisTemplate"
  14. id="authorityCacheRedisJdkSerializationTemplate" p:connection-factory-ref="h5SessionRedisConnectionFactory">
  15. <property name="keySerializer">
  16. <bean
  17. class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  18. </property>
  19. <property name="valueSerializer">
  20. <bean
  21. class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  22. </property>
  23. </bean>

spring+redis实例(二)的更多相关文章

  1. spring + redis 实例(一)

    这一篇主要是redis操作工具类以及基本配置文本储存 首先我们需要定义一个redisUtil去操作底层redis数据库: package com.lcc.cache.redis; import jav ...

  2. springMVC+Hibernate4+spring整合实例二(实例代码部分)

    UserController.java 代码: package com.edw.controller; import java.io.IOException; import java.io.Print ...

  3. python3.4学习笔记(二十五) Python 调用mysql redis实例代码

    python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...

  4. redis之(二十一)redis之深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  5. 使用CacheCloud管理Redis实例

    转载来源:http://www.ywnds.com/?p=10610 一.CacheCloud是什么? 最近在使用CacheCloud管理Redis,所以简单说一下,这里主要说一下我碰到的问题.Cac ...

  6. spring redis入门

    小二,上菜!!! 1. 虚拟机上安装redis服务 下载tar包,wget http://download.redis.io/releases/redis-2.8.19.tar.gz. 解压缩,tar ...

  7. redis 实例2 构建文章投票网站后端

    redis 实例2 构建文章投票网站后端   1.限制条件 一.如果网站获得200张支持票,那么这篇文章被设置成有趣的文章 二.如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置 ...

  8. 分布式缓存技术redis学习—— 深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  9. Spring Security4实例(Java config 版) —— Remember-Me

    本文源码请看这里 相关文章: Spring Security4实例(Java config版)--ajax登录,自定义验证 Spring Security提供了两种remember-me的实现,一种是 ...

随机推荐

  1. 日志管理-rsyslog日志服务器及loganalyzer

    一,日志基础 日志:记录时间,地点,任务,事件 格式:日期时间 主机 进程[pid]: 事件内容 rsyslog 特性: 多线程,UDP, TCP, SSL, TLS, RELP,MySQL, PGS ...

  2. 关于session、cookie、sessionStorage、localStorage的简要理解

    一.cookie和session 首先session和cookie用于浏览器客户端与服务端进行数据交互,通过会话的方式跟踪浏览器用户身份 (1) cookie 1.1) 一般由服务器生成,可以设置失效 ...

  3. BZOJ 2117: [2010国家集训队]Crash的旅游计划 动态点分治+二分

    感觉现在写点分治可快了~ 二分答案,就可以将求第 $k$ 大转换成一个判断问题,直接拿点分树判断一下就行了. #include <cstdio> #include <vector&g ...

  4. poj 3662 Telephone Lines dijkstra+二分搜索

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5696   Accepted: 2071 D ...

  5. JavaScript插件制作-tab选项卡

    JavaScript插件制作练习-鼠标划过选项卡切换图片 <!DOCTYPE html> <html> <head> <meta charset=" ...

  6. 从setContentView()源码看起

    2.1 Activity::setContentView() public void setContentView(@LayoutRes int layoutResID) { getWindow(). ...

  7. C++入门经典-例3.23-使用嵌套循环输出乘法口诀表

    1:代码如下: // 3.23.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iomanip> #incl ...

  8. C语言转义字符表和ASCII码表

    主要参考 http://www.51hei.com/mcu/4342.html 以及 https://www.cnblogs.com/jason207489550/p/6663444.html

  9. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

    1. 摘要 作者提出了一系列应用于移动和嵌入式视觉的称之为 MobileNets 的高效模型,这些模型采用深度可分离卷积来构建轻量级网络. 作者还引入了两个简单的全局超参数来有效地权衡时延和准确率,以 ...

  10. python-静态方法和类方法及其使用场景

    静态方法和类方法 静态方法 我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息.实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个"三角形"类,通 ...