简化Redis数据访问代码RedisTemplate
---恢复内容开始---
Redis数据结构简介:
Redis可以存储键与5中数据结构类型之间的映射,这5中数据结构类型分别是;String(字符串),List(列表),Set(集合),Hash(散列)和ZSet(有序集合)。
下面对这5中数据结构做简单的介绍:
String:可以是字符串,整数和浮点数。对整个字符串和字符串其中的一部分执行操作;对象的浮点数执行自增(increment)或者自减(decrement)。
List:一个链表,链表上的每个节点都包含一个字符串;从链表的两端推入和弹出元素,根据偏移量对链表作出裁剪(trim);读取单个或者是多个元素,根据值来查找或者是移除元素。
Set:包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同;添加获取或者是移除单个元素;检查一个元素是否存在于某个集合中,计算交集并集和差集,从集合里随机获取元素。
Hash:包含键值对的无序散列表;添加获取移除单个键值对。获取所有的键值对。
ZSet:字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定;添加,获取,删除单个元素;根据分值范围(range)或者成员来获取元素。
下面介绍spring封装的RedisTemplate对这5种数据结构的运用做分析:
RedisTemplate的介绍:
spring封装了redisTemplate对象来进行对redis的各种操作,它支持所有的redis原生api。

类型参数(Type Parameter)

K:模板工作的Redis键类型(通常是一个字符串),RedisTemplate<String,Object>
注意:如果没有特殊情况,切勿定义为RedisTemplate<Object,Object>,否则根据里氏替换原则,使用的时候会造成类型错误。
V:是模板工作中Redis值的类型
RedisTemplate定义了对5种数据结构操作:
redisTemplate.opsForValue(); // 操作字符串
redisTemplate.opsForHash(); // 操作hash
redisTemplate.opsForList(); // 操作List
redisTemplate.opsForSet(); // 操作Set
redisTemplate.opsForZSet(); // 操作有序Set





StringRedisTemplate与RedisTemplate:
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的,也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据;RedisTemplate只能管理RedisTemplate里面的数据。
SDR默认采用的序列化策略有两种,一种是String的序列化策略。一种是jdk的序列化策略。
StringRedisTemplate默认采用的是String序列化策略,保存的是key和value都是采用这种策略序列化保存的。
RedisTemplate默认采用的是jdk的序列化策略,保存的key和value都是采用此策略序列化保存。
RedisTemplate的配置如下:
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jack2JsonRedisSerializer<Object>(Object.class);
ObjectMpper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.All,JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(jackson2JsonRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
Redis的String数据结构(推荐使用StringRedisTemplate)
注意:如果是RedisTemplate需要修改序列化方式。
RedisSerializer<String> stringRedisSerializer = new RedisSerializer();
template.setKeySerializer(stringRedisSerializer);
template.setValueSerilizer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(stringRedisSerializer);
set void set(K key,V value);
使用:redisTemplate.opsForValue().set("name","tom");
结果:redisTemplate.opsForValue().get("name"); // 输出结果为tomset
set void set(K key,V value,long timeOut,TimeUnit unit);
使用:redisTemplate.opsForValue().set("name","tom",10,TimeUnit.SECONDS);
结果:redisTemplate.opsForValue().get("name")
// 由于设置的是十秒失效,十秒之内查询有结果,十秒之后返回为null
set void set(K,key,V value,long offset);
该方法是用value参数覆写(override)给定key所储存的字符串值,从偏移量offset开始。
使用:template.opsForValue().set("key","Helo world");
templste.opsForValue().set("key","redis",6);
System.out.println("**********"+template.opsForValue().get("key"));
输出结果:**********Hello redis
selfAbsent Boolean selfAbsent(K key,V value);
使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));// false
System.out.println(template.opsForValue().setIfAbsent("multi2","multi2"));// true
结果:false表示以前已经存在,true表示以前不存在
multiSet void multiSet(Map <? extends K, ? extends V> m);为多个键分别设置他们的值

