前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Redis】Redis中5种基础数据结构以及相应的命令行和Python数据操作

【Redis】Redis中5种基础数据结构以及相应的命令行和Python数据操作

作者头像
活用数据
发布2022-03-29 19:56:38
1.4K0
发布2022-03-29 19:56:38
举报
文章被收录于专栏:数据医生专栏数据医生专栏

本文主要介绍了Redis中5种基本的数据结构,以及相应的数据操作命令。

Redis基本数据结构

Redis是键值对(Key-Value)存储的非关系型数据库,存储形式可以类比Python中的字典。

其中,键的类型是字符串,而值的类型常见的有以下5种:

  • 字符串(String)
  • 哈希(Hash)
  • 列表(List)
  • 集合(Set)
  • 有序集合(Sorted Set)

数据库操作命令

在介绍5种基本数据结构之前,先简单了解一下Redis数据库的基本操作。

安装配置好的Redis,默认是有16个数据库的,而且,这16个数据库的名称是由0-15命名的,我们可以通过以下命令进行查询数据库数量:

代码语言:javascript
复制
CONFIG GET databases

默认情况下,我们选中的是0 数据库,可以通过以下命令进行切换:

代码语言:javascript
复制
SELECT db

可以看到,我们成功切换到1数据库:

Python连接Redis数据库

讲完Redis数据库的简单操作,我们先讲解一下如何通过Python连接Redis数据库,方便后面对命令行操作Redis和Python操作Redis进行对比。

Pyton连接Redis服务也非常简单,只需要通过redis.StrictRedis方法即可:

代码语言:javascript
复制
import redis

# 如果有设置redis密码,那么在连接时则需要传入"password"参数
r = redis.StrictRedis(host='localhost', port=6379, db=1)

可以看到,我们不仅成功的连接上了Redis,同时还选择了1数据库:

接下来我们开始介绍Redis的5种基本数据结构。

String 字符串

简介

字符串的特性:

  • string是redis最基本的类型;
  • 最大能存储512MB的数据;
  • string类型是二进制安全的,即可以为任何数据,比如数字、图片、序列化对象等。

数据操作

新增(插入数据)

设置键值:

代码语言:javascript
复制
SET key value

设置key=name, value="data"

同时设置多个键值:

代码语言:javascript
复制
MSET key value [key value ...]

设置k1:v1, k2:v2, k3:v3共3对键值对:

查询

接下来查询一下刚刚新增的数据。

根据键获取值:

代码语言:javascript
复制
GET key

如果不存在此键则返回nil

同时根据多个键获取多个值:

代码语言:javascript
复制
MGET key [key ...]

更新

追加值(在字符串后面增加):

代码语言:javascript
复制
APPEND key value

往刚刚名称为name的key后面添加字符串,并查询修改结果:

GETSET:获取旧值并设置新值。

GETSET命令就像GET命令和SET命令的组合版本,GETSET首先获取字符串键目前已有的值,接着为键设置新值,最后把之前获取到的旧值返回给用户:

代码语言:javascript
复制
GETSET key new_value

把“12”替换成“123”:

运算

前提要求:值是数字的才可以进行运算操作。

将key对应的value加1:

代码语言:javascript
复制
INCR key

将key对应的value加整数increment:

代码语言:javascript
复制
INCRBY key increment

先设置number=1,然后再分别+1+10

将key对应的value减1:

代码语言:javascript
复制
DECR key

将key对应的value减整数decrement:

代码语言:javascript
复制
DECRBY key decrement

操作同加法,不再进行演示。

其他操作

获取字符串值的字节长度:

代码语言:javascript
复制
STRLEN key

查询刚刚修改后的number的值的长度:

Python操作

新增和查询键值对:

代码语言:javascript
复制
r.set("number", 123)  # 新增键值对
r.get("number")  # 查询键

Output:

代码语言:javascript
复制
b'123'

多键值对的同时操作:

代码语言:javascript
复制
r.mset({"k1": 1, "k2": "2"})  # 注意:多对键值对需要以字典形式传入
r.mget(["k1", "k2"])

Output:

代码语言:javascript
复制
[b'1', b'2']

键命令

主要介绍跟键key相关的一些常用命令。

查找键,参数支持正则:

代码语言:javascript
复制
KEYS pattern

判断键是否存在,如果存在返回1,不存在返回0:

代码语言:javascript
复制
EXISTS key [key ...]

查看键对应的value的类型:

代码语言:javascript
复制
TYPE key

可以看到,number虽然是可以进行运算的,但是实际上还是以“string”形式进行存储的:

删除键及对应的值:

代码语言:javascript
复制
DEL key [key ...]

删除k1及对应的值:

设置键值对的过期时间(以秒为单位):

创建时没有设置过期时间则一直存在,直到使用DEL移除。

代码语言:javascript
复制
EXPIRE key seconds

查看有效时间(以秒为单位):

代码语言:javascript
复制
TTL key

Hash 哈希/散列

简介

Hash用于存储对象,对象的格式为键值对,可以类比为Pyton中的字典嵌套字典。

数据操作

新增(插入数据)

同时设置一个或多个属性:

代码语言:javascript
复制
HSET key field value [field value ...]


# 可以理解为下面这种结构
key: {
  field: value
}

查询

获取一个属性的值:

代码语言:javascript
复制
HGET key field

获取多个属性的值:

代码语言:javascript
复制
HMGET key field [field ...]

注意这里的查询和string类型不同,需要具体到属性名:

获取所有属性:

代码语言:javascript
复制
HKEYS key

获取所有值:

代码语言:javascript
复制
HVALS key

获取所有属性和对应值:

代码语言:javascript
复制
HGETALL key

获取属性的个数:

代码语言:javascript
复制
HLEN key

获取属性的长度:

代码语言:javascript
复制
HLEN key

判断属性是否存在:

代码语言:javascript
复制
HEXISTS key field

删除

删除属性及对应值:

代码语言:javascript
复制
HDEL key field [field ...]

Python操作

代码语言:javascript
复制
# 一次设置多个属性
r.hset('student', mapping={"name": "xiaoming", "age": 18})

# 一次查询一个属性
r.hget('student', 'name')

# 一次查询多个属性
r.hmget('student', ['name', 'age'])

List 列表

简介

列表特性:

  • 列表的元素类型为string;
  • 按照插入顺序排序;
  • 可在列表的头部或者尾部添加元素。

数据操作

新增

插入数据:

代码语言:javascript
复制
# 在头部(左边)插入数据
LPUSH key value [value ...]

# 在尾部(右边)插入数据
RPUSH key value [value ...]

注意最终列表元素的顺序,LPUSH越晚插入的排在越前面:

在一个元素的前|后插入新元素:

代码语言:javascript
复制
LINSERT key BEFORE|AFTER pivot value

s1前面插入s0

设置指定索引的元素值:

说明:索引从0开始,负数表示从尾部开始。

代码语言:javascript
复制
LSET key index value

把索引0位置的元素替换为“s5”:

查询

返回存储在 key 的列表里指定范围内的元素:

代码语言:javascript
复制
LRANGE key start stop

-1表示最后一位元素,所以0 -1表示获取所有元素,这一点和Python的列表一样。

返回列表里索引对应的元素:

代码语言:javascript
复制
LINDEX key index

返回存储在 key 里的list的长度:

代码语言:javascript
复制
LLEN key

更新

裁剪列表,改为原集合的一个子集,相当于Python中列表进行了切片和重新赋值两个操作:

代码语言:javascript
复制
LTRIM key start stop

删除

移除第一个元素:

代码语言:javascript
复制
# 移除并且返回 key 对应的 list 的第一个元素(左边第一个元素)
LPOP key

# 移除并返回存于 key 的 list 的最后一个元素(右边第一个元素)
RPOP key

移除所有元素:

说明:只要start的数值比end的数值大即可,且要求数值都为正数。

