Redis数据结构

Redis数据结构介绍

Redis是一种高级的key-value的存储系统,其中value支持五种数据类型。
  1. 字符串(String)
  2. 哈希(hash)
  3. 字符串列表(list)
  4. 字符串集合(set)
  5. 有序字符串集合(sorted set)
而关于key的定义呢,需要注意的几点:
  1. key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找效率。
  2. key不要太短,如果太短会降低key的可读性。
  3. 在项目中,key最好有一个统一的命名规范。
下面重点介绍五种类型:
  1. 存储string

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M
常用命令

赋值

  • Set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回”OK”
     Set name yuanwang

取值

  • get key :获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String value;如果改key不存在,返回(nil)
Get name
Get name1
  •  Getset key value:先获取该key的值,然后在设置改key的值。
Getset name baidu
Get name

删除

  • Del key:删除指定key
Set age 18
Get age
Del age
Get age

数值增减

  • Incr key:将指定的key的value原子性的递增1,如果该key不存在,其初始值为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息.
  • Decr key :将指定的key的value原子性的递减1,如果该key不存在,其初始值为0,在incr之后其值为-1,如果value的值不能转成整型,如hello,该操作将执行失败并返回相应的错误信息.

追加

  • Append key value:拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value.
  1. 存储hash

Redis中的hash类型可以看成具有String key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如username,password和age等,如果hash中包括很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
常用命令

赋值

  • Hset key field value:为指定的key设定field/value对(键值对)。
  • Hmset key field value[field2 value2…]:设置key中的多个field/value
        

取值

  • Hget key field :返回指定的key中的field的值
  • Hmget key field1 field2…:获取key中的多个field值
  • Hgetall key:获取key中的所有filed-value

删除

  • Hdel key field[field…] :可以删除一个或多个字段,返回值是被删除的字段个数
Del  key :通用

增加数字

  • Hincrby key field incement:设置key中filed的值增加increment,如age增加20

扩展

  • Hexists key field:判断指定的key中的field 是否存在。
  • Hlen key:获取key所包含的field 数量
  • Hkeys key :获取所有的key
  1. 存储list

在redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295.
在元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。
回顾基础:
   arrayList与linkedList区别?
双向链表中添加数据
双向链表中删除数据
常用命令

两端添加

  • Lpush key values[value1 value2…]:在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
  • Rpush key values[value1、value2…]:在该list的尾部添加元素。

查看列表

  • Lrange key start end: 获取链表中从start到end的元素的值,start,end从0开始计数;也可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,以此类推….

两端弹出

  • Lpop key :返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。
  • Rpop key :从尾部弹出元素

获取列表中元素的个数

  • Llen key:返回指定的key关联的链表中的元素的数量。

删除

  • Lrem key count value: 删除count 个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。
初始化数据
从头删除,2个数字‘3’
从尾删除,
Lrem mylist3 -2 1
删除所有数字的‘2’
Lrem mylist 0 2

扩展

  • Lpushx key value:仅当参数中指定的key存在时,向关联的list的头部插入value,如果不存在,将不进行插入。
  • Rpushx key value:在list尾部添加元素
索引插入
  • Lset key index value:设置链表中的index的角标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的角标不存在则抛异常。
  • Linsert key before |after pivot value: 在pivot元素前或者后插入value这个元素。
Rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。
  1. 将mylist5右端弹出,压入到mylist6 左边
  1. 将mylist6右端数据弹出,压入到左端

应用范围

lists的应用相当广泛,随便举几个例子:
1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
2.利用LRANGE还可以很方便的实现分页的功能。
3.在博客系统中,每个博文的评论也可以存入一个单独的list中。

4.存储set

在redis中,我们可以将set类型看作为没有排序的字符集合,和list类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。
和list类型不同的是,set集合中不允许出现重复的元素,这一点和咱java中的hashSet是完全相同的。和list类型相比,set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
常用命令

添加/删除元素

  • Sadd key values[value1、value2…]:向set中添加数据,如果该key的值已有则不会重复添加
  • Srem key members[member1、member2…]:删除set中指定的成员
 
Sadd myset 1 2 3
Srem myset 1 2

获取集合中的元素

  • Smembers key:获取set中所有的成员
Smembers myset

集合的差集运算

  • Sdiff key1 key2…:返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。(属于A并且不属于B的元素构成的集合)
Sadd mya1 a b c
Sadd myb1 a c 1 2
Sdiff mya1 myb1

集合的交集运算

  • Sinter key1 key2 key3…:返回交集(属于A且属于B的元素构成的集合)
Sadd mya2 a b c
Sadd myb2 a c 1 2
Sinter mya2 myb2
集合的并集运算
  • Sunion key1 key2 key3…:返回并集(属于A或者属于B的元素构成的集合)
Sadd mya3 a b c
Sadd myb3 a c 1 2
Sunion mya3 myb3

应用范围

 1). 可以使用Redis的Set数据类型跟踪一些唯一性数据,比如访问某一博客的唯一IP地址信息。对于此场景,我们仅需在每次访问该博客时将访问者的IP存入Redis中,Set数据类型会自动保证IP地址的唯一性。
      2). 充分利用Set类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户ID被存储在一个指定的Set中,而购买另外一种电子产品的客户ID被存储在另外一个Set中,如果此时我们想获取有哪些客户同时购买了这两种商品时,Set的intersections命令就可以充分发挥它的方便和效率的优势了。

