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代码中的结构如下:

  1. org.springframework.data.redis.core
  2. Class RedisTemplate<K,V>
  3. java.lang.Object
  4. org.springframework.data.redis.core.RedisAccessor
  5. 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种数据结构操作

  1. redisTemplate.opsForValue();//操作字符串
  2. redisTemplate.opsForHash();//操作hash
  3. redisTemplate.opsForList();//操作list
  4. redisTemplate.opsForSet();//操作set
  5. redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate与RedisTemplate

  • 两者的关系是StringRedisTemplate继承RedisTemplate。

  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate配置如下:

  1. @Bean
  2. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
  3. {
  4. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
  5. ObjectMapper om = new ObjectMapper();
  6. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  7. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  8. jackson2JsonRedisSerializer.setObjectMapper(om);
  9. RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
  10. template.setConnectionFactory(redisConnectionFactory);
  11. template.setKeySerializer(jackson2JsonRedisSerializer);
  12. template.setValueSerializer(jackson2JsonRedisSerializer);
  13. template.setHashKeySerializer(jackson2JsonRedisSerializer);
  14. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  15. template.afterPropertiesSet();
  16. return template;
  17. }

Redis的String数据结构 (推荐使用StringRedisTemplate)

注意:如果使用RedisTemplate需要更改序列化方式

  1. RedisSerializer<String> stringSerializer = new StringRedisSerializer();
  2. template.setKeySerializer(stringSerializer );
  3. template.setValueSerializer(stringSerializer );
  4. template.setHashKeySerializer(stringSerializer );
  5. 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);
  1. 使用:redisTemplate.opsForValue().set("name","tom");
  2. 结果:redisTemplate.opsForValue().get("name") 输出结果为tom
  • set void set(K key, V value, long timeout, TimeUnit unit);
  1. 使用:redisTemplate.opsForValue().set("name","tom",10, TimeUnit.SECONDS);
  2. 结果:redisTemplate.opsForValue().get("name")由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null

  set void set(K key, V value, long offset);该方法是用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始

  1. 使用:template.opsForValue().set("key","hello world");
  2. template.opsForValue().set("key","redis", 6);
  3. System.out.println("***************"+template.opsForValue().get("key"));
  4. 结果:***************hello redis
  • setIfAbsent Boolean setIfAbsent(K key, V value);
  1. 使用:System.out.println(template.opsForValue().setIfAbsent("multi1","multi1"));//false multi1之前已经存在
  2. System.out.println(template.opsForValue().setIfAbsent("multi111","multi111"));//true multi111之前不存在
  3. 结果:false
  4. true
  • multiSet void multiSet(Map<? extends K, ? extends V> m);为多个键分别设置它们的值
  1. 使用:Map<String,String> maps = new HashMap<String, String>();
  2. maps.put("multi1","multi1");
  3. maps.put("multi2","multi2");
  4. maps.put("multi3","multi3");
  5. template.opsForValue().multiSet(maps);
  6. List<String> keys = new ArrayList<String>();
  7. keys.add("multi1");
  8. keys.add("multi2");
  9. keys.add("multi3");
  10. System.out.println(template.opsForValue().multiGet(keys));
  11. 结果:[multi1, multi2, multi3]
  • multiSetIfAbsent Boolean multiSetIfAbsent(Map<? extends K, ? extends V> m);为多个键分别设置它们的值,如果存在则返回false,不存在返回true
  1. 使用:Map<String,String> maps = new HashMap<String, String>();
  2. maps.put("multi11","multi11");
  3. maps.put("multi22","multi22");
  4. maps.put("multi33","multi33");
  5. Map<String,String> maps2 = new HashMap<String, String>();
  6. maps2.put("multi1","multi1");
  7. maps2.put("multi2","multi2");
  8. maps2.put("multi3","multi3");
  9. System.out.println(template.opsForValue().multiSetIfAbsent(maps));
  10. System.out.println(template.opsForValue().multiSetIfAbsent(maps2));
  11. 结果:true
  12. false
  • get V get(Object key);
  1. 使用:template.opsForValue().set("key","hello world");
  2. System.out.println("***************"+template.opsForValue().get("key"));
  3. 结果:***************hello world
  • getAndSet V getAndSet(K key, V value);设置键的字符串值并返回其旧值
  1. 使用:template.opsForValue().set("getSetTest","test");
  2. System.out.println(template.opsForValue().getAndSet("getSetTest","test2"));
  3. 结果:test
  • multiGet List<V> multiGet(Collection<K> keys);为多个键分别取出它们的值
  1. 使用:Map<String,String> maps = new HashMap<String, String>();
  2. maps.put("multi1","multi1");
  3. maps.put("multi2","multi2");
  4. maps.put("multi3","multi3");
  5. template.opsForValue().multiSet(maps);
  6. List<String> keys = new ArrayList<String>();
  7. keys.add("multi1");
  8. keys.add("multi2");
  9. keys.add("multi3");
  10. System.out.println(template.opsForValue().multiGet(keys));
  11. 结果:[multi1, multi2, multi3]
  • increment Long increment(K key, long delta);支持整数
  1. 使用:template.opsForValue().increment("increlong",1);
  2. System.out.println("***************"+template.opsForValue().get("increlong"));
  3. 结果:***************1
  • increment Double increment(K key, double delta);也支持浮点数
  1. 使用:template.opsForValue().increment("increlong",1.2);
  2. System.out.println("***************"+template.opsForValue().get("increlong"));
  3. 结果:***************2.2
  • append Integer append(K key, String value);如果key已经存在并且是一个字符串,则该命令将该值追加到字符串的末尾。
  • 如果键不存在,则它被创建并设置为空字符串,因此APPEND在这种特殊情况下将类似于SET。
  1. 使用:template.opsForValue().append("appendTest","Hello");
  2. System.out.println(template.opsForValue().get("appendTest"));
  3. template.opsForValue().append("appendTest","world");
  4. System.out.println(template.opsForValue().get("appendTest"));
  5. 结果:Hello
  6. Helloworld
  • get String get(K key, long start, long end);截取key所对应的value字符串
  1. 使用:appendTest对应的valueHelloworld
  2. System.out.println("*********"+template.opsForValue().get("appendTest",0,5));
  3. 结果:*********Hellow
  4. 使用:System.out.println("*********"+template.opsForValue().get("appendTest",0,-1));
  5. 结果:*********Helloworld
  6. 使用:System.out.println("*********"+template.opsForValue().get("appendTest",-3,-1));
  7. 结果:*********rld
  • size Long size(K key);返回key所对应的value值得长度
  1. 使用:template.opsForValue().set("key","hello world");
  2. System.out.println("***************"+template.opsForValue().size("key"));
  3. 结果:***************11
  • setBit Boolean setBit(K key, long offset, boolean value);对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)
    key键对应的值value对应的ascii码,在offset的位置(从左向右数)变为value
  1. 使用:template.opsForValue().set("bitTest","a");
  2. // 'a' 的ASCII码是 97。转换为二进制是:01100001
  3. // 'b' 的ASCII码是 98 转换为二进制是:01100010
  4. // 'c' 的ASCII码是 99 转换为二进制是:01100011
  5. //因为二进制只有0和1,在setbit中true为1,false为0,因此我要变为'b'的话第六位设置为1,第七位设置为0
  6. template.opsForValue().setBit("bitTest",6, true);
  7. template.opsForValue().setBit("bitTest",7, false);
  8. System.out.println(template.opsForValue().get("bitTest"));
  9. 结果:b
  • getBit Boolean getBit(K key, long offset);获取键对应值的ascii码的在offset处位值
  1. 使用:System.out.println(template.opsForValue().getBit("bitTest",7));
  2. 结果:false

