最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

Spring-data-redis使用手册

来源:动视网 责编:小OO 时间:2025-09-27 08:19:58
文档

Spring-data-redis使用手册

Spring-data-redis使用手册文档信息(DocumentInfo)标题(Title)Spring-data-redis使用手册文档编号(No)2012-02-14作者(Author)黄承开最后发布时间(LastUpdate)2012-08-10概述(Summarize)掌握spring-data-redis的使用方法,一些最佳实践修订信息(ReviseInfo)修订日期(Date)修订人(Reviser)修订内容(Revises)2012-05-21梁国锋2.2redis下载地址(
推荐度:
导读Spring-data-redis使用手册文档信息(DocumentInfo)标题(Title)Spring-data-redis使用手册文档编号(No)2012-02-14作者(Author)黄承开最后发布时间(LastUpdate)2012-08-10概述(Summarize)掌握spring-data-redis的使用方法,一些最佳实践修订信息(ReviseInfo)修订日期(Date)修订人(Reviser)修订内容(Revises)2012-05-21梁国锋2.2redis下载地址(
Spring-data-redis使用手册

文档信息(Document Info)

标题(Title)

Spring-data-redis使用手册

文档编号(No)

2012-02-14

作者(Author)

黄承开

最后发布时间(Last Update)

2012-08-10

概述(Summarize)

掌握spring-data-redis的使用方法,一些最佳实践

修订信息(Revise Info)

修订日期(Date)

修订人(Reviser) 

修订内容(Revises)

2012-05-21梁国锋 

2.2 redis下载地址(Linux版、Windows版)

3.4.6常用api的方法 

5.1mercury项目实战 

2012-06-25黄承开 

新增maven依赖配置方法,整理了章节

2012-06-26黄承开新增章节
2012-08-10张瑜新增Tinybee实战配置,增加KEY序列化配置

附件信息(Attachment Info)

目录

文档信息(Document Info)    2

修订信息(Revise Info)    3

附件信息(Attachment Info)    4

1.    概述    6

1.1.    目的    6

1.2.    范围    6

2.    准备    6

2.1.    环境配置    6

2.2.    下载地址    7

3.    Spring-data-redis    7

3.1.    背景    7

3.1.1.    高级API    7

3.1.2.    低级API    7

3.2.    Maven配置    7

3.3.    JedisConnectionFactory    8

3.4.    RedisTemplate和StringRedisTemplate    8

3.5.    API概览    8

3.5.1.    Java集合和Redis集合    8

3.5.2.    Operations    9

3.5.3.    ValueOperations和BoundValueOperations    9

3.5.4.    ListOperations和BoundListOperations    9

3.5.5.    SetOperations和BoundSetOperations    10

3.5.6.    ZSetOperations和BoundZSetOperations    11

3.5.7.    HashOperations和BoundHashOperations    11

3.5.8.    其他    12

3.6.    Callback    12

3.7.    Topic和Messaging/PubSub    12

3.8.    Cache    12

4.    NoSQL数据库设计    12

4.1.    一般经验    12

4.1.1.    不持久化业务实体    12

4.1.2.    Key的设计    12

4.2.    官方例子中的设计    13

4.3.    NoSQL 数据建模技术    13

5.    最佳实践    13

5.1.    项目案例1(Mercury项目)    13

5.1.1.    配置    13

5.1.2.    总结    14

5.2.    项目案例2(Tinybee项目)    14

5.2.1.    配置(更新)    14

1.概述

1.1.目的

让团队成员比较快的上手redis的相关功能,思考如何结合自己的项目使用。

1.2.范围

所有工程师。

2.准备

强烈建议你在看下去之前花上半个小时看一下Redis入门

http://www.slideshare.net/tednaleid/redis-and-groovy-and-grails-gr8conf-2011

当然你可以可以下载到本地观看,http://www.kuaipan.cn/file/id_20272615458154.html

这个教程非常有价值,可以让你对redis的工作方式和工作原理有一个直观的认识。

官方的入门文档:

http://static.springsource.org/spring-data/data-redis/docs/current/reference/redis.html 

不推荐,讲的太简单了,不过看一下也能有些收获。

如果你对redis希望有更多的了解:

http://blog.nosqlfan.com/html/3537.html 

个人推荐以下几篇:

十五分钟介绍 Redis数据结构

http://blog.nosqlfan.com/html/3202.html?ref=rediszt 

Redis 数据库结构设计

http://blog.nosqlfan.com/html/3476.html?ref=rediszt 

利用Redis构建高效的实时搜索

http://blog.nosqlfan.com/html/3448.html?ref=rediszt 

快盘上的《redis_学习笔记》也不错,比较全面,不过偏向于Redis本身的内容较多

2.1.环境配置

首先你要有一台可以连接到的正在运行的redis服务器。

然后根据《项目框架说明及命名规范》中的相关章节配置你的项目。

最后,如果你有时间的话,可以先checkout服务器上的example工程,在service模块中提供了一些基本的使用案例。

2.2.下载地址

linux版本的redis下载的地址:

http://redis.io/download 

windows版本的redis下载的地址:

https://github.com/dmajkic/redis/downloads  

3.Spring-data-redis

3.1.背景

就跟orm有hibernate和mybatis一样,redis也有众多的Java客户端,例如jedis,jredis,jdbc-redis和rcj等,当然他们肯定没法兼容,如果你在项目中使用了某种客户端,那当你因为某种原因(项目不再维护,bug无法修复,性能无法改善)切换使用的客户端时,项目会有较大的重构成本。这个时候spring-data-redis的出现,提供了一个对几种主要的redis的Java客户端的抽象,使开发中可以几乎完全屏蔽具体使用客户端的影响,使业务代码保持较强的稳定性。

3.1.1.高级API

顾名思义,spring-data-redis提供了一组与各个客户端兼容的api子集以及与jdk完全兼容的标准序列化和容器类型的api。听上去很多,但是保留了精华,在开发中已经足够使用。

3.1.2.低级API

这个就是暴露了一些直接对redis服务器提供操作的api和为redis的数据类型特意封装的数据类型,根据各个客户端实现情况不同其实反而有较大的隐患(相当于在hibernate中直接写sql,数据库的方言处理)。当然如果真的在开发中需要某种还未抽象完全的功能,那么这个就是唯一的选择,一般情况下推荐使用高级API。

3.2.Maven配置

     org.springframework.data

     spring-data-redis

                 1.0.1.RELEASE

redis.clients

jedis

2.1.0

jar

compile

3.3.JedisConnectionFactory

就像所有的数据库连接,JedisConnectionFactory就是连接工厂,通过配置单台服务器或者连接池(pool)的方式获取redis服务器的连接。

3.4.RedisTemplate和StringRedisTemplate

就像Spring提供的JDBC,hibernate和ibatis的template一样,spring-data-redis也提供了一个基础的泛型RedisTemplate供开发者可以快速的利用代码完成基础的crud工作。而StringRedisTemplate则提供了最常用的String类型的实现。在实践中可以考虑完全省去dao层的设计,直接在service层注入相应的template实例。

3.5.API概览

其实所有的操作都是直接映射redis本身提供的命令行,因为官方文档缺失了厉害,你可以直接通过查看redis官网的命令手册来了解api的具体功能http://redis.io/commands 。

3.5.1.Java集合和Redis集合

首先的首先澄清一个对初学者非常容易混淆的概念!

不要试图使用泛型Java集合,例如RedisTemplate>,这种用法等价于在jvm把Collection序列化成字节数组,以value的形式保存到redis中,很显然,这种方法非常低效,不仅存在大量的序列化反序列化操作,并且每次操作集合都要首先获取一个完整的集合(包含所有的元素)。正确的方法是使用redis提供的集合类型,例如List,Set,ZSet(Sorted Set)和Map,详细请看以下章节。

如果你在RedisTemplate的泛型中用到了Java集合类型,那明显你做错了!如果你还是不明白错在哪里,请立刻停下手上的工作,找其他同事深入了解原因。

3.5.2.Operations

opsForXXX和boundXXXOps的区别?

XXX为value的类型,前者获取一个operator,但是没有指定操作的对象(key),可以在一个连接(事务)内操作多个key以及对应的value;后者获取了一个指定操作对象(key)的operator,在一个连接(事务)内只能操作这个key对应的value。

关于计数的API(increment)有一个bug,需要各位使用中注意,通过increment计数以后,通过get方式获取计数值的时候可能会抛出EOF异常(和本地的jdk以及redis的编译版本有关),可以考虑使用boundValueOps(key).get(0,-1)获取计数值。

3.5.3.ValueOperations和BoundValueOperations

         ValueOperations valueOperations = redisTemplate.opsForValue;

BoundValueOperations boundValueOperations = redisTemplate.boundValueOps(key);

类:ValueOperations 等价理解成:Map

方法:set(key,value)  保存

解释:key:为保存时的主键  value:为你要保存的Object。等价理解成:

Map map = new HashMap();

              map.put(key,value)。

代码:redisTemplate.opsForValue().set(AD_KEY_PREFIX + ad.getId(), ad)。

用处:Mercury项目中,所有可用的广告实体都通过此方法存放在redis中。

方法:get(key) 获取

解释:key:为保存时候的主键,返回一个Object对象。等价理解成:

      Map map = set(key,value)保存时候的map;

  Object object = map.get(key);

代码:edisTemplate.opsForValue().get(AD_KEY_PREFIX + ad.getId());

用处:Mercury项目中,根据广告的id获取某一款广告

类:BoundValueOperations 理解:对保存的值做一些细微的操作,例如对某一个值的操作等。

3.5.4.ListOperations和BoundListOperations

ListOperations listOperations = redisTemplate.opsForList();

BoundListOperations boundListOperations = redisTemplate.boundListOps(key);

类:ListOperations 等价理解成:List

类:BoundListOperations 等价理解成:对保存的值做一些细微的操作。

3.5.5.SetOperations和BoundSetOperations

SetOperations setOperations = redisTemplate.opsForSet();

BoundSetOperations boundSetOperations = redisTemplate.boundSetOps(key);

类:SetOperations 等价理解成:Set

方法:add(key,value)  添加

解释:key:保存Set的主键  value:向Set中添加一个值。等价理解成:    

Map> map = new HashMap>();

Set set = new HashSet();

           map.put(key,set);

Set set = map.get(key);

               set.add(value);

代码:redisTemplateSet.opsForSet().add(ALL_AVAILABLE_ADIDS_NORMAL, AD_KEY_PREFIX + ad.getId());

用处:Mercury项目往广告清单中添加广告。

方法:members(key)  获取

解释:key:保存Set的主键  等价理解成:    

          Map> map = add(key,value)方法添加时候的map;

Set set = map.get(key);

代码:redisTemplateSet.opsForSet().members(ALL_AVAILABLE_ADIDS_NORMAL);

用处:Mercury项目获取某一个广告清单

方法:intersect(key,otherKey)  取两个Set的交集

解释:key:保存Set的主键  otherKey:保存另一个Set的主键

下图阴影的部分为该方法的返回值:

方法:difference(key, otherKey)  取两个Set的补集

解释:key:保存Set的主键  otherKey:保存另一个Set的主键

下图阴影的部分为该方法的返回值:

方法:union(key, otherKey)  取两个Set的并集

解释:key:保存Set的主键  otherKey:保存另一个Set的主键

下图阴影的部分为该方法的返回值:

3.5.6.ZSetOperations和BoundZSetOperations

ZSetOperations zsetOperations = redisTemplate.opsForZSet();

BoundZSetOperations boundZSetOperations = redisTemplate.boundZSetOps(key);

类:ZSetOperations 等价理解成:可排序的Set

方法:add(key, value, score);  添加

解释:key:保存Set的主键  value:向Set中添加一个值  score:这个值在这个Set中的权重,以后这个Set可以根据权重进行排序,分为以下几种情况:

根据权重从小到大的排序

            根据权重从小到大的排序

            选出权重在某一个范围内的实体排序

            等等

3.5.7.HashOperations和BoundHashOperations

HashOperations hashOperations = redisTemplate.opsForHash();

BoundHashOperations boundHashOperations = redisTemplate.boundHashOps(key);

3.5.8.其他

删除redis中某一个key

redisTemplate.delete(key);

3.6.Callback

3.7.Topic和Messaging/PubSub

3.8.Cache

4.NoSQL数据库设计

4.1.一般经验

4.1.1.不持久化业务实体

一般来讲业务实体随着业务的变更会有较频繁的变化,在传统的基于sql的数据库中,通过ORM有较完善和简便的解决方案。而在Redis中,业务实体是通过序列化成字节数组的方式保存,然后通过反序列化来获取该实体,如果实体发生了变化,将发生无法正确序列化的问题。

综上所述,我们建议只用Redis来持久化字符串或者Map形式的数据。当然如果有以下两种情况则可以特殊考虑:

●实体简单并且没有太重要的业务意义,或者在很长时间内不会变化

●实体已经在sql数据库中持久化,仅仅通过Redis进行缓存

4.1.2.Key的设计

除了官方最佳实践中通过业务单元描述和id通过冒号连接以外,考虑到我们会实际使用中(尤其是测试环境)会有多个应用同时使用一个Redis数据库的情况,建议在Key的最前面加上一个项目名称的顶级命名空间。

例如,"pandora:catagory:5:items"或者"mercury:totalads"

4.2.官方例子中的设计

官方提供了一个很好的例子

https://github.com/SpringSource/spring-data-keyvalue-examples 

有全套的代码和文档。

重点推荐文档中的数据库设计章节

http://static.springsource.org/spring-data/data-keyvalue/examples/retwisj/current/ 

4.3.NoSQL 数据建模技术

强烈推荐

http://coolshell.cn/articles/7270.html 

5.最佳实践

5.1.项目案例1(Mercury项目)

5.1.1.配置

redis数据源如下图

5.1.2.总结

redis的思想基本上和java中的数据类型大同小异,特别是Map、List、Set、ZSet(可排序的Set),就Mercury项目而言主要用到了Set和Map,每个项目都有自己的特点,结合自己的项目选择合适的数据类型,往往做起东西来事半功倍。

5.2.项目案例2(Tinybee项目)

5.2.1.配置(更新)

    Tinybee项目增加了对Key,Value序列化方式的配置。 如果没有设置,Key和 Value都是使用 new JdkSerializationRedisSerializer(); 进行序列化的。配置之后在服务器上会保持原有的KEY。此配置解决之前用redisTemplate.opsForValue().get(Key);获取KEY出现找不到KEY的问题。

    附上一篇文章:其中详细介绍了配置序列化配置以及Jedis源码分析。http://www.iteye.com/topic/1125854

    附上TinybeeRedisHandle工具包下载地址:svn://gall.me/Tinybee/server/trunk/tinybee/tinybee-service/src/main/java/me/gall/tinybee/redis/service/impl/RedisHandle.java

文档

Spring-data-redis使用手册

Spring-data-redis使用手册文档信息(DocumentInfo)标题(Title)Spring-data-redis使用手册文档编号(No)2012-02-14作者(Author)黄承开最后发布时间(LastUpdate)2012-08-10概述(Summarize)掌握spring-data-redis的使用方法,一些最佳实践修订信息(ReviseInfo)修订日期(Date)修订人(Reviser)修订内容(Revises)2012-05-21梁国锋2.2redis下载地址(
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

Top