如何使用RedisTemplate访问Redis数据结构之字符串操作
Redis 数据结构简介
Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。
下面来对这5种数据结构类型作简单的介绍:
结构类型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
String | 可以是字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作;对象和浮点数执行自增(increment)或者自减(decrement) |
List | 一个链表,链表上的每个节点都包含了一个字符串 | 从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值来查找或者移除元素 |
Set | 包含字符串的无序收集器(unorderedcollection),并且被包含的每个字符串都是独一无二的、各不相同 | 添加、获取、移除单个元素;检查一个元素是否存在于某个集合中;计算交集、并集、差集;从集合里卖弄随机获取元素 |
Hash | 包含键值对的无序散列表 | 添加、获取、移除单个键值对;获取所有键值对 |
Zset | 字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定 | 添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素 |
Redis 5种数据结构的概念大致介绍到这边,下面将结合Spring封装的RedisTemplate来对这5种数据结构的运用进行演示
RedisTemplate介绍
spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。
RedisTemplate在spring代码中的结构如下:
- org.springframework.data.redis.core
- Class RedisTemplate<K,V>
- java.lang.Object
- org.springframework.data.redis.core.RedisAccessor
- org.springframework.data.redis.core.RedisTemplate<K,V>
Type Parameters:
K
- the Redis key type against which the template works (usually a String)
模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>
注意:如果没特殊情况,切勿定义成RedisTemplate<Object, Object>,否则根据里氏替换原则,使用的时候会造成类型错误 。
V - the Redis value type against which the template works
模板中的Redis value的类型
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 Jackson2JsonRedisSerializer<Object>(Object.class);
- ObjectMapper 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> stringSerializer = new StringRedisSerializer();
- template.setKeySerializer(stringSerializer );
- template.setValueSerializer(stringSerializer );
- template.setHashKeySerializer(stringSerializer );
- template.setHashValueSerializer(stringSerializer );
public interface ValueOperations<K,V>
Redis operations for simple (or in Redis terminology 'string') values.
ValueOperations可以对String数据结构进行操作:
- set void set(K key, V value);
- 使用:redisTemplate.opsForValue().set("name","tom");
- 结果:redisTemplate.opsForValue().get("name") 输出结果为tom
- set void set(K key, V value, long timeout, TimeUnit unit);
- 使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
- 结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
set void set(K key, V value, long offset);该方法是用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
- 使用:template.opsForValue().set("key","hello world");
- template.opsForValue().set("key","redis", 6);
- System.out.println("***************"+template.opsForValue().get("key"));
- 结果:***************hello redis
- setIfAbsent Boolean setIfAbsent(K key, V value);
- 使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));//false multi1之前已经存在
- System.out.println(template.opsForValue().setIfAbsent("multi111","multi111"));//true multi111之前不存在
- 结果: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("multi3","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("multi11","multi11");
- maps.put("multi22","multi22");
- maps.put("multi33","multi33");
- Map<String,String> maps2 = new HashMap<String, String>();
- maps2.put("multi1","multi1");
- maps2.put("multi2","multi2");
- maps2.put("multi3","multi3");
- System.out.println(template.opsForValue().multiSetIfAbsent(maps));
- System.out.println(template.opsForValue().multiSetIfAbsent(maps2));
- 结果:true
- false
- 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
- multiGet List<V> multiGet(Collection<K> keys);为多个键分别取出它们的值
- 使用:Map<String,String> maps = new HashMap<String, String>();
- maps.put("multi1","multi1");
- maps.put("multi2","multi2");
- maps.put("multi3","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]
- increment Long increment(K key, long delta);支持整数
- 使用:template.opsForValue().increment("increlong",1);
- System.out.println("***************"+template.opsForValue().get("increlong"));
- 结果:***************1
- increment Double increment(K key, double delta);也支持浮点数
- 使用:template.opsForValue().increment("increlong",1.2);
- System.out.println("***************"+template.opsForValue().get("increlong"));
- 结果:***************2.2
- append Integer append(K key, String value);如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。
- 如果键不存在,则它被创建并设置为空字符串,因此APPEND在这种特殊情况下将类似于SET。
- 使用:template.opsForValue().append("appendTest","Hello");
- System.out.println(template.opsForValue().get("appendTest"));
- template.opsForValue().append("appendTest","world");
- System.out.println(template.opsForValue().get("appendTest"));
- 结果:Hello
- Helloworld
- get String get(K key, long start, long end);截取key所对应的value字符串
- 使用:appendTest对应的value为Helloworld
- System.out.println("*********"+template.opsForValue().get("appendTest",0,5));
- 结果:*********Hellow
- 使用:System.out.println("*********"+template.opsForValue().get("appendTest",0,-1));
- 结果:*********Helloworld
- 使用:System.out.println("*********"+template.opsForValue().get("appendTest",-3,-1));
- 结果:*********rld
- size Long size(K key);返回key所对应的value值得长度
- 使用:template.opsForValue().set("key","hello world");
- System.out.println("***************"+template.opsForValue().size("key"));
- 结果:***************11
- setBit Boolean setBit(K key, long offset, boolean value);对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
key键对应的值value对应的ascii码,在offset的位置(从左向右数)变为value
- 使用:template.opsForValue().set("bitTest","a");
- // 'a' 的ASCII码是 97。转换为二进制是:01100001
- // 'b' 的ASCII码是 98 转换为二进制是:01100010
- // 'c' 的ASCII码是 99 转换为二进制是:01100011
- //因为二进制只有0和1,在setbit中true为1,false为0,因此我要变为'b'的话第六位设置为1,第七位设置为0
- template.opsForValue().setBit("bitTest",6, true);
- template.opsForValue().setBit("bitTest",7, false);
- System.out.println(template.opsForValue().get("bitTest"));
- 结果:b
- getBit Boolean getBit(K key, long offset);获取键对应值的ascii码的在offset处位值
- 使用:System.out.println(template.opsForValue().getBit("bitTest",7));
- 结果:false
作者:DreamerRzc
链接:https://www.jianshu.com/p/7bf5dc61ca06
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
如何使用RedisTemplate访问Redis数据结构之字符串操作的更多相关文章
- RedisTemplate访问Redis数据结构
https://www.jianshu.com/p/7bf5dc61ca06 Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字 ...
- RedisTemplate访问Redis数据结构(介绍和常用命令)
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集 ...
- 如何使用RedisTemplate访问Redis数据结构
RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...
- Redis(九):使用RedisTemplate访问Redis数据结构API大全
RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...
- 如何使用RedisTemplate访问Redis数据结构之list
Redis的List数据结构 这边我们把RedisTemplate序列化方式改回之前的 Jackson2JsonRedisSerializer<Object> jackson2JsonRe ...
- RedisTemplate访问Redis数据结构(一)——String
当对String数据结构进行操作时,推荐直接使用spring-data-redis提供的StringRedisTemplate,其配置如下 <bean id="stringRedisT ...
- RedisTemplate访问Redis数据结构(前言)
Redis五种基本数据结构 redis提供键值对的形式对数据进行存储.支持五种数据类型:String(字符串),List(链表),Hash(散列),Set(无序集合),ZSet(有序集合).下面是网上 ...
- 如何使用RedisTemplate访问Redis数据结构之Zset
Redis的ZSet数据结构 Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合 ...
- RedisTemplate访问Redis数据结构(五)——ZSet
Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型的分数.有序集合的成员是唯一的,但分数(score)却可以重复.red ...
随机推荐
- 2019巅峰极客CTF-web1(LOL英雄联盟)
今晚有空 以后随缘写博客了 好好沉淀 web1当天做出的队伍很少 其实不难 折腾到最后就差一步 可惜 0x01 读取文件 截图没留了 只留了代码部分. 有个页面 有上传和下载功能 起初 ...
- ICEM—二维混合网格对齐节点
原视频下载地址: https://pan.baidu.com/s/1bpnjfT9 密码: jeuv
- awk、grep、sed
awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...
- 【Robot Framework 】项目实战汇总
写在前面 RF自动化的文章记录基本完成,建一个汇总目录,方便查看. [Robot Framework 项目实战]汇总 ∮[RF 项目实战 00]环境搭建 ∮[RF 项目实战 01]使用 Request ...
- HearthBuddy Ai 调试实战2 在使用海巨人的时候,少召唤了一个图腾(费用是对的)
问题 游戏面板 8是青玉之爪13是海巨人17是恐狼前锋 64是萨满 66是圣骑士63,99,46,是微型木乃伊[其中99和46都是2血3攻,63是2血1攻]57是鱼人木乃伊 微型木乃伊 "L ...
- 进程 | 线程 | 当Linux多线程遭遇Linux多进程
背景 本文并不是介绍Linux多进程多线程编程的科普文,如果希望系统学习Linux编程,可以看[<Unix环境高级编程>第3版] 本文是描述多进程多线程编程中遇到过的一个坑,并从内核角度分 ...
- 各个处理器架构ISA编程指南
1.Intel官方文档: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manu ...
- OS X以及iOS中与硬件环境相关的预定义宏
由于现在ARM处理器的飞速发展,从Apple A4到现在的Apple A7,从32位到64位,每一代处理器几乎都增加了不少特性,从而在架构上也有所不同.比如Apple A6引入了ARMv7S架构,增加 ...
- Flask模拟实现CSRF攻击的方法
https://www.jb51.net/article/144371.htm https://www.cnblogs.com/888888CN/p/9489345.html http://xiaor ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_03-自定义查询页面-前端
下拉选择框 <!--查询表单--> <el-form :model="params"> <el-select v-model="params ...