5.存储sortedset

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复.
常用命令

添加元素

  • Zadd key score member score2 member2….: 将所有成员以及该成员的分数存放到sorted-set中。如果该元素已经存在则会用新的分数替换原有的分数
Zadd mysort 20 zhangsan 80 lisi 90 wangwu
Zadd mysort 100 zhangsan
Zadd mysort 50 jack

获得元素

  • Zscore key member:返回指定成员的分数
Zscore mysort zhangsan
  • Zcard key:获取集合中的成员数量
Zcard mysort

删除元素

  • Zrem key member[member…]:移除集合中指定的成员,可以指定多个成员。
Zrem mysort jack wangwu
Zcard mysort
范围查询
  • Zrange key start end[withscores]:获取集合中角标为start-end的成员,[withscores]表示包含其分数
Zadd mysort 85 jack 95 rose
Zrange mysort 0 -1
Zrange mysort 0 -1 withscores
  • Zrevrange key start stop [withscores]:照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
Zrevrange mysort 0 -1 withscores
 

Redis五种数据结构(二)的更多相关文章

  1. redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...

  2. 【Redis】redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...

  3. 2.Redis五种数据结构

    2.Redis五种数据结构2.1 预备2.1.1 全局命令2.1.2 数据结构和内部编码2.1.3 单线程架构2.2 字符串2.2.1 命令2.2.2 内部编码2.2.3 典型使用场景2.3 哈希2. ...

  4. redis 五种数据结构详解(string,list,set,zset,hash),各种问题综合

    redis 五种数据结构详解(string,list,set,zset,hash) https://www.cnblogs.com/sdgf/p/6244937.html redis 与 spring ...

  5. Redis(一)、Redis五种数据结构

    Redis五种数据结构如下: 对redis来说,所有的key(键)都是字符串. 1.String 字符串类型 是redis中最基本的数据类型,一个key对应一个value. String类型是二进制安 ...

  6. Redis 五种数据结构详解(string,hash,list,set,zset)

    一.五种数据结构: 1. String--字符串 String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候e ...

  7. Redis五种数据结构(Windows Server)

    1.Redis的五种数据结构 这里推荐大家在命名redis的key的时候最好的加上前缀,并且使用 :来分割前缀 ,这里在使用可视化工具查看的时候就比较好区分,比如我的的前缀是 Demo:test:(一 ...

  8. Redis五种数据结构简介

    Redis五种结构 1.String 可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作. 字符 ...

  9. Redis五种数据结构解析

    Redis是一个开源的Key-Value存储引擎,它支持string.hash.list.set和sorted set等多种值类型.由于其卓越的性能表现.丰富的数据类型及稳定性,广泛用于各种需要k/v ...

随机推荐

  1. vue 页面 添加背景音乐

    背景音乐 添加背景音乐 并有单击事件   循环播放 <template> <div id="page"> <div style="width ...

  2. zTree入门使用

    简单入门使用,熟悉其功能,没有与异步调用后台数据,用的是本地设置的数据. zTree的API:http://www.treejs.cn/v3/api.php 源码:https://github.com ...

  3. Spring mybatis源码篇章-Mybatis的XML文件加载

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis主文件加载 前话 前文主要讲解了Mybatis的主文件加载方式,本文则分析不使用主文件加载方式 ...

  4. 如何配置虚拟机的ip地址以及如何使用XShell和WinSCP工具

    参考资料:https://blog.csdn.net/phy1997/article/details/78928796

  5. Linux系列(12)之例行工作调度

    你知道工作调度有哪几种吗? 你知道在进行工作调度时需要哪些服务在运行吗? 你知道突发性工作调度的指令at的用法吗? 知道如何管理at的工作调度吗? 知道at指令进行工作调度的原理吗? 知道什么是背景任 ...

  6. 宝塔面板liunx开启ssl域名后无法访问解决方法

    不打开宝塔面板的ssl会不安全,打开了就会提示ssl证书不能使用的错误 如下所示: 您的连接不是私密连接 攻击者可能会试图从 你的ip 窃取您的信息(例如:密码.通讯内容或信用卡信息).了解详情 NE ...

  7. matplotlib 画图中的basemap安装问题

    在我用matplotlib画图是会用到,basemap这个库,但是直接安装却会出现问题: 使用这条安装命令就能够安装功能了: conda install -c conda-forge basemap= ...

  8. shell习题第14题:

    [题目要求] 需求,根据web服务器的访问日志,把一些请求高的ip给拒绝掉,并且每隔半小时把不再发起请求或者请求量很小的ip给解封 假设: 1. 一分钟内请求量高于100次的ip视为不正常的请求 2. ...

  9. 牛客 203B tree(树形dp)

    大意: 给定树, 对于每个节点, 求包含该节点的连通子集数. 显然有$dp[x]=\prod (dp[y]+1), ans[x]=(\frac{ans[fa[x]]}{dp[x]+1}+1)dp[x] ...

  10. eclipse导入maven空项目,eclipse导入时不识别maven项目

    经常我们在网上下载的一些开源项目中,想要导入eclipse中,却发现eclipse不识别这个项目,这时候怎么办呢? 解决办法多种多样,我这里举例出最实用的2种: 1.在项目的根目录中加入.classp ...