作者:DreamerRzc
链接:https://www.jianshu.com/p/7bf5dc61ca06
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

如何使用RedisTemplate访问Redis数据结构之字符串操作的更多相关文章

  1. RedisTemplate访问Redis数据结构

    https://www.jianshu.com/p/7bf5dc61ca06 Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字 ...

  2. RedisTemplate访问Redis数据结构(介绍和常用命令)

    Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集 ...

  3. 如何使用RedisTemplate访问Redis数据结构

    RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...

  4. Redis(九):使用RedisTemplate访问Redis数据结构API大全

    RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...

  5. 如何使用RedisTemplate访问Redis数据结构之list

    Redis的List数据结构 这边我们把RedisTemplate序列化方式改回之前的 Jackson2JsonRedisSerializer<Object> jackson2JsonRe ...

  6. RedisTemplate访问Redis数据结构(一)——String

    当对String数据结构进行操作时,推荐直接使用spring-data-redis提供的StringRedisTemplate,其配置如下 <bean id="stringRedisT ...

  7. RedisTemplate访问Redis数据结构(前言)

    Redis五种基本数据结构 redis提供键值对的形式对数据进行存储.支持五种数据类型:String(字符串),List(链表),Hash(散列),Set(无序集合),ZSet(有序集合).下面是网上 ...

  8. 如何使用RedisTemplate访问Redis数据结构之Zset

    Redis的ZSet数据结构 Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合 ...

  9. RedisTemplate访问Redis数据结构(五)——ZSet

    Redis 有序集合和无序集合一样也是string类型元素的集合,且不允许重复的成员.不同的是每个元素都会关联一个double类型的分数.有序集合的成员是唯一的,但分数(score)却可以重复.red ...

