这几天没事,就把之前学习的redis代码整理一遍,废话不多说,上步骤。

1、pom.xml引入资源;

  1. <dependency>
  2. <groupId>org.springframework.data</groupId>
  3. <artifactId>spring-data-redis</artifactId>
  4. <version>1.7.0.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>redis.clients</groupId>
  8. <artifactId>jedis</artifactId>
  9. <version>2.8.0</version>
  10. </dependency>

2、配置redis的配置文件,这里只配置单点数据库,后面会介绍redis集群的配置,这里就不多说了;

spring-redis.xml配置:

  1. <!-- 读取配置文件信息 -->
  2. <context:property-placeholder ignore-unresolvable="true" location="classpath:*.properties"/>
  3.  
  4. <!-- Redis 配置 -->
  5. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  6. <property name="maxTotal" value="${redis.maxActive}" />
  7. <property name="maxIdle" value="${redis.maxIdle}" />
  8. <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
  9. <property name="testOnBorrow" value="true" />
  10. </bean>
  11.  
  12. <!-- redis单节点数据库连接配置 -->
  13. <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  14. <property name="hostName" value="${redis.host}" />
  15. <property name="port" value="${redis.port}" />
  16. <property name="password" value="${redis.password}" />
  17. <property name="poolConfig" ref="jedisPoolConfig" />
  18. </bean>
  19.  
  20. <!-- redisTemplate配置,redisTemplate是对Jedis的对redis操作的扩展,有更多的操作,封装使操作更便捷 -->
  21. <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
  22. <property name="connectionFactory" ref="jedisConnectionFactory" />
  23. </bean>

redis.properties文件配置:

  1. #redis的服务器地址
  2. redis.host=这里写你的ip
  3. #redis的服务端口
  4. redis.port=6379
  5. #密码
  6. redis.password=这里写你的密码
  7. #链接数据库
  8. redis.default.db=0
  9. #客户端超时时间单位是毫秒
  10. redis.timeout=100000
  11. #最大连接数
  12. redis.maxActive=300
  13. #最大空闲数
  14. redis.maxIdle=100
  15. #最大建立连接等待时间
  16. redis.maxWaitMillis=1000

3、接着,具体实现代码;

序列化和反序列化工具类:

  1. public class SerializerUtil {
  2.  
  3. /**
  4. * 序列化
  5. * @param object
  6. * @return
  7. */
  8. public static byte[] serializeObj(Object object) {
  9. ObjectOutputStream oos = null;
  10. ByteArrayOutputStream baos = null;
  11. try {
  12. baos = new ByteArrayOutputStream();
  13. oos = new ObjectOutputStream(baos);
  14. oos.writeObject(object);
  15. byte[] bytes = baos.toByteArray();
  16. return bytes;
  17. } catch (Exception e) {
  18. throw new RuntimeException("序列化失败!", e);
  19. }
  20. }
  21.  
  22. /**
  23. * 反序列化
  24. * @param bytes
  25. * @return
  26. */
  27. public static Object deserializeObj(byte[] bytes) {
  28. if (bytes == null){
  29. return null;
  30. }
  31. ByteArrayInputStream bais = null;
  32. try {
  33. bais = new ByteArrayInputStream(bytes);
  34. ObjectInputStream ois = new ObjectInputStream(bais);
  35. return ois.readObject();
  36. } catch (Exception e) {
  37. throw new RuntimeException("反序列化失败!", e);
  38. }
  39. }
  40. }

操作实现类,这里只提供了3个实现方法,其他的可以按照自己需求自己实现:

  1. @Component
  2. public class RedisCache {
  3.  
  4. @Resource
  5. private RedisTemplate<String, String> redisTemplate;
  6.  
  7. /**
  8. * 添加缓存数据
  9. * @param key
  10. * @param obj
  11. * @param <T>
  12. * @return
  13. * @throws Exception
  14. */
  15. public <T> boolean putCache(String key, T obj) throws Exception {
  16. final byte[] bkey = key.getBytes();
  17. final byte[] bvalue = SerializerUtil.serializeObj(obj);
  18. boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
  19. @Override
  20. public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
  21. return connection.setNX(bkey, bvalue);
  22. }
  23. });
  24. return result;
  25. }
  26.  
  27. /**
  28. * 添加缓存数据,设定缓存失效时间
  29. * @param key
  30. * @param obj
  31. * @param expireTime
  32. * @param <T>
  33. * @throws Exception
  34. */
  35. public <T> void putCacheWithExpireTime(String key, T obj, final long expireTime) throws Exception {
  36. final byte[] bkey = key.getBytes();
  37. final byte[] bvalue = SerializerUtil.serializeObj(obj);
  38. redisTemplate.execute(new RedisCallback<Boolean>() {
  39. @Override
  40. public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
  41. connection.setEx(bkey, expireTime, bvalue);
  42. return true;
  43. }
  44. });
  45. }
  46.  
  47. /**
  48. * 根据key取缓存数据
  49. * @param key
  50. * @param <T>
  51. * @return
  52. * @throws Exception
  53. */
  54. public <T> T getCache(final String key) throws Exception {
  55. byte[] result = redisTemplate.execute(new RedisCallback<byte[]>() {
  56. @Override
  57. public byte[] doInRedis(RedisConnection connection) throws DataAccessException {
  58. return connection.get(key.getBytes());
  59. }
  60. });
  61. if (result == null) {
  62. return null;
  63. }
  64. return (T) SerializerUtil.deserializeObj(result);
  65. }
  66. }

