简化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的配置如下:
@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相关推荐
- 对编写的代码进行单元测试_编写数据访问代码测试–单元测试是浪费
对编写的代码进行单元测试 几年前,我是为我的数据访问代码编写单元测试的那些开发人员之一. 我正在孤立地测试所有内容,我对自己感到非常满意. 老实说,我认为自己做得很好. 哦,男孩,我错了! 这篇博客文 ...
- junit编写测试代码_编写数据访问代码测试-不测试框架
junit编写测试代码 当我们向数据访问代码编写测试时,是否应该测试其公共API的每种方法? 一开始听起来很自然. 毕竟,如果我们不测试所有内容,那么如何知道我们的代码可以按预期工作? 这个问题为我们 ...
- 编写数据访问代码测试–单元测试是浪费
几年前,我是为我的数据访问代码编写单元测试的那些开发人员之一. 我正在孤立地测试所有内容,我对自己感到非常满意. 老实说,我认为自己做得很好. 哦,男孩,我错了! 这篇博客文章描述了为什么我们不应该为 ...
- junit编写测试代码_编写数据访问代码测试–绿色建筑不够好
junit编写测试代码 开始为数据访问代码编写集成测试之前,我们要做的第一件事是决定如何配置测试用例. 我们有两种选择:正确的一种和错误的一种. 不幸的是,许多开发人员选择错误. 我们如何避免犯同样的 ...
- SpringBoot使用Redis 数据访问(单点、集群、哨兵、连接池、Pipline、分布式框架Redisson、解决方案)
目录 Redis 文献资料 用Redis编程 Redis模块API 教程和常见问题解答 管理 嵌入式和物联网 故障排除 Redis集群 其他基于Redis的分布式系统 在SSD和永久性存储器上进行Re ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...
- 十步优化SQL Server中的数据访问
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
- .NET 数据访问架构指南(转)
Alex Mackman, Chris Brooks, Steve Busby, 和 Ed Jezierski 微软公司 2001年10月 概述:本文提供了在多层.NET应用程序中实施基于ADO.NE ...
- Redis和nosql简介,api调用;Redis数据功能(String类型的数据处理);List数据结构(及Java调用处理);Hash数据结构;Set数据结构功能;sortedSet(有序集合)数
1.Redis和nosql简介,api调用 14.1/ nosql介绍 NoSQL:一类新出现的数据库(not only sql),它的特点: 1. 不支持SQL语法 2. 存储结构跟传统关系型数 ...
最新文章
- 2021年大数据Flink(四十五):​​​​​​扩展阅读 双流Join
- 实战 | 这是一个转型AI的励志故事,从非科班到拿下阿里云栖一等奖,他经历的坑足够你学习100天
- tidb mysql hbase_HBase/TiDB都在用的数据结构:LSM Tree,不得了解一下?
- Http协议中的各种长度限制总结
- python程序实现双向链表_数据结构-双向链表(Python实现)
- PHP表单提交参数验证类(可修改)
- SpringSecurity 权限控制准备之IOC容器结构说明
- 综合布线中所需要的的带宽和数据速率
- 领域驱动设计模式设计与实践_在域驱动设计中使用状态模式
- sqlserver拼接sql插入table_10个SQL技巧
- vue 高德地图 不同区域显示不同颜色_高德百度哪家强?苹果Carplay第三方分屏功能评测...
- 爬虫项目三:爬取选课信息
- Listener监听器已经Listener的小案例
- 最新教师计算机测试题,信息技术教师基本功测试题
- 基于STM8的TM1640驱动程序(附八段数码管配置工具)
- 打开其他软件时,老是弹出Xftp6安装的问题
- SEO优化:关于网站降权的方方面面!!!
- dve 二维数组信号 显示波形_VCS-DVE
- 2009-2020年天猫“双十一”成交额统计情况
- KBU1010-ASEMI电源控制柜整流桥