随机推荐

  1. 2019巅峰极客CTF-web1(LOL英雄联盟)

    今晚有空 以后随缘写博客了 好好沉淀 web1当天做出的队伍很少 其实不难    折腾到最后就差一步  可惜    0x01 读取文件 截图没留了 只留了代码部分. 有个页面  有上传和下载功能 起初 ...

  2. ICEM—二维混合网格对齐节点

    原视频下载地址: https://pan.baidu.com/s/1bpnjfT9 密码: jeuv

  3. awk、grep、sed

    awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...

  4. 【Robot Framework 】项目实战汇总

    写在前面 RF自动化的文章记录基本完成,建一个汇总目录,方便查看. [Robot Framework 项目实战]汇总 ∮[RF 项目实战 00]环境搭建 ∮[RF 项目实战 01]使用 Request ...

  5. HearthBuddy Ai 调试实战2 在使用海巨人的时候,少召唤了一个图腾(费用是对的)

    问题 游戏面板 8是青玉之爪13是海巨人17是恐狼前锋 64是萨满 66是圣骑士63,99,46,是微型木乃伊[其中99和46都是2血3攻,63是2血1攻]57是鱼人木乃伊 微型木乃伊 "L ...

  6. 进程 | 线程 | 当Linux多线程遭遇Linux多进程

    背景 本文并不是介绍Linux多进程多线程编程的科普文,如果希望系统学习Linux编程,可以看[<Unix环境高级编程>第3版] 本文是描述多进程多线程编程中遇到过的一个坑,并从内核角度分 ...

  7. 各个处理器架构ISA编程指南

    1.Intel官方文档: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manu ...

  8. OS X以及iOS中与硬件环境相关的预定义宏

    由于现在ARM处理器的飞速发展,从Apple A4到现在的Apple A7,从32位到64位,每一代处理器几乎都增加了不少特性,从而在架构上也有所不同.比如Apple A6引入了ARMv7S架构,增加 ...

  9. Flask模拟实现CSRF攻击的方法

    https://www.jb51.net/article/144371.htm https://www.cnblogs.com/888888CN/p/9489345.html http://xiaor ...

  10. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_03-自定义查询页面-前端

    下拉选择框 <!--查询表单--> <el-form :model="params"> <el-select v-model="params ...