百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python 常规操作 Redis(不容错过)

off999 2024-11-04 13:16 38 浏览 0 评论

今日分享主题:Python 常规操作 redis 的内容


Part1:五种数据类型

Redis 支持5种数据类型:

  • string(字符串)
  • hash(哈希)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)


1.String 字符串数据类型

String 是最常用的一种数据类型,普通的 key/value 存储都可以归为此类,即可以完全实现目前 Memcached 的功能,并且效率更高。

还可以享受 Redis 的定时持久化,操作日志及 Replication 等功能。

常用命令:

  • get
  • set
  • incr
  • decr
  • mget


2.Hash哈希数据类型

Redis hash 是一个键值(key => value)对集合。

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。


常用命令:

  • hget
  • hset
  • hgetall


应用场景:

举个实例来描述下 hash 的应用场景,比如我们要存储一个用户信息对象数据,就可以使用 Redis hash。


3.List数据类型

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

常用命令:

  • lpush(添加左边元素)
  • rpush(添加右边元素)
  • lpop(移除左边第一个元素)
  • rpop(移除右边第一个元素)
  • lrange(获取列表片段,LRANGE key start stop)


应用场景:

Redis list 的应用场景非常多,也是 Redis 最重要的数据结构之一。

比如 twitter 的关注列表,粉丝列表等都可以用 Redis 的 list 结构来实现。


4.Set 数据类型

Redis set 是 string 类型的无序集合。集合是通过 hashtable 实现的,概念和数学中的集合基本类似,可以交集,并集,差集等等,set中的元素是没有顺序的。

常用命令:

  • sadd
  • spop
  • smembers
  • sunion


应用场景:

Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的。

当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。


5.zset 有序集合数据类型

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

zadd 命令:添加元素到集合,元素在集合中存在则更新对应score。

常用命令:

  • zadd
  • zrange
  • zrem
  • zcard


使用场景:

Redis sorted set 的使用场景与 set 类似,区别是 set 不是自动有序的,而 sorted set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。


Part2:代码内容

import redis
#使用连接池方式连接redis
redis_pool=redis.ConnectionPool(host="127.0.0.1",port=6379,db=15,decode_responses=True)
redis_conn=redis.Redis(connection_pool=redis_pool)

#2.1 String字符串
#字符串数据类型的相关命令用于管理 redis 字符串值
#设置指定 key 的值
redis_conn.set("name","tony")
redis_conn.set("age",33)
redis_conn.set('strtest','{"addr":"北京good","phone":13300000000}')
#Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值
redis_conn.setnx("job","computer")
#获取指定 key 的值
print(redis_conn.get('name'))
print(redis_conn.get('age'))
print(redis_conn.get('strtest'))
#Incr 命令将 key 中储存的数字值增一
# 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作
# 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
print(redis_conn.incr("age"))
# Decr 命令将 key 中储存的数字值减一
# 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作
# 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
print(redis_conn.decr("age"))
print(redis_conn.get("job"))
#Strlen 命令用于获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误
print(redis_conn.strlen("strtest"))
print("*"*10)


#2.2 Hash哈希
#hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
#Hmget 命令用于返回哈希表中,一个或多个给定字段的值
redis_conn.hset('myhash','f1','v1')
redis_conn.hset('myhash','f2','v2')
#Hget 命令用于返回哈希表中指定字段的值,如果给定的字段或 key 不存在时,返回 None
print(redis_conn.hget("myhash","testhash"))
print(redis_conn.hmget('myhash','f1','f2'))
#Hgetall 命令用于返回哈希表中,所有的字段和值
redis_conn.hset("hashstrtest","student2",'idcard:123456,sex:man,age:33')
print(redis_conn.hgetall("hashstrtest"))
# Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中
redis_conn.hmset('hashjsontest', {'student3': '{"perform": "game","num":123456789}'})
redis_conn.hmset('jsontest',{"id":1,"name":"张三丰","birth":"2000-07-07","age":17,"clazz":"一年1班","createTm":1504856483000})
print(redis_conn.hgetall("hashjsontest"))
print(redis_conn.hgetall("jsontest"))
#获取所有哈希表中的字段
print(redis_conn.hkeys("jsontest"))
#Hvals 命令返回哈希表所有的值
print(redis_conn.hvals("jsontest"))
#获取哈希表中字段的数量
print(redis_conn.hlen("jsontest"))
print("*"*20)


#2.3 List列表
# 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边
# 将一个或多个值插入到列表头部
redis_conn.lpush("teachkey","redis")
redis_conn.lpush("teachkey","mysql")
redis_conn.lpush("teachkey","mongodb")
redis_conn.lpush("teachkey","mq")
redis_conn.lpush("teachkey","job")
#获取列表指定范围内的元素
print(redis_conn.lrange('teachkey',1,10))
#Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推
#列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回None
print(redis_conn.lindex("teachkey",-1))
#获取列表长度
print(redis_conn.llen("teachkey"))
#移出并获取列表的第一个元素
print(redis_conn.lpop("teachkey"))
#将一个或多个值插入到列表头部
print(redis_conn.lpush("teachkey","goodjob"))
print(redis_conn.lrange('teachkey',1,10))
print("*"*30)


