Python--Redis实战:第一章:初识Redis:第二节:Redis数据结构简介

news/2024/11/9 19:37:11
上一篇文章: Python--Redis实战:第一章:初识Redis:第一节:Redis简介
下一篇文章: Python--Redis实战:第一章:初识Redis:第三节:你好Redis-文章投票试炼

Redis可以存储键与5种不同的数据结构类型之间的映射,这5中数据结构类别分别是:STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZZET(有序集合)。

大部分程序员应该都不会对STRING、LIST、HASH这三种结构感到陌生,因为他们和很多编程语言内建的字符串、列表和散列等结构在实现和语义(semantics)方面都非常类似。有些编程语言还有集合数据结构,在实现和语义上类似于Redis的SET。ZSET在某种程度上是一种Redis特有的结构,但是当你熟悉它之后,就会发现它也是一种非常有用的结构。下表对比了Redis提供的5种结构,说明了这些结构存储的值,并简单介绍了他们的语音。

结构类型结构存储的值结构的读写能力
STRING可以是字符串、整数、浮点数对整个字符串或者字符串的其中一部分执行操作,对整数或浮点数执行自增(increment)或者自减(decrement)操作。
LIST一个链表,链表上的每个节点都包含了一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或则移除元素。
SET包含字符串的无序收集器(unordered collection),并且被包含的每个字符串都是独一无二、各不相同添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合中随机获取元素
HASH包含键值对的无序散列表添加、获取、移除单个键值对;获取所有键值对。
ZSET(有序集合)字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、删除单个元素;根据分值范围(range)或者成员来获取元素。

字符串

Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常类似。

字符串拥有一些和其他键值存储相似的命令,例如:GET(获取值)、SET(设置值)和DEL(删除值)。

下表展示了字符串的基本命令:

命令行为
GET获取存储在给定键中的值
SET设置存储在给定键中的值
DEL删除存储在给定键中的值(这个命令可以用于所有类型)
实例:SET、GET、DEL使实例
import redis #导入redis包包

#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)
print(r.set("Hello","World"))#SET命令执行成功,会返回OK,在Python中返回True

print(r.get("Hello")) #获取指定键【Hello】对应的值

r.delete("Hello") #删除

print(r.get("Hello"))

结果

True
b'World'
None

列表

Redis对链表(linked-list)结构的支持使得它在键值存储的世界中独树一帜,一个列表结构可以有序的存储多个字符串。

Redis列表可执行的操作和很多编程语言里面的列表操作非常相似,下标列出了列表命令:

命令行为
RPUSH将给定值推入列表的右端
LPUSH将给定值推入列表的左端
LRANGE获取列表在给定范围内的所有值
LINDEX获取列表在给定位置上的单个元素
LPOP从列表的左端弹出一个值,并返回被弹出的值
RPOP从列表的右端弹出一个值,并返回被弹出的值
实例:
import redis #导入redis包包

#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)

r.delete("list-key")

print(r.rpush("list-key","item1")) #向列表推入新的元素,语句返回列表执行该语句后的长度
print(r.rpush("list-key","item2")) #向列表推入新的元素,语句返回列表执行该语句后的长度

print(r.lrange("list-key",0,-1)) #0为起始索引,-1表示列表结束索引,这样就可以取出列表的所有元素

print(r.lindex("list-key",1)) #lindex取出单个元素

结果

1
2
[b'item1', b'item2']
b'item2'

集合

Redis的集合和列表都可以存储多个字符串,他们的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串都是各不相同的。

因为Redis的集合使用无序(unordered)方式存储元素,所以不能像使用列表那样,将元素推入集合的某一端,或者从集合的某一端弹出元素。

下表列出了集合的命令:

命令行为
sadd将给定元素添加到集合
smembers返回集合包含的所有元素,如果集合包含的元素非常多,那么该命令的执行速度可能会很慢
sismember检查给定元素是否存在于集合中
srem如果给定集合存在于集合中,那么移除这个元素
实例:
import redis #导入redis包包

#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)

r.delete("set-key")

print(r.sadd("set-key","item1")) #向集合中添加新的元素,语句返回1表示这个元素被成功添加到集合中,返回0则表示这个元素已经存在集合中
print(r.sadd("set-key","item2")) #向集合中添加新的元素,语句返回1表示这个元素被成功添加到集合中,返回0则表示这个元素已经存在集合中
print(r.sadd("set-key","item3")) #向集合中添加新的元素,语句返回1表示这个元素被成功添加到集合中,返回0则表示这个元素已经存在集合中

print(r.sadd("set-key","item3")) #向集合中添加新的元素,语句返回1表示这个元素被成功添加到集合中,返回0则表示这个元素已经存在集合中

print(r.smembers("set-key")) #返回集合包含的所有元素

print(r.sismember("set-key","item1")) #判断一个元素是否存在于集合汇总
print(r.sismember("set-key","item4")) #判断一个元素是否存在于集合汇总

print(r.srem("set-key","item1")) #如果指定元素在集合中存在,就移除,结果返回移除元素的数量
print(r.srem("set-key","item4")) #如果指定元素在集合中存在,就移除,结果返回移除元素的数量

print(r.smembers("set-key")) #返回集合包含的所有元素

结果:

1
1
1
0
{b'item2', b'item3', b'item1'}
True
False
1
0
{b'item2', b'item3'}

散列

Redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串也可以是数字值,并且同样可以对散列存储的数字值执行自增操作或者自减操作。

下表列出了散列的命令:

命令行为
hset在散列里面关联给定的键值对
hget获取指定散列键的值
hgetall获取散列包含的所有键值对
hdel如果给定键存在于散列中,那么移除这个键
实例:
import redis #导入redis包包

#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)

r.delete("hash-key")

print(r.hset("hash-key","sub-key1","value1")) #如果返回1,表示散列中不存在该键值对,返回0表示存在该键值对
print(r.hset("hash-key","sub-key2","value2")) #如果返回1,表示散列中不存在该键值对,返回0表示存在该键值对
print(r.hset("hash-key","sub-key1","value1")) #如果返回1,表示散列中不存在该键值对,返回0表示存在该键值对

print(r.hgetall("hash-key"))


print(r.hdel("hash-key","sub-key1")) #如果存在,就删除返回1,不存在返回0
print(r.hdel("hash-key","sub-key3")) #如果存在,就删除返回1,不存在返回0

print(r.hget("hash-key","sub-key2"))

print(r.hgetall("hash-key"))

结果:

1
1
0
{b'sub-key1': b'value1', b'sub-key2': b'value2'}
1
0
b'value2'
{b'sub-key2': b'value2'}

有序集合

有序集合和散列一样,都用于存储键值对:有序集合的键被称为【成员】(member),每个成员都是各不相同的;而有序集合的值则被称为【分值】(score),分值必须为浮点数。

有序集合是Redis里面唯一一个既可以根据成员访问元素(这一点和散列表一样),又可以根据分值以及分值的排列顺序来访问元素的结构。

下表列出了有序集合的命令

命令行为
zadd将一个带有给定分值的成员添加到有序集合里面
zrange根据元素在有序排列中所处的位置,从有序集合里面获取多个元素。
zrangebyscore获取有序集合在给定分值范围内的所有元素
zrem如果给定元素存在于有序集合,那么移除这个成员。
实例:
import redis #导入redis包包

#与本地redis进行链接,地址为:localhost,端口号为6379
r=redis.StrictRedis(host='localhost',port=6379)

r.delete("zset-key")

print(r.zadd("zset-key",7,"member1")) #返回添加元素的数量
print(r.zadd("zset-key",9,"member2")) #返回添加元素的数量
print(r.zadd("zset-key",8,"member3")) #返回添加元素的数量
print(r.zadd("zset-key",7,"member3")) #返回添加元素的数量,如果存在就覆盖值


print(r.zrange("zset-key",0,-1)) #h获取有序集合所包含的所有元素,多个元素或安装分值大小进行排序

print(r.zrangebyscore("zset-key",0,7)) #根据分值来获取集合中的一部分元素

print(r.zrem("zset-key","member1")) #返回移除元素的数量

print(r.zrange("zset-key",0,-1)) #h获取有序集合所包含的所有元素,多个元素或安装分值大小进行排序



结果:

1
1
1
0
[b'member1', b'member3', b'member2']
[b'member1', b'member3']
1
[b'member3', b'member2']
上一篇文章: Python--Redis实战:第一章:初识Redis:第一节:Redis简介
下一篇文章: Python--Redis实战:第一章:初识Redis:第三节:你好Redis-文章投票试炼

http://www.niftyadmin.cn/n/3843822.html

相关文章

pytest 参数化

import pytesttest_datas [(11, 22, 33),(22, 33, 55)]datas_dict [{"a": 1, "b": 2, "c": 3},{"a": 11, "b": 22, "c": 33},{"a": 111, "b": 222, "c": 333},]# 方式一:直接写p…

Linux 系统管理员安全指南

本文从系统管理员的角度讨论安全问题。系统管理员是管理系统的人:启动系统,停止系统运行,安装新软件,增加新用户,删除老用户,以及完成保持系统发展和运行的日常事务工作。 1.安全管理 安全管理主要分为四个…

跳跃游戏(力扣)贪心 JAVA

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums [2,3,1,1,4] 输出:true 解释:可以先跳 1 步…

如何将QQ音乐SQ品质FLAC格式转换成MP3音乐

相信腾讯公司旗下的QQ音乐大家都应该用过吧,QQ音乐客户端中有很多实用的功能,比如:可以将音乐传到手机上,可以制作铃声,可以自定义皮肤,还可以将音乐保存到腾讯微云中。当然,QQ音乐还可以设置音…

软件测试中的回归测试用例选择方法

回归测试就是修改完bug后对程序的新一轮测试,根据微软的统计,按照他们的经验,一般 开发人员解决3~4个bug会衍生出一个新的bug,这就是必须作回归测试的原因。 一般的软件测试流程是后期快速迭代的,bug在后期是快速收敛…

linux7.0内核升级

内核升级 在指定地址下载或者在线升级内核,要求新内核默认启动。 http://ldap.example.com/pub/kernel-3.10.0-123.1.2.el7.x86_64.rpm 最好使用命令: wget http://ldap.example.com/pub/kernel-3.10.0-123.1.2.el7.x86_64.rpm 注意:使用wget…

通过反射找到并执行方法

需求是通过传入方法的名字&#xff0c;执行该方法&#xff0c;所有的方法都是传入一个model参数&#xff0c;但model的类型不一样。 通过上网查资料&#xff0c;整理了一下&#xff0c;具体代码如下&#xff1a; /// <summary>/// 执行方法(方法类型需要是公共的)/// <…

001 内联函数

//透彻了解inlining的里里外外 //inline函数看起来像函数&#xff0c;行为像函数&#xff0c;比宏好得多&#xff0c;可以免除调用函数的开销。//过度使用inline函数&#xff0c;导致程序体积过大&#xff0c;代码膨胀导致额外的换页行为&#xff0c;降低指令高速缓存的击中率。…