使用:
Map<String,String> maps = new HashMap<String,String>();
maps.put("multi1","multi1");
maps.put("multi2","multi2');
maps.put("muliti3","multi3");
template.opsForValue().multiSet(maps);
List<String> keys = new ArrayList<String>();
keys.add("multi1");
keys.add("multi2");
keys.add("multi3");
System.out.println(template.opsForValue().multiGet(keys));
结果:
[multi1,multi2,multi3]
multiSetIfAbsent Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);为多个键分别设置它们的值,如果存在则返回false,不存在则返回true

使用:
Map<String,String> maps = new HashMap<String,String>();
maps.put("multi1","multi1");
maps.put("multi2","multi2");
maps.put("multi3","multi3");
Maps<String,String> maps2 = new HashMap<String,String>();
maps2.put("multi11","multi11");
maps2.put("multi22","multi22");
maps2.put("multi33","multi33");
System.out.println(template.opsForValue().multiSetIfAbsent(maps))
System.out.println(template.opsForValue().multiSetIfAbsent(maps2))
// 如果存在则返回false,不存在则返回true
get V get (Object key);
使用:
template.opsForValue().set("key","Hello world");
System.out.println("********"+template.opsForValue().get("key"));
输出结果:"*********"Hello world
getAndSet V getAndSet(K key, V value);
设置键的字符串值并返回其旧值
使用:template.opsForValue().set("getSetTest","test");
System.out.println(template.opsForValue().getAndSet("getSetTest","test2"));
结果:test
---恢复内容结束---
简化Redis数据访问代码RedisTemplate的更多相关文章
- 在 ASP.NET 中创建数据访问和业务逻辑层(转)
.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...
- NET Core 实战 Dapper 扩展数据访问
NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实 ...
- Yii的学习(2)--数据访问对象 (DAO)
摘自Yii官网:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.dao Yii提供了强大的数据库编程支持.Yii数据访问对象(DAO) ...
- HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问
HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问 代码下载地址: http://download.csdn.net/detail/poiuy19 ...
- ADO.NET笔记——使用通用数据访问
相关知识: 前面所有示例,君是访问特定的数据库(SQL Server),因此注入SqlConnection.SqlCommand.SqlDataReader.SqlDataAdapter等类名都添加了 ...
- (转)SQLServer_十步优化SQL Server中的数据访问 二
原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第五步:识别低效TSQL,采用最佳实践重构和应用TSQL 由于每个程序 ...
- (转)SQLServer_十步优化SQL Server中的数据访问一
原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第一步:应用正确的索引 我之所以先从索引谈起是因为采用正确的索引会使生 ...
- 数据访问层 (DAO)
数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...
随机推荐
- 【max_result_window大小】 Result window is too large的问题
方法一: 如果需要搜索分页,可以通过from size组合来进行.from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 如果搜索size大于10000,需要设置 ...
- kylin-cube存储结构
前言 本篇文章通过图文的方式分析不同维度组合下的cube在hbase中的存储结构 需要声明的是,kylin不存原始数据,存储cube 全维度构建 假设一张表有3个字段name,age,sex,那么当通 ...
- 深入Linux内核架构第一章笔记
1. Linux是多任务系统, 支持并发执行若干进程,系统同时真正运行的进程数目不超过CPU的数量,因此内核会按照时间间隔在不同进程之间切换. 2.确定那个进程运行多长时间的过程称为调度. 3.内核启 ...
- hdu 1004 Let the Balloon Rise strcmp、map、trie树
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Vue.js 计算属性是什么
Vue.js 计算属性是什么 一.总结 一句话总结: 模板 表达式 维护 在模板中表达式非常便利,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护 ...
- jsapi微信扫一扫
微信公众号开发--微信JS-SDK扫一扫功能 首先请阅读微信JS-SDK说明文档,了解微信JS的相关说明. 根据官方的使用步骤,关键的有以下几步 绑定域名(很关键) 引入JS文件(很简单) 通过con ...
- Java网络编程和NIO详解6:Linux epoll实现原理详解
Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ...
- 调试工具-fiddler:本地资源替换线上调试
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件,这 ...
- restframework api (二)权限
一 添加权限 (1)API/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # utils/permission.py class SVIP ...
- BZOJ1555 KD之死
如果没有必选的限制条件,就是水题了... 只要按照w + t排序就可以了,然后搞个堆来维护 于是有了限制条件,还是水题... 到了必选的时候强制选上,不加入堆中即可. /*************** ...