- 浏览: 724960 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (168)
- CSS (1)
- Eclipse (4)
- English (1)
- ExtJS (1)
- Git (3)
- Grails (3)
- Groovy (2)
- Hadoop (7)
- HTML5 (2)
- JavaScript (3)
- Maven (2)
- MQ (5)
- MyBatis (3)
- NodeJS (6)
- NoSQL (4)
- Oracle (6)
- PDF (3)
- Python (9)
- Redis (17)
- Tomcat (2)
- Unix (8)
- Web Service (6)
- 安全 (1)
- 电子书 (6)
- 工具 (1)
- 其他 (21)
- 人工智能 (2)
- 视觉 (2)
- 算法 (6)
- 图表 (1)
- 网络 (13)
- 性能 (5)
- 游戏 (9)
- 字节码 (3)
- 机器学习 (1)
最新评论
-
lijunwyf:
cevin15 写道可以看下这个开源软件,https://gi ...
用markdown2html把md转换成html -
cevin15:
可以看下这个开源软件,https://github.com/c ...
用markdown2html把md转换成html -
Raina:
运行不了呢……提示错误无法加载主类Baiduwallpaper ...
用Java更换Windows桌面壁纸 -
苏城细雨沐秋风:
我把解码的jar添加到类路径后,mp3可以播放,但是flac和 ...
java播放mp3/ogg/ape/flac音乐 -
peishuai1987:
请问楼主现在怎么样了,读了很多源码吗,比如mybatis、sp ...
mybatis源码阅读心得
1. spring-data-redis简介
封装了一下redis的客户端,使得使用起来更方便。
优点是把客户端连接放到一个连接池里,从而提高性能。还有就是可以不同的客户端之间实现切换,而不用改一行代码(Spring惯用的一个手法)。
本文写作时最新版是1.3,
目前支持下面4种java客户端,可以自由切换而不用改代码。
2. twitter简介
twitter如果没用过的话,可以理解成类似于国内的新浪微博。因为微博的访问量和使用人数极大,用传统的关系型数据库支撑不了,所以有了用redis这种非关系型数据库的架构设计。
本文我们将用spring-data-redis来实现一个类似twitter的网站。
3. 环境
本人亲测通过环境
jdk 1.6.0_45 64bit
gradle 1.7
tomcat 7.0.35
redis 2.8.11 win64
jedis 2.5.1
spring 3.2.9
spring-data-redis 1.3.0
4. 先动手操作
4.1 首先git clone以下项目
https://github.com/spring-projects/spring-data-keyvalue-examples/tree/master/retwisj
4.2 本人做了一些修改,一些3pp改成本文写作时最新的版本
build.gradle
gradle.properties
4.3 编译
4.4 将retwisj.war放入tomcat的webapp目录下,启动tomcat
4.5 访问http://localhost:8080/retwisj
花几分钟上去玩一下,熟悉一下功能。
好了,我们已经做好了一个微博网站了。玩好了我们简单分析一下代码实现。
5. 实现分析
5.1 表结构设计
5.1.1 用户(User)
用以前的关系型数据库设计是这样的
而用redis的则变成了这样
将用户的名字和密码作为一个hash存入
对应的redis原生命令是
uid是自增长的,可以用redis的INCR来实现,这是一个原子操作
我们要保存username和uid的对应关系,比如一个user登录时,我们要得到他的uid。可以创建一个倒转的key来实现此功能。user:[name]:uid
还创建了一个users用来保存所有uid的list
5.1.2 微博(Post)
同样的,用global:pid来记录自增长的post id
将微博的内容、时间和作者作为一个hash存入
某个用户的所有微博
所有微博列表(Timeline)
5.1.3 关系(粉丝(Follower),关注(Following))
比如user2关注了user1,则user2是user1的粉丝,
user3也关注了user1,
则user1被user2,user3所关注
新浪微博上姚晨的粉丝有7000万,光记录她一个人的粉丝就要7000万条记录。
如果用传统的关系型数据库实现,压力很大。
5.2 安全验证
我们不用session来跟踪用户,而用cookie。
每当用户登录后,为他生成一个随机数(令牌),发给该用户,让他作为cookie保存,这个cookie用来验证用户的身份。
同样的存储一个倒转的key,可以根据cookie来得到uid
5.3 包的结构
5.4 使用redisTemplate
applicationContext-redis.xml
5.5 web层
采用spring MVC和JSP
5.5.1 Controller层
RetwisController
5.5.2 CookieInterceptor
对于用户验证,采用cookie的方式,写了一个Spring MVC的拦截器
并在retwisj-servlet.xml里配置
执行效果就是在客户端保存了一个叫"retwisauth"的cookie,保存了用户的令牌。
5.5.3 i18
CookieLocaleResolver把语言作为cookie存在客户端
执行效果就是在客户端保存了一个叫"org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE"的cookie,保存了语言。
LocaleChangeInterceptor可以用来变更语言
这样就可以通过http://localhost:8080/retwisj/?lang=cn来变更语言
5.6 持久层
RetwisRepository
如下代码示例了如何用intersect来找出2个用户相同的粉丝
如下代码示例了用RedisAtomicLong实现自增长的id,BoundHashOperations来存储用户的用户名和密码
封装了一下redis的客户端,使得使用起来更方便。
优点是把客户端连接放到一个连接池里,从而提高性能。还有就是可以不同的客户端之间实现切换,而不用改一行代码(Spring惯用的一个手法)。
本文写作时最新版是1.3,
目前支持下面4种java客户端,可以自由切换而不用改代码。
2. twitter简介
twitter如果没用过的话,可以理解成类似于国内的新浪微博。因为微博的访问量和使用人数极大,用传统的关系型数据库支撑不了,所以有了用redis这种非关系型数据库的架构设计。
本文我们将用spring-data-redis来实现一个类似twitter的网站。
3. 环境
本人亲测通过环境
jdk 1.6.0_45 64bit
gradle 1.7
tomcat 7.0.35
redis 2.8.11 win64
jedis 2.5.1
spring 3.2.9
spring-data-redis 1.3.0
4. 先动手操作
4.1 首先git clone以下项目
https://github.com/spring-projects/spring-data-keyvalue-examples/tree/master/retwisj
4.2 本人做了一些修改,一些3pp改成本文写作时最新的版本
build.gradle
compile "redis.clients:jedis:2.5.1"
gradle.properties
springVersion = 3.2.9.RELEASE springRedisVersion = 1.3.0.RELEASE
4.3 编译
gradle build
4.4 将retwisj.war放入tomcat的webapp目录下,启动tomcat
4.5 访问http://localhost:8080/retwisj
花几分钟上去玩一下,熟悉一下功能。
好了,我们已经做好了一个微博网站了。玩好了我们简单分析一下代码实现。
5. 实现分析
5.1 表结构设计
5.1.1 用户(User)
用以前的关系型数据库设计是这样的
Key | Username | Password |
1 | springrod | interface21 |
2 | costinl | this is fun |
而用redis的则变成了这样
Key | Type | Value |
uid:1 | hash | {name: springrod, pass: interface21} |
uid:2 | hash | {name: costinl, pass: secret} |
将用户的名字和密码作为一个hash存入
对应的redis原生命令是
HMSET user:1 name springrod pass interface21
uid是自增长的,可以用redis的INCR来实现,这是一个原子操作
INCR global:uid
Key | Type | Value |
global:uid | string | 2 |
我们要保存username和uid的对应关系,比如一个user登录时,我们要得到他的uid。可以创建一个倒转的key来实现此功能。user:[name]:uid
还创建了一个users用来保存所有uid的list
Key | Type | Value |
user:springrod:uid | string | 1 |
user:costinl:uid | string | 2 |
users | list | {1, 2} |
5.1.2 微博(Post)
同样的,用global:pid来记录自增长的post id
Key | Type | Value |
global:pid | string | 2 |
将微博的内容、时间和作者作为一个hash存入
Key | Type | Value |
pid:1 | hash | {content: Hello World, time: 1301931414757, uid: 1} |
pid:2 | hash | {content: Working on some cool stuff, time: 1301931414897, uid: 1} |
pid:3 | hash | {content: Checking out RetwisJ, time: 1301931454897, uid: 2} |
某个用户的所有微博
Key | Type | Value |
uid:1:posts | list | {1, 2} |
uid:2:posts | list | {3} |
所有微博列表(Timeline)
Key | Type | Value |
timeline | list | {1, 2, 3} |
5.1.3 关系(粉丝(Follower),关注(Following))
比如user2关注了user1,则user2是user1的粉丝,
user3也关注了user1,
则user1被user2,user3所关注
Key | Type | Value |
uid:1:followers | set | {2,3} |
uid:2:following | set | {1} |
uid:3:following | set | {1} |
新浪微博上姚晨的粉丝有7000万,光记录她一个人的粉丝就要7000万条记录。
如果用传统的关系型数据库实现,压力很大。
5.2 安全验证
我们不用session来跟踪用户,而用cookie。
每当用户登录后,为他生成一个随机数(令牌),发给该用户,让他作为cookie保存,这个cookie用来验证用户的身份。
同样的存储一个倒转的key,可以根据cookie来得到uid
Key | Type | Value |
uid:2:auth | string | {fea5e81ac8ca77622bed1c2132a021f9} |
auth:fea5e81ac8ca77622bed1c2132a021f9 | string | {2} |
5.3 包的结构
org.springframework.data.redis.sample.retwisj.web | web层 |
org.springframework.data.redis.sample.retwisj.redis | 持久层 |
org.springframework.data.redis.sample.retwisj | 领域层 |
5.4 使用redisTemplate
applicationContext-redis.xml
<beans> <context:property-placeholder location="classpath:redis.properties"/> <!-- Redis client 这里就是不改代码实现不同客户端切换的地方了,我们用jedis--> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate" p:connection-factory-ref="connectionFactory"/> <context:annotation-config /> <context:component-scan base-package="org.springframework.data.redis.samples"/> </beans>
5.5 web层
采用spring MVC和JSP
5.5.1 Controller层
RetwisController
5.5.2 CookieInterceptor
对于用户验证,采用cookie的方式,写了一个Spring MVC的拦截器
public class CookieInterceptor extends HandlerInterceptorAdapter
并在retwisj-servlet.xml里配置
<mvc:interceptors> <bean class="org.springframework.data.redis.samples.retwisj.web.CookieInterceptor" /> </mvc:interceptors>
执行效果就是在客户端保存了一个叫"retwisauth"的cookie,保存了用户的令牌。
5.5.3 i18
CookieLocaleResolver把语言作为cookie存在客户端
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
执行效果就是在客户端保存了一个叫"org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE"的cookie,保存了语言。
LocaleChangeInterceptor可以用来变更语言
<mvc:interceptors> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" p:paramName="lang"/> </mvc:interceptors>
这样就可以通过http://localhost:8080/retwisj/?lang=cn来变更语言
5.6 持久层
RetwisRepository
如下代码示例了如何用intersect来找出2个用户相同的粉丝
private RedisSet<String> following(String uid) { return new DefaultRedisSet<String>(KeyUtils.following(uid), template); } public List<String> commonFollowers(String uid, String targetUid) { RedisSet<String> tempSet = following(uid).intersectAndStore(following(targetUid), KeyUtils.commonFollowers(uid, targetUid)); tempSet.expire(5, TimeUnit.SECONDS); return covertUidsToNames(tempSet.getKey()); }
如下代码示例了用RedisAtomicLong实现自增长的id,BoundHashOperations来存储用户的用户名和密码
public String addUser(String name, String password) { String uid = String.valueOf(userIdCounter.incrementAndGet()); // save user as hash // uid -> user BoundHashOperations<String, String, String> userOps = template.boundHashOps(KeyUtils.uid(uid)); userOps.put("name", name); userOps.put("pass", password); valueOps.set(KeyUtils.user(name), uid); users.addFirst(name); return addAuth(name); }
发表评论
-
redis官方文档中文版_Partitioning : 怎么样将你的数据分布在多个redis instance上?
2014-07-30 17:26 2306本文转载自http://skynetdoc.com/?p=11 ... -
redis源码阅读笔记(13)——事务
2014-07-22 15:40 11771. 高层视角解读 redis的 ... -
redis源码阅读笔记(12)——发布与订阅
2014-07-21 16:33 16301. 发布/订阅 发布/订阅(Publish/subscrib ... -
redis源码阅读笔记(11)——服务器与客户端
2014-07-21 16:14 21571.高层视角 可首先阅读《Redis设计与实现》中的服务器与 ... -
redis源码阅读笔记(10)——事件
2014-07-20 14:40 15461. Reactor模式 Reactor模式(反应器模式)是一 ... -
redis源码阅读笔记(9)——RDB,AOF持久化
2014-07-18 16:12 24971. 持久化 Redis提供了两种持久化数据到硬盘的方式。 R ... -
redis源码阅读笔记(8)——数据库
2014-07-18 11:27 12901. 高层视角解读 Redis设计与实现中的数据库章节 Re ... -
redis源码阅读笔记(7)——对象
2014-07-12 23:19 7114本篇我们研究redis里的对象。 1. 概述 redis有5 ... -
redis源码阅读笔记(6)——ziplist
2014-07-12 01:13 12061.高层视角解读 压缩列表(ziplist)是为了尽可能地节 ... -
redis源码阅读笔记(5)——intset
2014-07-08 16:23 8781.高层视角解读 整数集合(intset)是集合键的底层实现 ... -
redis源码阅读笔记(4)——skiplist
2014-07-08 15:08 9830.跳表基础知识 跳表(s ... -
redis源码阅读笔记(3)——dict
2014-07-08 13:26 14201.高层视角解读 字典, ... -
redis源码阅读笔记(2)——adlist
2014-07-07 15:54 1822adlist(A doubly linked list)是Re ... -
redis源码阅读笔记(1)——sds
2014-07-06 01:03 1434最近突然一时兴起,开 ... -
jedis/nosql-unit初步
2014-06-17 16:36 11961. redis的客户端概述 redis的客户端实在太多了,比 ... -
redis初步
2014-06-16 23:19 16440. 介绍 redis是一个高性 ...
相关推荐
spring-boot-starter-redis spring-boot-starter-security spring-boot-starter-social-facebook spring-boot-starter-social-linkedin spring-boot-starter-social-twitter spring-...
Spring框架提供了对Redis的支持,通过Spring Data Redis模块可以轻松地进行集成。 **Bootstrap**是Twitter开源的一个前端开发框架,它提供了丰富的预定义样式、组件和JavaScript插件,帮助开发者快速创建响应式和...
Spring Data Redis是Spring Data项目的一部分,它提供了对Redis内存数据存储的集成。文档中会详细讲解如何配置、操作Redis数据结构,以及利用Spring Data的便捷API进行持久化操作。 5. **spring-data-jpa-...
- **与 Spring Cloud Config 的配合**:可以与 Spring Cloud Config 配合使用,实现配置的热更新。 #### 3. Spring Cloud Netflix - **简介**:提供了一系列基于 Netflix OSS 组件的工具包,这些组件广泛应用于...
Spring Data简化了对各种数据存储的访问,包括关系型数据库(如JDBC)和NoSQL数据库(如MongoDB、Redis)。Spring Batch则提供了批量处理任务的框架,包括任务调度和日志跟踪。 Spring Security提供了声明式的安全...
7.使用SpringDataRedis框架操作Redis、 8.使用Spring Data Solr框架操作solr 9.Solr新增动态域(Dynamic)知识点 10.掌握SPU和SKU的概念 11.搭建SpringBoot框架 12.实现阿里大于短信发送功能 13.使用CAS实现单点登录...
Spring Data则进一步简化了数据访问,支持多种数据库类型,包括关系型数据库如JDBC,以及NoSQL数据库如MongoDB和Redis。Spring Batch是一个强大的批处理框架,适用于大规模数据处理任务。 Spring Security是安全...
Spring Data是一个强大的数据访问框架,支持多种数据存储,如关系型数据库JDBC、NoSQL数据库Redis、MongoDB等。Spring Batch则是一个批处理框架,用于大规模数据处理任务,包括调度、日志记录等功能。 Spring ...
Spring Data简化了数据访问,支持多种数据库和NoSQL存储,如JDBC、Redis、MongoDB等。Spring Batch则专为批量处理任务设计,提供了调度、跟踪等功能。Spring Security则提供了安全框架,用于声明式地管理应用的安全...
后台:SpringBoot、SpringDataJpa等 4.架构模式:半前后分离架构模式 5.模板引擎:thymeleaf 6.项目管理:Maven 7、JDK版本:1.8 8、额外功能:阿里云短信服务SMS、阿里云图片存储OSS、QQ邮箱验证服务 9、主要算法:...
Spring Data简化了对各种数据存储(如关系数据库、NoSQL数据库)的访问,包括JDBC、Redis、MongoDB等。Spring Batch是处理批量任务的框架,支持任务调度和日志记录。Spring Security提供了安全访问控制,用于保护...
Spring Data是一个广泛的数据访问框架,支持多种数据库和NoSQL存储,如JDBC、Redis、MongoDB等。Spring Batch是批处理任务的框架,适用于大规模数据处理场景。 Spring Security提供了一套全面的安全访问控制解决...
- **Spring Boot**:快速开发特性,如自动配置、Actuator监控、Spring Data JPA等。 - **Spring Cloud**:服务治理、配置中心、熔断机制等,如Eureka、Config、Hystrix等组件的运用。 5. **分布式**: - **CAP...
在实现分布式ID时,通常有几种方案:使用数据库自增ID、使用Redis的incr命令、使用UUID、Twitter的snowflake算法、利用Zookeeper生成唯一ID、MongoDB的ObjectId等。每种方案都有其优缺,需要根据实际情况选择合适的...
基础能力强的可以在此基础上修改调整,以实现类似其他功能。 ## 旅游网是一个基于SpringBoot框架设计的一个毕业设计,主要类似于一个电商系统 ## 主要功能介绍 有用户登录注册,景点列表,相册墙,购买景点,评论,...
3.后台:SpringBoot、SpringDataJpa 等 4.架构模式:半前后分离架构模式 5.模板引擎:thymeleaf 6.项目管理:Maven 7、JDK 版本:1.8 8、额外功能:阿里云短信服务 SMS、阿里云图片存储 OSS、QQ 邮箱验证服务 9、...
3.后台:SpringBoot、SpringDataJpa等 4.架构模式:半前后分离架构模式 5.模板引擎:thymeleaf 6.项目管理:Maven 7、JDK版本:1.8 8、额外功能:阿里云短信服务SMS、阿里云图片存储OSS、QQ邮箱验证服务 9、主要算法...
3.后台:SpringBoot、SpringDataJpa等 4.架构模式:半前后分离架构模式 5.模板引擎:thymeleaf 6.项目管理:Maven 7、JDK版本:1.8 8、额外功能:阿里云短信服务SMS、阿里云图片存储OSS、QQ邮箱验证服务 9、主要算法...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...