Springdataredis使用手册Word格式.docx
- 文档编号:1464692
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:15
- 大小:323.63KB
Springdataredis使用手册Word格式.docx
《Springdataredis使用手册Word格式.docx》由会员分享,可在线阅读,更多相关《Springdataredis使用手册Word格式.docx(15页珍藏版)》请在冰点文库上搜索。
附件信息(AttachmentInfo)
目录
文档信息(DocumentInfo)2
修订信息(ReviseInfo)3
附件信息(AttachmentInfo)4
1.概述6
1.1.目的6
1.2.范围6
2.准备6
2.1.环境配置6
2.2.下载地址7
3.Spring-data-redis7
3.1.背景7
3.1.1.高级API7
3.1.2.低级API7
3.2.Maven配置7
3.3.JedisConnectionFactory8
3.4.RedisTemplate和StringRedisTemplate8
3.5.API概览8
3.5.1.Java集合和Redis集合8
3.5.2.Operations9
3.5.3.ValueOperations和BoundValueOperations9
3.5.4.ListOperations和BoundListOperations9
3.5.5.SetOperations和BoundSetOperations10
3.5.6.ZSetOperations和BoundZSetOperations11
3.5.7.HashOperations和BoundHashOperations11
3.5.8.其他12
3.6.Callback12
3.7.Topic和Messaging/PubSub12
3.8.Cache12
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入门
当然你可以可以下载到本地观看,
这个教程非常有价值,可以让你对redis的工作方式和工作原理有一个直观的认识。
官方的入门文档:
http:
//static.springsource.org/spring-data/data-redis/docs/current/reference/redis.html
不推荐,讲的太简单了,不过看一下也能有些收获。
如果你对redis希望有更多的了解:
个人推荐以下几篇:
十五分钟介绍Redis数据结构
Redis数据库结构设计
利用Redis构建高效的实时搜索
快盘上的《redis_学习笔记》也不错,比较全面,不过偏向于Redis本身的内容较多
2.1.环境配置
首先你要有一台可以连接到的正在运行的redis服务器。
然后根据《项目框架说明及命名规范》中的相关章节配置你的项目。
最后,如果你有时间的话,可以先checkout服务器上的example工程,在service模块中提供了一些基本的使用案例。
2.2.下载地址
linux版本的redis下载的地址:
//redis.io/download
windows版本的redis下载的地址:
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配置
<
dependency>
<
groupId>
org.springframework.data<
/groupId>
artifactId>
spring-data-redis<
/artifactId>
<
version>
1.0.1.RELEASE<
/version>
/dependency>
<
redis.clients<
jedis<
2.1.0<
type>
jar<
/type>
scope>
compile<
/scope>
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<
Key,Collection<
?
>
,这种用法等价于在jvm把Collection<
序列化成字节数组,以value的形式保存到redis中,很显然,这种方法非常低效,不仅存在大量的序列化反序列化操作,并且每次操作集合都要首先获取一个完整的集合(包含所有的元素)。
正确的方法是使用redis提供的集合类型,例如List,Set,ZSet(SortedSet)和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
ValueOperationsvalueOperations=redisTemplate.opsForValue;
BoundValueOperationsboundValueOperations=redisTemplate.boundValueOps(key);
类:
ValueOperations等价理解成:
Map<
Object,Object>
方法:
set(key,value)保存
解释:
key:
为保存时的主键value:
为你要保存的Object。
等价理解成:
Map<
map=newHashMap<
();
map.put(key,value)。
代码:
redisTemplate.opsForValue().set(AD_KEY_PREFIX+ad.getId(),ad)。
用处:
Mercury项目中,所有可用的广告实体都通过此方法存放在redis中。
get(key)获取
为保存时候的主键,返回一个Object对象。
map=set(key,value)保存时候的map;
Objectobject=map.get(key);
edisTemplate.opsForValue().get(AD_KEY_PREFIX+ad.getId());
Mercury项目中,根据广告的id获取某一款广告
BoundValueOperations理解:
对保存的值做一些细微的操作,例如对某一个值的操作等。
3.5.4.ListOperations和BoundListOperations
ListOperationslistOperations=redisTemplate.opsForList();
BoundListOperationsboundListOperations=redisTemplate.boundListOps(key);
ListOperations等价理解成:
List<
Object>
BoundListOperations等价理解成:
对保存的值做一些细微的操作。
3.5.5.SetOperations和BoundSetOperations
SetOperationssetOperations=redisTemplate.opsForSet();
BoundSetOperationsboundSetOperations=redisTemplate.boundSetOps(key);
SetOperations等价理解成:
Set<
add(key,value)添加
保存Set的主键value:
向Set中添加一个值。
Object,Set<
Set<
set=newHashSet<
map.put(key,set);
set=map.get(key);
set.add(value);
redisTemplateSet.opsForSet().add(ALL_AVAILABLE_ADIDS_NORMAL,AD_KEY_PREFIX+ad.getId());
Mercury项目往广告清单中添加广告。
members(key)获取
保存Set的主键等价理解成:
map=add(key,value)方法添加时候的map;
代码:
redisTemplateSet.opsForSet().members(ALL_AVAILABLE_ADIDS_NORMAL);
Mercury项目获取某一个广告清单
intersect(key,otherKey)取两个Set的交集
保存Set的主键otherKey:
保存另一个Set的主键
下图阴影的部分为该方法的返回值:
difference(key,otherKey)取两个Set的补集
union(key,otherKey)取两个Set的并集
3.5.6.ZSetOperations和BoundZSetOperations
ZSetOperationszsetOperations=redisTemplate.opsForZSet();
BoundZSetOperationsboundZSetOperations=redisTemplate.boundZSetOps(key);
ZSetOperations等价理解成:
可排序的Set<
add(key,value,score);
添加
向Set中添加一个值score:
这个值在这个Set中的权重,以后这个Set可以根据权重进行排序,分为以下几种情况:
根据权重从小到大的排序
根据权重从小到大的排序
选出权重在某一个范围内的实体排序
等等
3.5.7.HashOperations和BoundHashOperations
HashOperationshashOperations=redisTemplate.opsForHash();
BoundHashOperationsboundHashOperations=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.官方例子中的设计
官方提供了一个很好的例子
有全套的代码和文档。
重点推荐文档中的数据库设计章节
//static.springsource.org/spring-data/data-keyvalue/examples/retwisj/current/
4.3.NoSQL数据建模技术
强烈推荐
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都是使用newJdkSerializationRedisSerializer();
进行序列化的。
配置之后在服务器上会保持原有的KEY。
此配置解决之前用redisTemplate.opsForValue().get(Key);
获取KEY出现找不到KEY的问题。
附上一篇文章:
其中详细介绍了配置序列化配置以及Jedis源码分析。
附上TinybeeRedisHandle工具包下载地址:
svn:
//gall.me/Tinybee/server/trunk/tinybee/tinybee-service/src/main/java/me/gall/tinybee/redis/service/impl/RedisHandle.java
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Springdataredis 使用手册