代码语言:javascript
复制
LTRIM key 1 0

Python操作

从左边插入一个元素:

代码语言:javascript
复制
r.lpush("list0", "s1")
r.lrange("list0", 0, -1)

Output:

代码语言:javascript
复制
[b's1']

从右边插入一个元素:

代码语言:javascript
复制
r.rpush("list0", "s2")
r.lrange("list0", 0, -1)

Output:

代码语言:javascript
复制
[b's1', b's2']

Set 无序集合

简介

Set的特性:

  • 没有顺序;
  • 元素为string类型;
  • 元素具有唯一性,不重复(这一点类似Python的set)。

数据操作

新增

添加元素:

代码语言:javascript
复制
SADD key member [member ...]

查询

返回集合所有的元素:

代码语言:javascript
复制
SMEMBERS key

返回集合元素个数(长度):

代码语言:javascript
复制
SCARD key

计算

先准备好两个集合:

代码语言:javascript
复制
# set0
("s1", "s2")

# set1
("s2", "s3", "s4")

交集:

代码语言:javascript
复制
SINTER key [key ...]

差集:

代码语言:javascript
复制
SDIFF key [key ...]

并集:

代码语言:javascript
复制
SUNION key [key ...]

判断元素是否在集合中:

代码语言:javascript
复制
SISMEMBER key member

Python操作

添加元素:

代码语言:javascript
复制
r.sadd("set0", "s1", "s2")
r.smembers("set0")

Output:

代码语言:javascript
复制
{b's1', b's2'}

计算集合:

代码语言:javascript
复制
r.sinter("set0", "set1")  # 交集
r.sdiff("set0", "set1")  # 差集
r.sunion("set0", "set1")  # 并集

Sorted Set 有序集合

简介

Sorted Set的特性:

  • 元素为string类型;
  • 元素具有唯一性,不重复;
  • 元素之间有序,每个元素都会关联一个double类型的score,表示权重,通过权重将元素从小到大排序,不同元素之间的权重可以相同。

数据操作

新增

添加(score参数表示顺序,数字越小,排名越前):

代码语言:javascript
复制
ZADD key score member [score member ...]

查询

返回指定范围内的元素:

代码语言:javascript
复制
# 增加 [WITHSCORES] 参数能同时显示权重和元素
ZRANGE key start stop [WITHSCORES]

新增zset0并且查询所有元素,同时插入两个score相同的ab,可以看到成功的插入了3个元素:

返回元素个数:

代码语言:javascript
复制
ZCARD key

返回有序集key中,score值在minmax之间的成员个数:

代码语言:javascript
复制
ZCOUNT key min max

返回有序集key中,指定成员memberscore值:

代码语言:javascript
复制
ZSCORE key member

Python操作

和命令行输入的命令相同,新增一个有序集合,并进行查询:

代码语言:javascript
复制
# 插入元素以字典形式表示,key对应元素,value对应score
r.zadd("zset0", {"a": 1, "b": 1, "c": 2})
r.zrange("zset0", 0, -1, withscores=True)

Output:

代码语言:javascript
复制
[(b'a', 1.0), (b'b', 1.0), (b'c', 2.0)]

小结

至此,Redis中最基础的数据结构我们已经介绍完毕,最后总结一下文章介绍的所有内容:

  • 常用键命令;
  • Python连接和操作Redis数据库;
  • 5种基本的数据结构:字符串、哈希、列表、无序集合和有序集合,及其相应的数据操作命令。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022.03.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis基本数据结构
  • 数据库操作命令
  • Python连接Redis数据库
  • String 字符串
    • 简介
      • 数据操作
      • 键命令
      • Hash 哈希/散列
        • 简介
          • 数据操作
          • List 列表
            • 简介
              • 数据操作
              • Set 无序集合
                • 简介
                  • 数据操作
                  • Sorted Set 有序集合
                    • 简介
                      • 数据操作
                      • 小结
                      相关产品与服务
                      云数据库 Redis
                      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档