当前位置: 代码网 > it编程>数据库>Redis > Redis键值存储的实现示例

Redis键值存储的实现示例

2026年08月31日 Redis 我要评论
一、redis数据类型概述首先要强调一点:redis是key value类型的数据库,redis所说的数据类型都是key value中的value的数据结构, 而key都是字符串。常用数据类型redi

一、redis数据类型概述

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

常用数据类型

redis中有经常使用的有五大数据类型,分别是——string(字符串),hash(哈希),list(列表),set(集合)、zset(有序集合)

string

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

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

string类型是redis最基本的数据类型,一个redis中字符串value最多可以是512m。

list

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

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

hash

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

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

set

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

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

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

zset

redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员

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

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

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

扩展数据类型

随着 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是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。

示例如下图:

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

hyperloglog

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

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

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

geo

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

bitfield

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

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

stream

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

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

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

二、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键值存储内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com