---恢复内容开始---

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的更多相关文章

  1. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

  2. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实现对于数据库的快速访问,后来,ORM(Object Relatio ...

  3. NET Core 实战 Dapper 扩展数据访问

    NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类帮我们实 ...

  4. Yii的学习(2)--数据访问对象 (DAO)

    摘自Yii官网:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.dao Yii提供了强大的数据库编程支持.Yii数据访问对象(DAO) ...

  5. HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问

    HttpClient_001_初步实现项目01的servlet,与项目02的servlet,之间数据访问 代码下载地址: http://download.csdn.net/detail/poiuy19 ...

  6. ADO.NET笔记——使用通用数据访问

    相关知识: 前面所有示例,君是访问特定的数据库(SQL Server),因此注入SqlConnection.SqlCommand.SqlDataReader.SqlDataAdapter等类名都添加了 ...

  7. (转)SQLServer_十步优化SQL Server中的数据访问 二

    原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第五步:识别低效TSQL,采用最佳实践重构和应用TSQL 由于每个程序 ...

  8. (转)SQLServer_十步优化SQL Server中的数据访问一

    原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第一步:应用正确的索引 我之所以先从索引谈起是因为采用正确的索引会使生 ...

  9. 数据访问层 (DAO)

    数据持久化 持久化:将程序中的数据在瞬间状态下和持久状态间转换的机制(JDBC) 主要持久化操作:保存.删除.读取.和查找. 采用面向接口编程,可以降低代码间的耦合性,提高代码的可扩展性和可维护性. ...

随机推荐

  1. CentOS7.2 切换成iptables规则

    关闭firewall service firewalld stop systemctl disable firewalld.service #禁止firewall开机启动 安装iptables规则: ...

  2. 【yum】yum的使用

    Yum官网 Yum的缓存 Yum仓库 Yum命令 Yum插件 yum的缓存 通过缓存可以提升我们环境的搭建效率,直接把原来缓存好的安装包数据放到新环境,省去了几个G的下载,甚至,有些时候客户现场不能联 ...

  3. JavaScript权威指南--类和模块

    知识要点 每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某些属性,这种“共享”的特性是非常有用的.类的成员或实例都包含 ...

  4. Android手机无线adb

    1.首先电脑,手机通过数据线链接电脑,然后通过adb devices 查看到已连接 2.输入:adb tcpip 5555 3.输入:adb connect 222.222.221.137:5555 ...

  5. Hadoop异常

    org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://xxx:49000/user/had ...

  6. hdu4965矩阵快速幂

    这题不能直接按常规做啊,因为数组根本就开不下,转换思维A(B*A)^(n*n-1)B 这样的话数组B*A就是10*10了,然后快速幂就行了 刚开始数组都开小了,tle,还找了半天bug...还有就是定 ...

  7. 初识webservice 服务

    1.获取电话号码归属地查询 首先访问: http://www.webxml.com.cn/zh_cn/web_services.aspx ①新建一个MyEclipse项目(WebService) ht ...

  8. 《免费前端教程不会告诉你这些》知乎LIVE读后感

    这个是昨天偶然间在知乎上看到的一个知乎LIVE,答题就是音频在线直播吧,我试听了一下觉得分享的还不错,就买了完整的.主讲人叫方应杭,貌似是个挺牛逼的程序猿,之前没有听过,但这是个典型的科班出生的程序员 ...

  9. 用halcon提取衣服徽章

    收到一封email,有个学员求助去除衣服上纹理的干扰,然后提取衣服上徽章的边缘的方法.   我想他肯定是个很努力上进的boy,在求助以前也许已经试过各种方法,通过二值化不断的调试阈值,   寻找各种边 ...

  10. LINUX中的RCU机制的分析

    RCU机制是Linux2.6之后提供的一种数据一致性访问的机制,从RCU(read-copy-update)的名称上看,我们就能对他的实现机制有一个大概的了解,在修改数据的时候,首先需要读取数据,然后 ...