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

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的配置如下:

  @Beanpublic 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

---恢复内容结束---

转载于:https://www.cnblogs.com/hengzhou/p/9542720.html

简化Redis数据访问代码RedisTemplate相关推荐

  1. 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费

    对编写的代码进行单元测试 几年前,我是为我的数据访问代码编写单元测试的那些开发人员之一. 我正在孤立地测试所有内容,我对自己感到非常满意. 老实说,我认为自己做得很好. 哦,男孩,我错了! 这篇博客文 ...

  2. junit编写测试代码_编写数据访问代码测试-不测试框架

    junit编写测试代码 当我们向数据访问代码编写测试时,是否应该测试其公共API的每种方法? 一开始听起来很自然. 毕竟,如果我们不测试所有内容,那么如何知道我们的代码可以按预期工作? 这个问题为我们 ...

  3. 编写数据访问代码测试–单元测试是浪费

    几年前,我是为我的数据访问代码编写单元测试的那些开发人员之一. 我正在孤立地测试所有内容,我对自己感到非常满意. 老实说,我认为自己做得很好. 哦,男孩,我错了! 这篇博客文章描述了为什么我们不应该为 ...

  4. junit编写测试代码_编写数据访问代码测试–绿色建筑不够好

    junit编写测试代码 开始为数据访问代码编写集成测试之前,我们要做的第一件事是决定如何配置测试用例. 我们有两种选择:正确的一种和错误的一种. 不幸的是,许多开发人员选择错误. 我们如何避免犯同样的 ...

  5. SpringBoot使用Redis 数据访问(单点、集群、哨兵、连接池、Pipline、分布式框架Redisson、解决方案)

    目录 Redis 文献资料 用Redis编程 Redis模块API 教程和常见问题解答 管理 嵌入式和物联网 故障排除 Redis集群 其他基于Redis的分布式系统 在SSD和永久性存储器上进行Re ...

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

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

  7. 十步优化SQL Server中的数据访问

    故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...

  8. .NET 数据访问架构指南(转)

    Alex Mackman, Chris Brooks, Steve Busby, 和 Ed Jezierski 微软公司 2001年10月 概述:本文提供了在多层.NET应用程序中实施基于ADO.NE ...

  9. Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数

    1.Redis和nosql简介,api调用 14.1/ nosql介绍 NoSQL:一类新出现的数据库(not only sql),它的特点: 1.  不支持SQL语法 2.  存储结构跟传统关系型数 ...

最新文章

  1. 2021年大数据Flink(四十五):​​​​​​扩展阅读 双流Join
  2. 实战 | 这是一个转型AI的励志故事,从非科班到拿下阿里云栖一等奖,他经历的坑足够你学习100天
  3. tidb mysql hbase_HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?
  4. Http协议中的各种长度限制总结
  5. python程序实现双向链表_数据结构-双向链表(Python实现)
  6. PHP表单提交参数验证类(可修改)
  7. SpringSecurity 权限控制准备之IOC容器结构说明
  8. 综合布线中所需要的的带宽和数据速率
  9. 领域驱动设计模式设计与实践_在域驱动设计中使用状态模式
  10. sqlserver拼接sql插入table_10个SQL技巧
  11. vue 高德地图 不同区域显示不同颜色_高德百度哪家强?苹果Carplay第三方分屏功能评测...
  12. 爬虫项目三:爬取选课信息
  13. Listener监听器已经Listener的小案例
  14. 最新教师计算机测试题,信息技术教师基本功测试题
  15. 基于STM8的TM1640驱动程序(附八段数码管配置工具)
  16. 打开其他软件时,老是弹出Xftp6安装的问题
  17. SEO优化:关于网站降权的方方面面!!!
  18. dve 二维数组信号 显示波形_VCS-DVE
  19. 2009-2020年天猫“双十一”成交额统计情况
  20. KBU1010-ASEMI电源控制柜整流桥

热门文章

  1. phantomjs安装所需依赖
  2. java日志框架log4j详细配置及与slf4j联合使用教程
  3. 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑
  4. msysGit管理GitHub代码
  5. Java NIO框架Mina
  6. c++如何对结构体作为形参设置默认值
  7. MongoDB 从节点 延迟的测试
  8. 调用startActivityForResult后,onActivityResult无响应的题目
  9. Struts2与Spring、Hibernate三者整合的过程示例
  10. Android 极光推送设置别名