当前位置: 首页 > 编程日记 > 正文

Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点。并且会与一些低版本的Spring有冲突,要看官方文档和不断的测试。

继上一篇文章http://www.cnblogs.com/EasonJim/p/7625738.html中提到的几款客户端,它们基本都能和Spring集成。

下面介绍的是基于Spring原生的spring-data-redis去集成。

还要注意的是,Spring整合了Jedis框架进去,所以下面配置上还会基于Jedis去实现的,但是Spring在上层已经集成了很好用的工具类。

而整个框架基于Spring Data,里面集成了主流的应用,比如Redis,MongoDB等,而基于这些应用的一些非常好用的框架也集成了,比如Jedis这些。

我猜测,基于Spring Data Redis去集成的,底层还是用Jedis去实现,应该是可以实现客户端集群的,下次我再实践详细分析一下。

Spring Data Redis

项目结构:

POM:

<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.x.redis</groupId><artifactId>Spring_redis</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>Spring_redis</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency>  <groupId>org.springframework.data</groupId>  <artifactId>spring-data-redis</artifactId>  <version>1.0.2.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-core</artifactId>  <version>3.1.2.RELEASE</version>  </dependency>  <dependency>  <groupId>redis.clients</groupId>  <artifactId>jedis</artifactId>  <version>2.1.0</version>  </dependency>  <dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId>  <version>4.8.2</version>  <scope>test</scope>  </dependency>  <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.1</version></dependency><!-- 将现有的jakarta commons logging的调用转换成lsf4j的调用。 --><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.6.1</version></dependency><!-- Hack:确保commons-logging的jar包不被引入,否则将和jcl-over-slf4j冲突 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version><scope>provided</scope></dependency><!-- slf4j的实现:logback,用来取代log4j。更快、更强! --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>0.9.24</version><scope>runtime</scope></dependency></dependencies>
</project>

applicationContext.xml:

context:property-placeholder标签用来导入properties文件。从而替换${redis.maxIdle}这样的变量。

context:component-scan是为了在com.x.redis.dao报下的类能够实用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:p="http://www.springframework.org/schema/p"  xmlns:context="http://www.springframework.org/schema/context"  xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"  xmlns:aop="http://www.springframework.org/schema/aop"  xsi:schemaLocation="  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">  <context:property-placeholder location="classpath:redis.properties" />  <context:component-scan base-package="com.x.redis.dao"></context:component-scan><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:password="${redis.pass}"  p:pool-config-ref="poolConfig"/>  <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">  <property name="connectionFactory"   ref="connectionFactory" />  </bean>         <bean id="userDAO" class="com.x.redis.dao.impl.UserDAOImpl" />   
</beans>

redis.properties:

# Redis settings
#redis.host=192.168.20.101
#redis.port=6380
#redis.pass=foobared
redis.host=127.0.0.1
redis.port=6379
redis.pass=redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true

UserDAOImpl:

Spring对DAO层的封装很多用了类似于下面代码的模板方式。

RedisTemplate就是Spring对Redis的一个封装。

public class UserDAOImpl implements UserDAO {@Autowiredprotected RedisTemplate<Serializable, Serializable> redisTemplate;public void saveUser(final User user) {redisTemplate.execute(new RedisCallback<Object>() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {connection.set(redisTemplate.getStringSerializer().serialize("user.uid." + user.getId()),redisTemplate.getStringSerializer().serialize(user.getName()));return null;}});}@Overridepublic User getUser(final long id) {return redisTemplate.execute(new RedisCallback<User>() {@Overridepublic User doInRedis(RedisConnection connection) throws DataAccessException {byte[] key = redisTemplate.getStringSerializer().serialize("user.uid." + id);if (connection.exists(key)) {byte[] value = connection.get(key);String name = redisTemplate.getStringSerializer().deserialize(value);User user = new User();user.setName(name);user.setId(id);return user;}return null;}});}}

User:

public class User {private long id;private String name;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

测试代码:

public static void main(String[] args) {ApplicationContext ac =  new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");UserDAO userDAO = (UserDAO)ac.getBean("userDAO");User user1 = new User();user1.setId(1);user1.setName("obama");userDAO.saveUser(user1);User user2 = userDAO.getUser(1);System.out.println(user2.getName());
}

参考:

http://www.cnblogs.com/tankaixiong/p/3660075.html(以上内容转自此篇文章)

http://blog.csdn.net/defonds/article/details/48716161

http://blog.csdn.net/albertfly/article/details/51494080

http://www.cnblogs.com/mrlinfeng/p/5857775.html

http://blog.csdn.net/fighterandknight/article/details/53432276/

http://www.cnblogs.com/cuglkb/p/6862609.html

http://snowolf.iteye.com/blog/1666908

http://www.cnblogs.com/wuxinliulei/p/5216712.html

http://blog.csdn.net/tomcat_2014/article/details/55260306

https://my.oschina.net/u/866380/blog/521658

http://blog.csdn.net/u013725455/article/details/52129283

http://blog.sina.com.cn/s/blog_630d50dc0102wwmi.html

相关文章:

leetcode -- 3 sum

3-sum 题目描写叙述&#xff1a; Given an array S of n integers, are there elements a, b, c in S such that a b c 0? Find all unique triplets in the array which gives the sum of zero. 题目要求&#xff1a; Elements in a triplet (a,b,c) must be in non-desc…

C#中如何得到机器的IP地址

如何使用DNS类并得到机器的IP地址的技巧 介绍 这篇文章并不是技术纵览或大型讨论&#xff0c;而更像是关于如何得到IP地址或主机名称的技巧集锦。在 Win32 API编程中你可以使用NetWork API&#xff0c;在.NET平台中也是类似的。唯一的不同之处是你要找到并理解为完成这个任务需…

让浏览器开挂的插件,测评师教你如何选

CSDN下起了红包雨399 元智能音箱199 元天猫精灵300元现金红包/会员100元红包/会员更有千万流量曝光100%有奖......作为日常总发现 " 宝藏 " 的你总体验过一些 " 王炸 " 级别的chrome插件让你想 “ 真诚 ” 安利所以&#xff0c;CSDN开启了彩虹屁chrome插件…

JQuery:JQuery 中的CSS()方法

JQuery:CSS()方法jQuery css()方法&#xff1a;css()方法设置或返回被选元素的一个或多个样式属性。1、返回 CSS 属性如需返回指定的 CSS 属性的值&#xff0c;请使用如下语法&#xff1a;css("propertyname");下面的例子将返回首个匹配元素的 background-color 值&a…

j.u.c.locks.AbstractQueuedSynchronizer.Node

2019独角兽企业重金招聘Python工程师标准>>> AQS是JUC当中最核心的部分&#xff0c;大部分多线程讲解&#xff0c;都不会详细讲AQS&#xff0c;AQS的源代码&#xff0c;要看明白还是有点困难的。但是一旦看明白了&#xff0c;结构还是蛮清晰的。这里我们把AQS拆开&a…

使用C#开发COM+组件

一般来说&#xff0c;在IT技术界以及硬件产业&#xff0c;技术的更新换代速度非常得惊人&#xff0c;而惯例是所有的新技术都会遵循向下兼容的原则&#xff0c;但是.NET技术不仅仅做到了这一点&#xff0c;.NET甚至实现了相互之间的各自调用&#xff0c;这一点是非常难能可贵的…

香奈儿的 AI 实验室里,发生了什么?

作者 | 库珀来源 | 数据实战派头图 | 下载于ICphotoAI 已经能够在给你播报今日天气时提供穿衣建议。相信你大多数情况下都听进去了。如果它给你提供美妆建议呢&#xff1f;包括香奈儿在内&#xff0c;越来越多的美容品牌正在将 AI 技术结合到其产品之中。可是&#xff0c;人工智…

VS code for python开发利器

转发点赞支持引言最近在整理python自动化测试课程的内容&#xff0c;发现了微软出的vs code编辑器太牛逼了&#xff0c;非常好用&#xff0c;而且轻量的不要不要的&#xff0c;特此记录下&#xff0c;有选择纠结症的朋友我强烈推荐使用ta。PS&#xff1a;兼容win10且兼容高分辨…

C#编码标准--命名约定和风格

命名约定和风格 1&#xff0e; 使用Pascal的命名规范命名类型和方法的名字。 public class SomeClass { public SomeMethod(){} } 2&#xff0e; 使用camel命名规范命名局部变量和方法的参数。 int number; void MyMethod(int someNumber) {} 3&#xff0e; 在命名接…

与AMD合并后,赛灵思与英特尔、英伟达在数据中心市场呈“三足鼎立”之势

被以350亿美元的价格收购后&#xff0c;全球独一家FPGA公司赛灵思归于芯片巨头AMD的麾下&#xff0c;正式成为AMD的一份子。如果英伟达收购ARM顺利进行&#xff0c;无疑将让半导体行业格局再次发生巨变。 赛灵思为什么会选择归于AMD旗下&#xff1f;成为AMD的一份子之后&#…

Android -- Fragment注意事项

ViewPagerFragment 让Fragment成为ViewPager的一页时&#xff0c;FragmentManager会一直保存管理创建好了的Fragment&#xff0c;即使当前不是显示的这一页&#xff0c;Fragment对象也不会被销毁&#xff0c;…

C#编码标准--编码习惯

1. 避免将多个类放在一个文件里面。 2. 一个文件应该只有一个命名空间&#xff0c;避免将多个命名空间放在同一个文件里面。 3. 一个文件最好不要超过500行的代码&#xff08;不包括机器产生的代码&#xff09;。 4. 一个方法的代码长度最好不要超过25行。 5. 避免方法中有超过…

官宣!《新程序员·开发者黄金十年》正式发布

“在互联网还不发达的时代&#xff0c;就是《程序员》伴我成长的。”“怀念啊&#xff0c;曾经《程序员》的日子。”“我是看着《程序员》长大的&#xff0c;大二时买了创刊号。”“这可是我们这一代人大学时候满满的回忆&#xff0c;也是当时寝室中传阅最多的书。”“每年的《…

java笔记(一)

2019独角兽企业重金招聘Python工程师标准>>> java数组是静态的&#xff0c;即数组被初始化后&#xff0c;其所占内存空间、数组长度是不可变的。初始化数组有静态初始化和动态初始化两种&#xff1a; public class ArrayTest {//以下是数组的两种静态初始化String[]…

遮罩效果的实现

很多时候我们需要用到遮罩弹出层效果&#xff0c;下面给出一个简单的遮罩demo&#xff1b; 效果演示 demo代码 注意引入jquery <html> <head> <meta charset"utf-8"> <title>遮罩</title><script srcjquery-1.8.3.min.js></s…

C#实现汉字转化为拼音

其实现的原理就是先将汉字转化成为内码&#xff0c;然后通过内码和拼音的对照来查找。 详细的代码如下所示&#xff1a; public class chs2py {private static int[] pyvaluenew int[]{-20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051,-20036,…

c基础知识复习

C的发展历程 C原本是为了开发UNIX操作系统而设计的语言&#xff1b;如此说&#xff0c;应该C比UNIX更早问世&#xff0c;而事实并非如此&#xff0c;最早的UNIX是由汇编写的&#xff1b; C语言本来是美国人开发的&#xff0c;解读C的声明&#xff0c;最好还是用英语来读&#x…

训练 GPT-3,为什么原有的深度学习框架吃不消?

本文梳理了深度学习框架在支持大规模预训练模型时面临的技术挑战&#xff0c;以及当前各类框架的基本解决思路&#xff0c;帮助算法工程师对业界各类框架的分布式训练能力有更清晰的认知。作者 | 一流科技CEO袁进辉头图 | 下载于ICphoto近年来&#xff0c;深度学习被广泛应用到…

ImageMagick简单记录

一、安装 mac下的安装非常简单 brew search ImageMagick brew install xxx 安装后&#xff0c;可验证 magick logo: logo.gif identify logo.gif display logo.gif 更多安装方式参考&#xff1a;http://www.imagemagick.org/script/download.php 二、命令介绍 命令概览convert&…

低代码、RPA 和 AI,有什么区别

来源 | LowCode低码时代头图 | 下载于视觉中国在To B领域&#xff0c;低代码、RPA和AI可谓是“流量担当”&#xff0c;它们自带To B基因&#xff0c;搭载快速发展的企业服务赛道&#xff0c;在企业级IT服务这一细分市场崭露头角。以这三者为代表的前沿理念和科技引领IT产业升级…

C# 获取 IE 临时文件

大家知道&#xff0c;在我们访问一个网站的时候。系统会把这个网站上的图片&#xff0c;动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 <Drives>:/Documents and Settings/<user>/Local Settings/Temporary Internet Files访问。但是可能我们都没有想…

wifidog接口文档(转)

目录(?)[-] 网关心跳协议 请求信息 回复格式 例子用户状态心跳协议 请求格式 注意 回复格式 状态码 例子跳转协议 请求格式 例子注册协议 请求格式 例子wifidog是搭建无线热点认证系统的解决方案之一&#xff0c;他比nocat更适合互联网营销思路。目前支持openwrt系统&#xff…

Oracle XQuery 过滤XML查询SQL

Oralce 支持SQL XQuery查询 一个简单示例&#xff1a; SELECT XMLQuery(for $i in /Videogame return $i/Type passing by value X RETURNING CONTENT) FROM (SELECT XMLTYPE(<Videogame><Type>Racing</Type><Name>NFS Most Wanted</Name><…

C#2.0匿名函数

C# 2.0中提供了通过delegate实现匿名函数功能&#xff0c;能有效地减少用户记代码工作&#xff0c;例如 以下为引用&#xff1a; ... button1.Click new EventHandler(button1_Click); ... void button1_Click(Object sender, EventArgs e) { // Do something, the button…

第三届北京智源大会开幕,全球最大智能模型“悟道2.0”重磅发布

6月1日&#xff0c;由北京智源人工智能研究院&#xff08;以下简称智源研究院&#xff09;主办的2021北京智源大会在北京中关村国家自主创新示范区会议中心成功开幕。 北京智源大会是智源研究院主办的年度国际性人工智能高端学术交流活动&#xff0c;定位于“AI内行顶级盛会”…

Cloneable接口和循环冗余校验算法

1 Cloneable 接口 实现该接口的类可以调用clone()方法合法地对该类实例进行按字段复制。按照惯例&#xff0c;实现此接口的类应该使用公共方法重写 Object.clone&#xff08;它是受保护的&#xff09; 2 循环冗余校验算法 循环冗余校验&#xff08;英语&#xff1a;Cyclic redu…

IOS自定义表格UITableViewCell

在UITableView中&#xff0c;自定义表格&#xff0c;最原始是继承UITableViewCell&#xff0c;然后通过写代码方式去搞&#xff0c;但是这个费事了。 1.在storyboard中 给一个ViewController的tabieview增加自定义的UITableViewCell&#xff0c;可以直接从 object Library里面选…

postfix邮件服务器搭建

项目环境&#xff1a;一台server ip:192.168.1.100 一台mail ip:192.168.1.200 一台win7 ip:192.168.1.222项目需求&#xff1a;1&#xff1a;在DNS Master上搭建DNS&#xff0c;能够解析mail.sw.com2&#xff1a;在Mail Server上部署邮件服务器&#xff0c;和webmail软件3…

从DataView中生成Excel报表的方案(C#)

正文&#xff1a; 一、首先要引用一个Excel的组件&#xff0c;我一开始是在Office XP下尝试的&#xff0c;不 成功&#xff0c;后来把XP给干掉&#xff0c;装2k&#xff0c;就成功了&#xff0c;所以这里分享的是Office 2k下 引用相关组件来实现功能的&#xff0c;在工程中引…

被Python「苦虐」的日子太惨了!

Python因为其优越的特性广泛应用于数据分析、人工智能、Web开发、后端开发、自动化测试/运维、爬虫等领域&#xff0c;也得到了很多企业的青睐。甚至连BATZJ的技术大牛&#xff0c;都无可否认Python现在对于一个程序员发展的重要性&#xff01;最近一两年&#xff0c;我身边也有…