4、测试代码;

  1. @Test
  2. public void test7() throws Exception{
  3. List<String> list = new ArrayList<String>();
  4. list.add("测试list");
  5. list.add("测试list2");
  6.  
  7. Map<String,Object> map = new HashMap<String, Object>();
  8. map.put("test*","测试数据");
  9. map.put("测试数据","啥的");
  10. map.put("listTest",list);
  11. redisCache.putCache("testMap",map);
  12.  
  13. Map<String,Object> mapResult = redisCache.getCache("testMap");
  14. System.out.print(mapResult.toString());
  15.  
  16. }

结果:

5、OK,一切正常。ps:有兴趣的同学可以去看看redis源码,挺好!

Spring + Jedis集成Redis(单例redis数据库)的更多相关文章

  1. Spring + Jedis集成Redis(集群redis数据库)

    前段时间说过单例redis数据库的方法,但是生成环境一般不会使用,基本上都是集群redis数据库,所以这里说说集群redis的代码. 1.pom.xml引入jar <!--Redis--> ...

  2. Redis 单例、主从模式、sentinel 以及集群的配置方式及优缺点对比(转)

    摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要对其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架的高可用性 ...

  3. ThinkPHP5+Redis单例型购物车

    <?php /** * Redis + 单例型购物车 * param $basket 存储商品信息 * param $ins 存储实例化对象 */ namespace lib; use redi ...

  4. Spring容器-ApplicationContext的单例设计

    Spring容器-ApplicationContext的单例设计   每次通过new创建一个ApplicationContext容器,都会执行refresh方法,看源代码了解到这个refresh方法会 ...

  5. SSM-Spring-05:Spring的bean是单例还是多例,怎么改变?

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- Spring的bean是单例的 它在Spring容器初始化的时候创建对象 可以修改为多例,在此bean节点中添 ...

  6. 【Spring】8、Spring框架中的单例Beans是线程安全的么

    看到这样一个问题:spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  7. Spring5源码解析-Spring框架中的单例和原型bean

    Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过& ...

  8. Spring 的Controller 是单例or多例

    Spring 的Controller 是单例or多例 你什么也不肯放弃,又得到了什么? 背景:今天写代码遇到一个Controller 中的线程安全问题,那么Spring 的Controller 是单例 ...

  9. Spring框架中的单例bean是线程安全的吗?

    不,Spring框架中的单例bean不是线程安全的.

  10. Spring 框架中的单例 bean 是线程安全的吗?

    不,Spring 框架中的单例 bean 不是线程安全的.

随机推荐

  1. Log4j 简单应用

    #输出日志的包路径log4j.logger.com=DEBUG,FILE log4j.rootLogger=WARN,stdout #控制台日志 log4j.appender.stdout=org.a ...

  2. [uva11722&&cogs1488]和朋友会面Joining with Friend

    几何概型,<训练指南>的题.分类讨论太神啦我不会,我只会萌萌哒的simpson强上~这里用正方形在y=x-w的左上方的面积减去在y=x+w左上方的面积就是两条直线之间的面积,然后切出来的每 ...

  3. Linux 内核数据结构:双向链表

    Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为 ...

  4. 【网络基础编程】第三节 C/S

    学习地址: C语言中文网 - 实现迭代服务端和客户端 GNU - Closing a Socket 前面介绍的程序,不管Service 端还是 Client端,都有一个问题,就是处理完一个 accep ...

  5. Jquery ajax运用执行顺序有误怎么解决

    在这儿,可能就要提示一个ajax的一个属性async async默认的设置值为true,这种情况为异步方式,就是说当ajax发送请求后,在等待server端返回的这个过程中,前台会继续执行ajax块后 ...

  6. js日期格式转换

    var mydate=new Date(); var year=mydate.getFullYear(); //获取四位数getYear() 获取两位 var month=mydate.getMont ...

  7. ecshop 实现购物车退出不清空

    ecshop模板在使用过程中会遇到会员退出再登陆时购物车里面的商品会被清空掉的,通过ecshop开发中心的技术,整理的文档,对程序做简单修改即可实现会员退出不清空购物车 ECShop版本:V2.7.3 ...

  8. Android开发环境的搭建

    在学习android时,环境的搭建是学习android的第一步,为了记住第一步特写了这篇文章. 第一步,安装jdk,因为eclipse的运行需要jdk才可以,所以jdk的安装时第一步.安装过程和普通的 ...

  9. Oracle开机自启动

    linux下启动oracle su - oracle #用oracle用户登陆 sqlplus /nolog conn /as sysdba startup exit lsnrctl start ex ...

  10. 作为一名前端er,从武汉来到深圳三个月有感

    来到深圳已经三个月了,从最开始的担心自己的能力不够怕不能够在深圳这个互联网产品及其发达的城市立足下来,到现在已经慢慢地拾起了一丁点的信心了 (虽然还有很多知识是不够的.但是相当于之前我的,我是觉得我已 ...