2.【Redis系列】Redis基础数据结构

原文:2.【Redis系列】Redis基础数据结构

千里之行始于足下,我们先来看看redis的基础知识。

Redis有5中基本数据类型:字符串(string)、列表(list)、集合(set)、有序集合(zset)、字典(hash)。熟练掌握这5种基本数据结构也是最基本最重要的部分。

String(字符串)

字符串是redis中最简单的数据结构,Redis所有的数据结构都是以唯一key作为名称,然后通过唯一的key来获取相应的redis数据。不同类型的数据结构的差异就在于value的结构不一样。

字符串使用非常广泛,最常用的就是缓存用户信息,通常我们将用户信息使用JSON序列化成字符串,然后将序列化后的字符串塞进redis中,同样,取用户信息的时候再进行一次反序列化的过程。

Redis的字符串是动态字符串,内部结构类似java的ArrayList。采用与分配空间的方式肩上内存的频繁分配。内部为当前字符串实际分配的空间capacity,当字符串小于1M时,扩容都是加倍现有的空间,当超过1M时,扩容只会多扩1M的空间,需要注意的是字符串的最大空间是512M。

键值对

>set name QQsir
ok
>get name
"QQsir"
>exists name
(integer) 1
>del name
(integer) 1
>get name
(nil)
批量键值对

>mset name1 QQ name2 wx
>mget name1 name2
1)"QQ"
2)"wx"
过期和set命令扩展

>set name QQsir
>get name
"QQsir"
>expire name 5 #5秒后过期
...wait 5s
>get name
(nil)
计数

如果value是整数,可以对它自增操作

>set age 30
ok
>incr age
(integer)31
>incrby age 5
(integer)36
>incrby age -5
(integer)31

list(列表)

Redis列表相当于java语言里面的linkedlist,注意它是链表而不是数组。意味着list的插入和删除非常的快,时间复杂度O(1) ,但是索引定位很慢,时间复杂度O(n).

当列表弹出最后一个元素之后,该数据结果自动被删除,内存回收。

Redis的列表结构可以用来做异步队列,将延后处理的任务结构体序列成字符串放到Redis的列表中。另一个线程从这个列表中轮训获取数据进行处理。

左边进左边出

> rpush books python java golang
(integer) 3
> llen books
(integer) 3
> lpop books
"python"
> lpop books
"java"
> lpop books
"golang"
> lpop books
(nil)
右边进右边出:栈

> rpush books python java golang
(integer) 3
> rpop books
"golang"
> rpop books
"java"
> rpop books
"python"
> rpop books
(nil)
快速列表

ziplist.png

如果再深入一些,list列表的底层是一个快速列表quicklist的数据结构。

当存储元素较少的时候,会分配一块连续的内存,这个结构是压缩列表ziplist,当元素过多,就需要使用quicklist,因为普通的链表使用空间太大,增加内存的碎片化,比如存储一个int类型,还需要两个指针,增加内存占用空间。所以使用链表和ziplist结合的方式,使用双箭头将ziplist链接起来,这样即满足快速插入和删除,又能不占用过多的空间。

hash(字典)

Redis字典相当于java里面的hashmap,它是无序字典,内部结构上同hashmap一样,使用数组加链表的方式,第一维hash的数组发生碰撞,就会将碰撞的元素使用链表串联起来。

hash.png

不同的是redis存储的只能是字符串,另外他们的rehash的方式不一样,java的hashmap是一次性全部rehash,在元素很多时,是很耗时的操作,redis为了不堵塞服务,提高性能,采用的是渐进式rehash策略。

redis在rehash时会保留新旧两个hash结构,在查询时会从两个结构中查询,后续一点点的将旧hash的内容迁移到新hash上,当最后一个元素迁移完成,替代旧hash,内存被回收。

hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。

set(集合)

Redis的集合相当于java语言中的hashSet,内部的键值对是无序的唯一的,它的内部实现相当于一个特殊的字典,字典中的所有value都是null。

set集合可以用来存储中将用户,这样就确保不会重复。

zset(有序集合)

有序集合是最有特色的数据结构,类似于java的sortedSet和hashmap的结合体。一方面是一个set保证内部value的唯一性,另一方面对每个值赋予一个score,代表这个值的权重排序。内部使用的是一种叫做跳跃列表的数据结构。

zset的最后一个元素被移除后,数据结构自动删除,内存被回收。

以上是Redis的基本数据结构类型,后面给大家分享一下redis的高级用法。

原文地址:https://www.cnblogs.com/lonelyxmas/p/12515044.html

时间: 2025-01-02 07:25:47

2.【Redis系列】Redis基础数据结构的相关文章

一、redis系列之基础知识与centos下环境搭建

1. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. Redis支持数据的备份,即master-slave模式的数据备份. 2. Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行. 3.Redis支持五种数据类型:string(

Redis:几种基础数据结构和操作(1)

一.键 是否存在exists 删除del 设置过期时间expire expireat pexpire pexpireat 设置永不过期persist 重命名rename renamenx 查询过期时间ttl 查询类型type 序列化dump 反序列化restore 排序sort 二.字符串String 增加set setnx setex 获取get mget 自增incr incrby incrfloat.自减decr decrby 批量增加mset 子字符串getrange 字符串长度strl

Redis系列---redis简介01

一. 本章我们将用简短的几句话来帮助你快速的了解什么是redis,初学者不必深究 1 Redis简介 Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写.支持网络.基于内存亦可持久化的日志型.key-value数据库,并提供多种语言的API 它通常被称为数据结构服务器,因为值value可以是字符串String,哈希Map,列表list,集合set和有序集合sorted set等类型 2 Redis特点 2.1优点: 1.支持多种数据结构,如 Str

Nosql技术--redis系列--redis的数据类型 及相应的命令--String类型

1:redis的官方网站地址是:http://www.redis.com 在线redis命令运行测试地址:http://try.redis.io/ 2:redis的数据类型有5种:String .Hash .Set.List.SortedSet String 类型 1)String是二进制安全的 (1):set 表示设置key和value eg :> set name lusy ok >get name lusy 注意:redis中同一个name对应的value是一样的 (2)setnx:设置

redis 基础数据结构实现

参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己的底层数据结构:动态字符,双端链表,字典,压缩列表,整数集合和跳跃表等.通过这些数据结构,redis构造出字符串对象,列表对象,哈希对象,集合对象和有序集合对象这5种我们常用的数据结构.接下来将从底层数据结构开始,一步步介绍redis的数据结构的实现 动态字符串 在redis中并没有使用c语言原生的

深入剖析Redis系列(四) - Redis数据结构与全局命令概述

前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. 接下来的几篇文章,将从如下几个方面介绍 Redis 的几种数据结构,命令使用及其应用场景. 预备知识:几个简单的 全局命令,数据结构 和 内部编码,单线程命令 处理机制分析. 数据结构特性:5 种 数据结构 的特点.命令使用.应用场景. 数据管理:键管理.遍历键.数据库管理. 正文 1. 预备知识

深入剖析Redis系列:Redis数据结构与全局命令概述

前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. 接下来的几篇文章,将从如下几个方面介绍 Redis 的几种数据结构,命令使用及其应用场景. 预备知识:几个简单的 全局命令,数据结构 和 内部编码,单线程命令 处理机制分析. 数据结构特性:5 种 数据结构 的特点.命令使用.应用场景. 数据管理:键管理.遍历键.数据库管理. 正文 1. 预备知识

Redis系列(二):Redis的5种数据结构及其常用命令

上一篇博客,我们讲解了什么是Redis以及在Windows和Linux环境下安装Redis的方法, 没看过的同学可以点击以下链接查看: Redis系列(一):Redis简介及环境安装. 本篇博客我们来讲解下Redis的5种数据结构及其常用命令,5种数据结构分别为: 字符串String 列表List 集合Set 散列Hash 有序集合ZSet 注意事项:Redis可以存储键(key)值(value)对的映射,其中键(key)一直是String,而值可以是上面提到的5种数据结构中的一种. 1. 字符

Redis系列之(一)——开发基础

转:https://www.jianshu.com/p/7b5a82d9cceb 一.安装与配置 #将Redis的相关运行文件放到/usr/local/bin/下,这样就可以在任意目录下执行Redis的命令 #启动 redis-server /opt/redis/redis.conf #命令行客户端 redis-cli -h 127.0.0.1 -p 6379 #停止服务,nosave|save参数表示是否关闭前生成持久化文件 redis-cli shutdown nosave|save ima