【Redis】Redis键值存储

2024-05-15 14:20
文章标签 redis 存储 键值

本文主要是介绍【Redis】Redis键值存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪

在这里插入图片描述

文章目录

  • Redis键值概述
    • 一、Redis数据类型概述
      • 常用数据类型
        • String
        • List
        • Hash
        • Set
        • Zset
      • 扩展数据类型
        • BitMap
        • HyperLogLog
        • GEO
        • BitField
        • Stream
    • 二、Redis键(key)操作
      • 常用操作及示例
        • keys *
        • exists key
        • type key
        • del key
        • unlink key
        • ttl key
        • expire key seconds
        • move key dbindex
        • select dbindex
        • dbsize
        • flushdb
        • flushall
      • 常用操作汇总
  • 总结

Redis键值概述


一、Redis数据类型概述


首先要强调一点:Redis是key value类型的数据库,Redis所说的数据类型都是key value中的value的数据结构,key都是字符串。

常用数据类型

Redis中有经常使用的有五大数据类型,分别是——String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)

image-20240510193727202
String

String是redis最基本的类型,一个key对应一个value。

String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如jpg图片或者序列化的对象 。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

image-20240514151952654

List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

List中最多可以最多可以包含 2 32 − 1 2^{32} - 1 2321 个元素 (4294967295, 每个列表超过40亿个元素)。

image-20240514152644796

Hash

Redis Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,Hash 特别适合用于存储对象。

Redis 中每个 Hash 可以存储 2 32 − 1 2^{32} - 1 2321 键值对 (4294967295, 每个哈希结构可存储40多亿个元素)。

image-20240514153315227

Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中Set集合是通过哈希表实现的(这里先这样认为),所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 2 32 − 1 2^{32} - 1 2321​ (4294967295, 每个集合可存储40多亿个成员)。

image-20240514153617056

Zset

Redis Zset 和 Set 一样也是String类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序

Zset的成员是唯一的,但分数(score)却可以重复。

Zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2 32 − 1 2^{32} - 1 2321

image-20240514153641446

扩展数据类型

随着 Redis 版本的更新,后面又支持了五种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8.9 版本新增)、GEO(3.2 版新增)、BitField(3.2 版新增)、Stream(5.0 版新增)

BitMap

Redis中的BitMap不是一个独立的数据类型,而是基于String类型实现的一种特殊的数据结构。BitMap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。

BitMap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行 0|1 的设置,表示某个元素的值或者状态,时间复杂度为O (1)。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。

示例如下图:

image-20240514165831743

Redis的BitMap实际上是利用String类型的最大容量(512 MB)存储一个连续的二进制序列,其中每个字节的8位可以分别代表8个独立的状态。这意味着你可以用一个BitMap来跟踪多达数百万甚至数十亿的状态,只要状态总数不超过,即大约 2 32 2^{32} 232

image-20240514165524982

HyperLogLog

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2 64 2^{64} 264 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

image-20240514170440732

GEO

Redis的GEO类型主要用于存储地理位置信息,并对存储的信息进行操作。GEO实际上是一种有序集合(zset),它的每个元素都包含三个属性:经度(longitude)、纬度(latitude)和位置名称(member)。通过这些属性,我们可以在Redis中存储地理位置的坐标,并对它们进行一些有用的操作。

image-20240514170802582

BitField

Redis的BITFIELD命令可以将一个Redis字符串看作是一个由二进制位组成的数组,并对这个数组中任意偏移进行访问。BITFIELD命令的作用在于它能够将很多小的整数储存到一个长度较大的位图中,又或者将一个非常庞大的键分割为多个较小的键来进行储存,从而非常高效地使用内存,使得Redis能够得到更多不同的应用,特别是在实时分析领域。

说白了就是通过BITFIELD命令我们可以一次性对多个比特位域进行操作。

image-20240514170821429

Stream

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。

而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失

image-20240514170841776


二、Redis键(key)操作


常用操作及示例

keys *

查看当前库的所有key

示例如下:

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"

exists key

检查key是否存在,存在返回1,不存在返回0

示例如下:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k3
(integer) 0

type key

返回key的类型

示例如下:

127.0.0.1:6379> type k1
string

del key

删除一个或多个key

示例如下:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

unlink key

非阻塞删除一个或多个key,并异步释放和key相关的内存;返回1表示删除成功,返回0表示删除失败

示例如下:

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> unlink k1 
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

ttl key

获取key的剩余过期时间,单位为秒;-1表示永不过期,-2表示已过期

示例如下:

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 设置过期时间为10s
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2

expire key seconds

设置key的过期时间,单位为秒;返回1表示设置成功,返回0表示设置失败

自Redis 7.0,expire支持如下参数:

  • NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
  • XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
  • GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
  • LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)

可选参数这里先不做演示,有兴趣的小伙伴可以自己去尝试。

示例如下:

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 设置过期时间为10s
(integer) 1 # 1表示成功,0表示失败
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2

Redis 的过期时间设置有四种形式:

  • EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。

  • PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。

  • EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。

  • PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。


move key dbindex

将当前数据库的key移动到给定的数据库dbindex(0~15)。