#2.4 Set集合
#Set是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
#向集合添加一个或多个成员
redis_conn.sadd('lovekey','booking')
redis_conn.sadd('lovekey','booking')
redis_conn.sadd('lovekey','eating')
redis_conn.sadd('lovekey','runing')
redis_conn.sadd('lovekey','jumping','fishing')

redis_conn.sadd("dokey","working","thinking","runing","doing","fishing")

#Scard 命令返回集合中元素的数量,当集合 key 不存在时,返回 0
print(redis_conn.scard("lovekey"))
#Sdiff 命令返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集
print(redis_conn.sdiff("lovekey","dokey"))
#Sinter 命令返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集
print(redis_conn.sinter("lovekey","dokey"))
#Sismember 命令判断成员元素是否是集合的成员
print(redis_conn.sismember("lovekey","eating"))
#Smembers 命令返回集合中的所有的成员。 不存在的集合 key 被视为空集合
print(redis_conn.smembers("dokey"))
#Spop 命令用于移除集合中的指定 key 的一个或多个随机元素,移除后会返回移除的元素
print(redis_conn.spop("dokey",2))
#Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略,被成功移除的元素的数量,不包括被忽略的元素
print(redis_conn.srem("dokey","ok","isok","doing"))
#Sunion 命令返回给定集合的并集。不存在的集合 key 被视为空集
print(redis_conn.sunion("dokey","lovekey"))
#Sunionstore 命令将给定集合的并集存储在指定的集合 destination 中。如果 destination 已经存在,则将其覆盖,结果集中的元素数量
print(redis_conn.sunionstore("destkey","dokey","lovekey"))
print("*"*40)


#2.5  sorted set有序集合
# 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员
# 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序
# 有序集合的成员是唯一的,但分数(score)却可以重复
dict1=dict(lenovo=1)
redis_conn.zadd('computerkey',dict1)
dict2=dict(dell=2)
dict3=dict(asus=2)
redis_conn.zadd('computerkey',dict2)
redis_conn.zadd('computerkey',dict3)
dict4=dict(asustest=4,goodjob=3)
redis_conn.zadd('computerkey',dict4)
#通过索引区间返回有序集合指定区间内的成员
print(redis_conn.zrange('computerkey',0,10))
#Zcard 命令用于计算集合中元素的数量
print(redis_conn.zcard("computerkey"))
#Zscore 命令返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil
print(redis_conn.zscore("computerkey","dell"))
#Zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列
print(redis_conn.zrank("computerkey","goodjob"))
# Redis Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误, 当key存在时,返回被成功移除的成员的数量,不包括被忽略的成员
print(redis_conn.zrem("computerkey","goodjob"))


Part3:控制台输出内容

tony

33

{"addr":"北京good","phone":13300000000}

34

33

computer

41

None

['v1', 'v2']

{'student2': 'idcard:123456,sex:man,age:33'}

{'student3': '{"perform": "game","num":123456789}'}

{'id': '1', 'name': '张三丰', 'birth': '2000-07-07', 'age': '17', 'clazz': '一年1班', 'createTm': '1504856483000'}

['id', 'name', 'birth', 'age', 'clazz', 'createTm']

['1', '张三丰', '2000-07-07', '17', '一年1班', '1504856483000']

6

['mq', 'mongodb', 'mysql', 'redis']

redis

5

job

5

['mq', 'mongodb', 'mysql', 'redis']

5

{'eating', 'booking', 'jumping'}

{'fishing', 'runing'}

True

{'fishing', 'runing', 'doing', 'thinking', 'working'}

['thinking', 'working']

1

{'jumping', 'fishing', 'runing', 'booking', 'eating'}

5

['lenovo', 'asus', 'dell', 'goodjob', 'asustest']

5

2.0

3

1

相关推荐

阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?

TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...

高流量大并发Linux TCP性能调优_linux 高并发网络编程

其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...

性能测试100集(12)性能指标资源使用率

在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...

Linux 服务器常见的性能调优_linux高性能服务端编程

一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...

Nginx性能优化实战:手把手教你提升10倍性能!

关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...

高并发场景下,Spring Cloud Gateway如何抗住百万QPS?

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...

Kubernetes 高并发处理实战(可落地案例 + 源码)

目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...

高并发场景下,Nginx如何扛住千万级请求?

Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...

Spring Boot+Vue全栈开发实战,中文版高清PDF资源

SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...

Docker-基础操作_docker基础实战教程二

一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...

你有空吗?跟我一起搭个服务器好不好?

来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...

部署你自己的 SaaS_saas如何部署

部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...

Docker Compose_dockercompose安装

DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...

京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统

前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...

Kubernetes (k8s) 入门学习指南_k8s kubeproxy

Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...

取消回复欢迎 发表评论: