1. 键值对数据库

1.1 redis数据结构

redis的数据是 key-value 形式的键值对,其中 key 其实都是字符串的形式,而 value 的数据类型,也就是数据的保存形式,底层实现的方式就用到了数据结构。

所以我们一直说的“redis五种数据结构”,严格上来说是“redis五种数据类型”。

redis数据类型和底层数据结构的对应关系图如下

可以看出,redis3.0与之后的版本,对象底层数据结构是有所不同的。

  1. redis3.0中list数据类型的底层数据结构由【双向列表】和【压缩列表】实现,而在3.2版本之后,list数据类型底层数据结构由quicklist实现。
  2. 压缩列表数据结构已经废弃,由listpack数据结构替代了。

所以,在redis3.0之后的版本,redis的数据结构有六种:SDS、quicklist、listpack、哈希表、整数集合、跳跃列表。

1.2 redis对象与数据结构关系

我们都知道redis是一个 key-value 形式的数据库,所有的 key 都是字符串,而 value 可以是字符串,也可以是list、hash、set、sortedset这些数据类型。

这些键值对怎么保存在redis中?
redis使用了一个哈希表保存所有键值对。哈希表的优点就是可以用O(1)的时间复杂度快速查找键值对对象,哈希表其实也是一个数组,每个元素都是一个哈希桶。
哈希表存放键值对的关系图如下所示

再搭配上面的redis数据类型和数据结构的关系,就知道redis对象和数据结构的关系了。

redis是用C语言实现的,所以redis的数据结构实际上就是C语言的数据结构。
如果想更深层次了解redis的数据结构,可以看这位大佬写的文章redis数据结构详解

2. 五种常用数据类型

作为Java开发工程师,我们需要熟知这五种常用的数据类型,并知道其操作命令,以及通过Java语言操作这五种数据类型。

2.0 key

2.0.1 类型

string字符串类型

2.0.2 通用操作命令

查看数据库中key

keys *         查看数据库所有key
keys k*        匹配以k开头的key
keys k*s       匹配以k开头,以s结尾的key
keys k?s       匹配以k开头,以s结尾,且中间只能有一个字符的key

删除key

del key
del key1 key2 ...
返回删除成功的个数

判断key在数据库中是否存在

exists key                       如果存在,则返回1;如果不存在,则返回0
exists key [key1 key2 ....]      返回值是存在的key的数量

移动key到指定的数据库

move key index
index从0开始,默认范围为0~15,代表redis的16个数据库

设置key的最大存活时间

expire key seconds

查看key的剩余存活时间

ttl key
如果key没有设置生存时间,返回-1
如果key不存在,返回-2

查看key的数据类型

type key

重命名key

rename key newkey

2.1 string

2.1.1 底层结构

类比Java的String类型,底层通过SDS(simple dynamic string)结构实现。
保存的是字符串类型数据,如果字符串以整数形式展示,可以作为数字操作使用。

单key - 单value结构

2.1.2 操作命令

新建键值对

set key value
如果key已经存在,则value会覆盖setnx key value
如果key已经存在,则放弃设置setex key seconds value
新建key的同时设置它的最大存活时间mset k1 v1 k2 v2 k3 v3
批量设置字符串,若key重复,value覆盖msetnx k1 v1 k2 v2 k3 v3
批量设置字符串,有一个key重复,全部放弃设置

获取value

get key            单个获取字符串
mget k1 k2 k3 k4   批量获取字符串

字符串追加

append key value
返回追加后的字符串长度
如果key不存在,新建key,设置value值为value

获取字符串数据长度

strlen key

字符串数值处理

incr key              数值+1
decr key              数值-1
incrby key offset     数值+offset
decrby key offset     数值-offset
返回操作后的value值
如果key不存在,首先创建这个key,设置value为字符串0,然后进行运算
如果key对应的value不是整数,报错

闭区间获取子字符串

getrange key startIndex endIndex
字符串下标可以从左往右从0开始,也可以从右往左从-1开始,二者是等价的

用value覆盖字符串

setrange key startIndex value
从第startIndex个字符开始,用value能覆盖几个字符就覆盖几个字符
返回覆盖后字符串的长度

2.2 list

2.2.1 底层结构

底层采用quicklist的数据结构,可以理解为一个双向链表,最左侧是表头,最右侧是表尾。
元素下标也是从左往右从0开始,从右往左从-1开始。
列表元素较少时使用ziplist存储,它将所有元素紧挨着存储,分配一块连续的内存空间。
数据量较多时redis将ziplist和链表结合起来形成quicklist。
列表里的元素只能是string类型。

单key - 多有序value结构

2.2.2 操作命令

创建列表key,将一个或多个值插入列表

lpush key value1 value2...     左插入
rpush key value1 value2...     右插入

更改指定位置元素值

lset key index value

获取指定下标区间的元素

lrange key startIndex endIndex
lrange key 0 -1    获取列表所有元素

移除并返回元素

lpop key    左弹出
rpop key    右弹出
pop每次只能移除并返回一个元素

获取列表中指定下标的元素值

lindex key index

获取列表长度

llen key

移除count个列表中和value相等的数据

lrem key count value
count > 0    从左侧计数
count < 0    从右侧计数
count = 0    移除全部

保留指定范围元素(闭区间)

ltrim key startIndex endIndex

2.3 hash

2.3.1 底层结构

类似于Java的HashMap,数组+链表的数据结构
hash的内容 field-value 键值对存放在链表中,数组存放的是链表的头指针

单key - 多field-value对象结构;可以认为是key和field联合组成一个key。

hash类型的key可以理解为一个类,field为类中属性,value是属性值。

2.3.2 操作命令

创建哈希表key,将一个或多个键值对放入哈希表

hset key filed1 value1 field2 value2...
如果key field已经存在,则value会把以前的值覆盖掉

获取指定哈希表指定field的值

hget key field
hmget key field1 field2...

获取哈希表内所有field和value

hgetall key

从哈希表中删除一个或多个key

hdel key field1 field2....

获取哈希表中field个数

hlen key

判断哈希表是否存在某个field

hexists key field

获取field列表

hkeys key

获取value列表

hvals key

设置field-value到哈希表,如果这个field-value已经存在,放弃设置

hsetnx key field value

2.4 set

2.4.1 底层结构

类似于Java的HashSet,底层也是hash的数据结构,所有value指向同一个内部值
往set里放置元素时,实际上是放置在hash的field上,达到去重效果。

单key - 多无序value,value不能重复。

2.4.2 操作命令

创建set集合,放置一个或多个元素

sadd key value1 value2...

获取集合中所有元素

smembers key

判断指定元素在集合中是否存在

sismember key member

获取集合元素个数

scard key

移除集合中一个或多个元素

srem key value1 value2...

随机获取集合中一个或多个元素

srandmember key count
count > 0   元素不能有重复
count < 0   元素可能有重复

随机移除集合中一个或多个元素

spop key count

将一个集合的指定元素移动到另一个集合

smove source dest value

集合的差集、交集、并集

获取第一个集合中有、但是其它集合中都没有的元素组成的新集合

sdiff key1 key2...

获取所有指定集合中都有的元素组成的新集合(交集)

sinter key1 key2...

获取所有指定集合中所有元素组成的大集合(并集)

sunion key1 key2

2.5 sortedset(zset)

2.5.1 底层结构

zset其实和hash类型很像,hash的值是field-value键值对,zset的值是value-score键值对,hash的field不能重复,zset的value也不能重复。

zset和set的不同之处在于set是无序的,而zset会根据每个元素的分数进行自动排序(从小到大),所以是有序的,而且每一个元素都有对应的下标。

zset是单key - 多value-score对象结构,底层用到了跳跃列表的数据结构。

2.5.2 操作命令

将一个或多个value-score值放入有序集合

zadd key score1 value1 score2 value2

获取有序集合中指定下标区间的元素

zrange key startIndex endIndex [withscores]
[withscores] 为可选项,如果加上这个,可以让score和value一起返回

获取有序集合中指定分数区间的元素(闭区间)

zrangebyscore key min max [withscores]

获取有序集合中元素个数

zcard key

获取有序集合中指定分数区间内元素个数

zcount key min max

获取有序集合中指定元素排名(从0开始)

zrank key value

获取有序集合中指定元素分数

zscore key value

删除有序集合中一个或多个元素,不存在的元素忽略

zrem key value1 value2...

Redis数据类型与操作命令相关推荐

  1. Redis 数据类型与操作命令整理

    Redis 优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, ...

  2. Redis源码-Set:Redis Set存储原理、Redis Set集合操作命令、Redis Set两种存储底层编码intset+hashtable、Redis Set应用场景

    Redis源码-Set:Redis Set存储原理.Redis Set集合操作命令.Redis Set两种存储底层编码intset+hashtable.Redis Set应用场景 Redis数据类型 ...

  3. Redis 数据类型 Strings 类型详解

    Redis 数据类型 Strings 类型详解 bitmap 操作 SETBIT • SETBIT key offset value 起始版本:2.2.0 时间复杂度:O(1) 设置或者清空key的v ...

  4. Redis 数据类型之(底层解析)

    Redis 数据类型之(底层解析) Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redi ...

  5. Redis 数据类型介绍

    Redis 数据类型介绍 你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值.也就是说,你不必仅仅把字符串当作键所指向的值.下列这些数据类型都可 ...

  6. redis设置密码和启动 redis数据类型

    Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径.Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象. Redis运行在内存中 ...

  7. Redis Cluster日常操作命令梳理

    在之前的一篇文章已经介绍了Redis Cluster及其部署,下面说下Redis Cluster日常操作命令: 一.以下命令是Redis Cluster集群所独有的,执行下面命令需要先登录redis: ...

  8. 【Redis】2. Redis数据类型 String以及key的设置约定

    学习资料 https://www.bilibili.com/video/BV1CJ411m7Gc?p=6 数据存储类型介绍 业务数据的特殊性 作为缓存使用 原始业务功能设计 秒杀 618活动 双十一活 ...

  9. 【Redis】杂项基础知识;Redis数据类型

    基础知识 Redis是一个内存数据库, 所有数据基本上都存在于内存当中, 会定时以追加或者快照的方式刷新到硬盘中. 由于redis是一个内存数据库, 所以读取写入的速度是非常快的, 所以经常被用来做数 ...

最新文章

  1. 机器学习中的没有免费的午餐定律是什么?“没有免费的午餐”对你意味着什么?没有免费午餐定律定律能给数据科学家提供什么启示?
  2. visual assist破解
  3. CTF(pwn)攻防世界warmup
  4. UNITY 复制对象后局部坐标和世界坐标的变化问题
  5. KVM虚拟机添加硬盘
  6. 《移动优先与响应式Web设计》一1.2 设备不同,功能不同
  7. 【多媒体内容与体验创新】
  8. 雷林鹏分享:Ruby Web Services 应用 - SOAP4R
  9. 计算机专业 操作系统,计算机操作系统
  10. ML、DL、CNN学习记录8
  11. System.arraycopy详解
  12. Keras版GCN源码解析
  13. 串流类(istrstream)输入行为的探讨
  14. 树莓派改造无线打印机
  15. 领域驱动设计系列关键概念
  16. 华为交换机sftp 配置
  17. 谈谈产品与运营之 - 润物细无声
  18. php计算两个地点的距离
  19. Keil_uvision 基本使用教程
  20. NX二次开发-UFUN读取属性的值UF_ATTR_read_value

热门文章

  1. 微信公众号如何实现在线报修系统?
  2. 介绍一下期货开户的相关知识
  3. 用C编写COM(一)
  4. 浅谈移动软件开发与电脑软件开发发展前景
  5. 【Tools】彻底搞懂原码,反码,补码和变补。
  6. jgrid 多选 快捷键_jqgrid定义多选操作
  7. 站帮微管家和其他微信营销软件的区别
  8. i春秋CTF训练营Rotated!解题思路及其过程。
  9. hive:函数:条件函数:if函数
  10. OrangePi Zero 串口显示连接和利用Debian裁剪成为DietPi