Redis支持多个数据库,每个数据库都是一个独立的键值空间,这意味着同一个Redis实例中的不同数据库可以拥有相同的key。在某些情况下,我们可能需要将一个key从一个数据库移动到另一个数据库。

示例如下:

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> move k1 13
(integer) 1

select dbindex

切换到指定的数据库dbindex(0~15),默认为0。

示例如下:

127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k2"

dbsize

返回当前数据库的key的总数

示例如下:

127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> dbsize
(integer) 1

flushdb

删除当前数据库中的所有Key,不会影响其他库

示例如下:

127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> flushdb
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 不影响其他库
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

flushall

删除所有数据库中的所有Key

示例如下:

127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k3"
2) "k4"
127.0.0.1:6379[13]> flushall
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 0和13号数据库中的数据都被清除了
OK
127.0.0.1:6379> keys *
(empty array)

常用操作汇总

命令描述
keys *查看当前库的所有key
exists key检查key是否存在,存在返回1,不存在返回0
type key返回key的类型
del key删除一个或多个key
unlink key删除一个或多个key,并异步释放和key相关的内存
ttl key获取key的剩余过期时间,单位为秒;-1表示永不过期,-2表示已过期。
expire key seconds设置key的过期时间,单位为秒
move key dbindex将当前数据库的key移动到给定的数据库dbindex
select dbindex切换到指定的数据库dbindex
dbsize返回当前数据库的key的总数
flushdb删除当前数据库中的所有Key
flushall删除所有数据库中的所有Key

这里补充一点,Redis中的操作一般是1代表操作执行成功,0代表操作执行失败。


总结


在本文中,我们对Redis的键值存储进行了全面的概述和介绍。首先,我们了解了Redis的五大基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Zset(有序集合),并探讨了它们各自的特点和用法。随后,我们介绍了五种扩展数据类型:BitMap、HyperLogLog、GEO、BitField和Stream,以及它们在实际应用中的用途和优势。

在键(key)操作方面,我们涵盖了常用的操作,包括查看、检查、删除、移动、切换数据库以及设置过期时间等。这些操作丰富了我们对Redis数据管理的理解,使我们能够更有效地管理和操作Redis中的数据。

通过本文的学习,读者可以更加深入地了解Redis的键值存储特性,为其在实际应用中的使用提供了更多的参考和指导。Redis作为一款高性能的键值存储数据库,在各种场景下都具有广泛的应用前景,希望本文能为读者在Redis的学习和应用上提供一些帮助和启发。


如果讲解有不对之处还请指正,我会尽快修改,多谢大家的包容。

如果大家喜欢这个系列,还请大家多多支持啦😋!

如果这篇文章有帮到你,还请给我一个大拇指 👍和小星星 ⭐️支持一下白晨吧!喜欢白晨【Redis】系列的话,不如关注👀白晨,以便看到最新更新哟!!!

这篇关于【Redis】Redis键值存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992052

相关文章

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

为什么要做Redis分区和分片

Redis分区(Partitioning)和分片(Sharding)是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因: 1. **提高吞吐量**:    - 通过将数据分散到多个节点,可以并行处理更多的操作,从而提高整体吞吐量。 2. **内存限制**:    - 单个Redis实例的内存是有限的。分区允许数据

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的,那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的? 这时候我们经常会得到沉默,所以对于这道题,笔者会直接通过3.0.0源码分析的角度来剖析一下redis单线程的设计与实现。 Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源

Redis-在springboot环境下执行lua脚本

文章目录 1、什么lua2、创建SpringBoot工程3、引入相关依赖4、创建LUA脚本5、创建配置类6、创建启动类7、创建测试类 1、什么lua “Lua”的英文全称是“Lightweight Userdata Abstraction Layer”,意思是“轻量级用户数据抽象层”。 2、创建SpringBoot工程 3、引入相关依赖 <?xml version

mysql中存储过过程和游标的联合使用

1.SQL如下: DELIMITER //DROP PROCEDURE IF EXISTS PrintAllEmployeeNames5;CREATE PROCEDURE PrintAllEmployeeNames5()BEGINDECLARE error_count INT DEFAULT 0;DECLARE num INT ;DECLARE done INT DEFAULT

redis切换数据库的方法【jedis】

package com.test;import redis.clients.jedis.Jedis;public class readredis {public static void main(String[] args) {// 连接本地的 Redis 服务Jedis jedis = new Jedis("127.0.0.1", 6379);jedis.select(10);String v

Redis 高性能基本操作

单元素操作是基础 单元素操作,是指每一种集合类型对单个数据实现增删改查 例如,Hash 类型的 HGET、HSET 和 HDEL,Set 类型的 SADD、SREM、SRANDMEMBER 等这些操作的复杂度由集合采用的数据结构决定,例如,HGET、HSET 和 HDEL 是对哈希表做操作,所以它们的复杂度都是 O(1)Set 类型用哈希表作为底层数据结构时,它的 SADD、SREM、SRAN

redis高级用法

redis 慢日志查询 配置参数 slowlog-log-slower-than 10000 #单位微秒 slowlog-max-len 选项指定服务器最多保存多少条慢查询日志 redis-cli slowlog get #获取慢日志1) 1) (integer) 4 # 日志的唯一标识符(uid)2) (integer) 1378781447 # 命令执

redis在window下安装

1、redis简介 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redi