Python操作Redis常见类型详解

news2025/1/23 0:57:23

1、windows 上安装 Redis

便于测试,笔者在 windows 上安装 Redis

Redis 官方不建议在 windows 下使用 Redis,所以官网没有 windows 版本可以下载。微软团队维护了开源的 windows 版本,对于普通测试使用足够了。

1.1、安装包方式安装 Redis 服务

下载地址:https://github.com/MicrosoftArchive/redis/releases

下载 Redis-x64-3.0.504.msi  按提示一步步操作

或者也可以使用下面链接下载。

https://github.com/rgl/redis/downloads

下载完成之后根据引导流程安装即可。

打开 Redis 程序目录:

文件说明:

redis-server.exe:服务端程序,提供 redis 服务

redis-cli.exe: 客户端程序,通过它连接 redis 服务并进行操作

redis-check-dump.exe:RDB 文件修复工具

redis-check-aof.exe:AOF 文件修复工具

redis-benchmark.exe:性能测试工具,用以模拟同时由 N 个客户端发送 M 个 SETs/GETs 查询 (类似于 Apache 的 ab 工具)

redis.windows.conf: 配置文件,将 redis 作为普通软件使用的配置,命令行关闭则 redis 关闭

redis.windows-service.conf:配置文件,将 redis 作为系统服务的配置

单击 redis-server.exe,启动 Redis 服务。

检查 Redis 是否已连接。

客户端使用 PING 命令,返回PONG则说明正常安装。

1.2、直接解压的方式安装 redis

首先下载 redis 安装包:https://github.com/MSOpenTech/redis/releases

解压安装包到相应文件夹,任何盘符都行,例如 E:\Redis-x64-3.0.504

使用命令行启动 Redis 服务

运行 cmd,cd 进入对应目录 E:\Redis-x64-3.0.504,执行:

redis-server.exe redis.windows.conf

*注:可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了(如下截图),后面的redis.windows.conf 可以省略,如果省略,会启用默认的参数。

安装 redis 到 windows 服务

redis-server --service-install redis.windows.conf

查看 windows 服务是否加入:

这时候先关闭打开的第一个 cmd 窗口,然后执行以下命令启动再次 redis:

redis-server --service-start

停止 redis 服务:

redis-server --service-stop

测试redis 是否能够正常使用:

切换到 redis 目录下:E:\Redis-x64-3.0.504  下:

redis-cli.exe -h 127.0.0.1 -p 6379

1.3、设置密码 -

使用文本编辑器,打开Redis服务配置文件。通常为redis.windows-service.conf,而不是redis.windows.conf。后者是以非系统服务方式启动程序使用的配置文件。

找到含有requirepass字样的地方,追加一行,输入requirepass  12345。 这是访问Redis时所需的密码,一般测试情况下可以不用设定密码。建议设定一个密码。修改 requirepass 123456

E:\Redis-x64-3.0.504>redis-cli

127.0.0.1:6379> auth 123456

OK

127.0.0.1:6379> ping

PONG

127.0.0.1:6379> set name zhuling

OK

127.0.0.1:6379> get name

"zhuling"

127.0.0.1:6379> exit

2、安装redis模块

Python 使用 Redis 相对比较简单,Python 专门提供了操作 Redis 的第三方模块,即 redis 模块,该模块可以直接使用 Python 包管理工具pip来安装。

下面以 Windows 系统为例,使用包管理工具安装 redis 模块,命令如下:

python -m pip install redis

如果是 Linux 系统,需要执行以下命令来安装:

sudo pip3 install redis

如下:                                                                                                   

E:\Redis-x64-3.0.504>python -m pip install redis

DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support

Collecting redis

  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. (read timeout=15)",)': /packages/a7/7c/24fb0511df653cf1a5d938d8f5d19802a88cef255706fdda242ff97e91b7/redis-3.5.3-py2.py3-none-any.whl

  Downloading redis-3.5.3-py2.py3-none-any.whl (72 kB)

     |████████████████████████████████| 72 kB 53 kB/s

Installing collected packages: redis

Successfully installed redis-3.5.3

WARNING: You are using pip version 20.1.1; however, version 20.3.4 is available.

You should consider upgrading via the 'E:\python-2.7.18\python.exe -m pip install --upgrade pip' command.

测试是否导入成功

>>> import redis

>>> r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

>>> print(r.keys('*'))

['name']

>>> print(r.get('name'))

zhuling

>>>

3、Python 操作Redis数据库

3.1、Redis连接

redis 模块分两种连接模式:直接模式和连接池模式,都可以操作 Redis。

1) 直连模式

import redis

# 本地连接,创建数据库连接对象

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

上述代码中,db 表示当前选择的库,其参数值可以是 0-15;如果设置连接数据库的密码,那么就需要使用 password 进行验证,否则可以省略。

>>> import redis

>>> r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

>>> r.set('age',32)

True

>>> r.get('age')

'32'

>>>

2) 连接池模式

redis 模块使用 connection pool(连接池)来管理 redis server 的所有连接,每个 Redis 实例都会维护一个属于自己的连接池,这样做的目的是为了减少每次连接或断开的性能消耗。

连接池的作用:当有新的客户端请求连接时,只需要去连接池获取一个连接即可,实际上就是把一个连接共享给多个客户端使用,这样就节省了每次连接所耗费的时间。

多个 Redis 实例共享一个连接池,代码如下:

import redis

#创建连接池并连接到redis,并设置最大连接数量;

conn_pool = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=10,password='xxxx')

# 第一个客户端访问

re_pool1 = redis.Redis(connection_pool=conn_pool)

# 第二个客户端访问

re_pool2 = redis.Redis(connection_pool=conn_pool)

    ...

示例:

>>> import redis

>>> conn_pool = redis.ConnectionPool(host='127.0.0.1',port=6379,max_connections=2,password='123456')

>>> re_pool1 = redis.Redis(connection_pool=conn_pool)

>>> re_pool2 = redis.Redis(connection_pool=conn_pool)

>>> re_pool3 = redis.Redis(connection_pool=conn_pool)

>>> re_pool4 = redis.Redis(connection_pool=conn_pool)

>>> re_pool4.set('skill','sing')

True

>>> re_pool1.set('school','gzschool')

True

>>> re_pool2.set('teacher','jhon')

True

>>> re_pool3.keys('*')

['school', 'teacher', 'name', 'age', 'skill']

>>>

3.2、Python Redis常规操作

如下脚本中使用 Python 操作 Redis 数据库的通用命令。

redisty.py

#usr/bin/python

#-*- coding:utf-8 -*-

import redis

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

print(r.keys('*'))

key_list = r.keys('*')

#转换为字符串

for key in key_list:

  #查看key类型

  print(r.type(key))

  print(key.decode(),r.get(key))

# 返回值: 0 或者 1

print(r.exists('username'))

if "age" in key_list:

    r.get('age')    

    # 删除key

    r.delete('age')

    print("删除age成功")

else:

    print("不存在age键")

r.close(); 

脚本执行结果如下:

3.3、Python操作Redis字符串

Python 操作 string字符串常用方法如下:

redis-string.py

#usr/bin/python

#-*- coding:utf-8 -*-

import redis

#连接redis服务器

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

r.set('gender','female')

print(r.get('gender'))

#mset参数为字典

r.mset({'username':'fieldyang','password':'123'})

print r.mget('username','password')

#查看value长度

print r.strlen('username')

#数值操作

#redis中incr、incrby、decr、decrby属于string数据结构,它们是原子性递增或递减操作。

#incr递增1并返回递增后的结果;

#incrby根据指定值做递增或递减操作并返回递增或递减后的结果(incrby递增或递减取决于传入值的正负);

#decr递减1并返回递减后的结果;

#decrby根据指定值做递增或递减操作并返回递增或递减后的结果(decrby递增或递减取决于传入值的正负);

r.set('age','32')

print r.get('age')

r.incrby('age',5)

print r.get('age')

r.decrby('age',5)

print r.get('age')

r.incr('age')

print r.get('age')

r.decr('age')

print r.get('age')

r.incrbyfloat('age',5.2)

print r.get('age')

r.incrbyfloat('age',-10.5)

print r.get('age')

r.close(); 

脚本执行结果如下:

3.4、Python操作 Redis列表

Python 操作 list列表常用方法如下:

redis-list.py

#usr/bin/python

#-*- coding:utf-8 -*-

import redis

#建立redis连接

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

r.lpush('Database','Oracle','Mysql','Redis')

#lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 lpush 操作。 当 key 存在但不是列表类型时,返回一个错误。 lpush KEY_NAME VALUE1.. VALUEN ,返回列表的长度

r.rpush('Database','ES','Informix')

#rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。rpush KEY_NAME VALUE1..VALUEN

r.linsert('Database','before','Mysql',',Mongodb')

r.linsert('Database','after','Mysql',',DB2')

#linsert 命令用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。当列表不存在时,被视为空列表,不执行任何操作。 linsert key before|after pivot value

print(r.llen('Database'))

#Llen 命令用于返回列表的长度

print(r.lrange('Database',0,-1))

#lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 lrange KEY_NAME START END

print(r.rpop('Database'))

#rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。

print(r.ltrim('Database',0,1))

#Ltrim 对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 LTRIM KEY_NAME START STOP

while True:

  # 如果列表中为空时,则返回None

  result = r.brpop('Database',1)

  if result:

      print result[0]+":"+result[1]

  else:

      break

r.delete('Database')

#brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BRPOP LIST1 LIST2 .. LISTN TIMEOUT  假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。

r.close(); 

脚本执行结果如下:

3.5、Python操作Redis散列

Python 操作 hash散列常用方法如下:

#usr/bin/python

#-*- coding:utf-8 -*-

import redis

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

r.hset('user1','name','joneyan')

# 设置或更新一条数据的value,若不存在时,则新建这条数据  hset(key, field, value)

r.hset('user1','name','willwu')

# 获取数据

print  r.hget('user1','name')

# 读取数据的指定字段属性,返回值为字符串类型 hget(key, field)

# 一次性设置多个field和value

user_dict1 = {

  'password':'123',

  'gender':'Male',

  'height':'175cm'

}

user_dict2 = {

  'name':'Joneyan',

  'password':'123',

  'gender':'Male',

  'height':'178cm'

}

r.hmset('user1',user_dict1)

r.hmset('user2',user_dict2)

# 批量更新字段属性,参数mapping为字典类型 hmset(key, mapping)

print r.hmget('user1','name','gender')

# 批量读取数据的字段属性  hmget(key, fields)

print r.hgetall('user1')

# 获取这条数据的所有属性字段和对应的值,返回值为字典类型 hgetall(key)

print(r.hkeys('user1'))

# 获取这条数据的所有属性字段,返回值为列表类型 hkeys(key)

print(r.hvals('user1'))

# 获取这条数据的所有属性值,返回值为列表类型 hvals(key)

# 删除这条数据的指定字段 hdel(key, field)

r.close(); 

脚本执行结果如下:

3.6、Python操作Redis集合

Python 操作 Set 集合常用方法如下:

redis-set.py

#usr/bin/python

#-*- coding:utf-8 -*-

import redis

#建立redis连接

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

r.sadd("set_name","fieldyang")

r.sadd("set_name","joneyan","willwu")

#在对应的集合中添加元素 sadd(name,values)

print r.smembers('set_name')

#获取name对应的集合的所有成员 smembers(name)

print r.scard("set_name")

#获取name对应的集合中的元素个数 scard(name)

if r.sismember('set_name','tomhuang'):

       print "tomhuang in set_name"

else:

       print "tomhuang not in set_name"

   

if r.sismember('set_name','joneyan'):

       print "joneyan in set_name"

else:

       print "joneyan not in set_name"

#检查value是否是name对应的集合内的元素,返回值为True或False sismember(name, value)

member = r.spop('set_name')

print member

#随机删除并返回指定集合的一个元素 spop(name)

r.srem("set_name", "willwu")

print r.smembers('set_name')

#删除集合中的某个元素 srem(name, value)

r.sadd("set_name","fieldyang","joneyan")

r.sadd("set_name1","joneyan","willwu")

r.sadd("set_name2","joneyan","willwu","jokerhuang")

print r.sinter("set_name","set_name1","set_name2")

#获取多个name对应集合的交集 sinter(keys, *args)

print r.sunion("set_name","set_name1","set_name2")

#获取多个name对应的集合的并集 sunion(keys, *args)

r.close();

脚本执行结果如下:

3.7、结合数据库表生成redis hash

如下脚本中从mysql数据库user表中获取数据生成字典,再存储成redis hash散列

#usr/bin/python

#-*- coding:utf-8 -*-

import io

import os

import MySQLdb

import redis

import time

import collections

os.environ['NLS_LANG'] = "AMERICAN_AMERICA.ZHS16GBK"

Date = str(time.strftime("%Y%m%d-%H:%M:%S", time.localtime()))

dir='I:\\python\\'

file=("%smysqldata.txt" %dir)       

logfile=("%slog.txt" %dir)

r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='123456')

conn = MySQLdb.connect(host="localhost",  user="root", passwd="123456",db="mysql")

cur = conn.cursor()

list1=['Host','User','Select_priv','Insert_priv','Update_priv','Delete_priv','Create_priv','Drop_priv','Reload_priv','Shutdown_priv','Process_priv','File_priv','Grant_priv','References_priv','Index_priv','password_expired','password_last_changed','password_lifetime']

hash=collections.OrderedDict()

#collections.OrderedDict()标准的字典是无序的。而collections.OrderedDict()是一种特殊字典,能够按照键的插入顺序保留键值对在字典的次序。

sql="select  Host,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,password_expired,password_last_changed,password_lifetime  from user"

cur.execute(sql)

rows = cur.fetchall()

wfp = io.open(logfile,"wb+")

wfp.write("[INFO:%s] Load 1 data...\n"%(Date))                                     

b=1

for row in rows:

        wfp.write('---------------------------------------------recode %s----------'%b)

        print '---------------------------------------------recode %s----------'%b

        for i in range(len(list1)):

                hash[list1[i]]=str(list(row)[i]).encode('gbk')

        for k,v in hash.items():

                print ("%15s:%s" %(k,v))

                wfp.write("%15s:%s" %(k,v))

        r.hmset("user_"+hash['User'],hash)

        hashdata=r.hgetall("user_"+hash['User'])

        print hashdata            

        b+=1

        wfp.write("\n")             

print '----------------------------------------------End-----------'

for i in r.keys("*"):

       if r.type(i)=="hash":

              print i+":"

              print r.hkeys("user_"+hash['User'])    

              print r.hvals("user_"+hash['User'])

       else:

              print i+":"+r.type(i)

wfp.close()

cur.close();

conn.close();         

r.close(); 

脚本执行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/522014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

万字收藏:《2023网络工程师年度必看书单》

晚上好,我是老杨。 这周是总结周,更新的第三篇内容,还是关于总结的。很多人让我推荐网工适合看的书,其实我推荐过好多次了。 趁着年底,一起把我认为网工适合看的、推荐你看的、值得看的书整理一下,供新老…

视觉SLAM ch13 设计SLAM系统

目录 一、SLAM系统 二、工程框架 三、框架流程 四、具体实现 五、VO整体流程 六、显示整体建图效果 一、SLAM系统 实现一个精简版的双目视觉里程计,前端使用光流法,局部使用局部BA优化。 二、工程框架 app中 run_kitti_stereo.cpp是代码的运行入口…

国内免费可用 ChatGPT 网页版

ChatGPT是一个神奇的机器人,它可以回答任何问题,解决任何问题。它的名字来源于“Chat”和“GPT”,前者代表聊天,后者代表生成预测文本。它被设计成一个智能助手,可以帮助人们解决各种问题。 有一天,一个名…

【Python 爬虫之requests库】零基础也能轻松掌握的学习路线与参考资料

文章目录 一、概述二、Requests 库基本用法三、爬虫中的优秀实践四、参考资料 一、概述 Python 爬虫中,常用来请求网页的库有 urllib、urllib2、httplib等,但是这些库用起来比较麻烦,需要写很多代码。Requests 库正是为了解决这个问题而生的…

Flask轻松构建钉钉接口模版,实现自动化流程优化

项目背景 随着钉钉应用的不断普及和企业数字化程度的提高,越来越多的企业需要开发钉钉接口来完成内部业务流程的自动化和优化。而Flask框架,则是一个轻量级的Python web框架,具有快速开发和灵活性的优势,是钉钉接口开发的理想选择…

python去重列表中相同的字典元素

python去重列表中相同的字典元素 文章目录 python去重列表中相同的字典元素一.知识点二.代码|代码1|问题 |代码2 三.分析总结1、分析2、总结 四.后续代码知识点代码流程问题总结总结 一.知识点 ​ data_list [{“a”: 1, “b”: 2}, {“a”: 2, “b”: 3}, {“a”: 1, “b”:…

华为OD机试真题 Java 实现【相同数字的积木游戏1】【2023Q2 100分】

一、题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处位置最远的2块积木块,计算他们…

【C++】——string的模拟实现

前言: 在之前的学习中,我们已经对string类进行了简单的介绍,大家只要能够正常使用即可。但是在面试中,面试官总喜欢让学生自己 来模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

lightroom磨皮滤镜中文插件Portraiture4最新版本

哈喽!小伙伴们!整个摄影后期行业都在用Portraiture,这是一个被奉为高级磨皮面板,修图神器、修图的的扩展面板!Portraiture这款磨皮插件终于更新啦!最近推出了Portraiture4.03版本,新版本光影处理更强大&…

《编程思维与实践》1066.最小不重复数

《编程思维与实践》1066.最小不重复数 题目 思路 一般在oj上循环 2 ⋅ 1 0 9 2\cdot 10^9 2⋅109次以上就会超时,所以由于这题的数据A可以很大,直接循环加一再判断会超时. 优化:首先可以明确要想使不重复数尽可能小,则高位数字应该尽可能小, 即先找到最靠前的两个重复数字,然后…

【Vector VN1630/40 I/O应用】-1-简易示波器

案例背景(共13页精简):该篇博客将告诉您: Vector VN1630A,VN1640A,VH6501 I/O的使用;将Vector VN1630A/VN1640A CAN/LIN Interface的I/O接口充当一个简易的“示波器”使用;观察“CAN唤醒”工作的ECU控制器…

关于C语言的杂记4

文章目录 数据与程序结构C语言的编程机制#include <>和#include ""的区别形式参数和实际参数值传递地址传递 素数 文章内容摘自或加工于C技能树一些大佬的博文 数据与程序结构 阅读完C的编程机制和函数的声明和定义后的一些启发。——预处理 C语言的编程机制 …

dubbo技术

1、Dubbo的前世今生 2011年10月27日&#xff0c;阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo&#xff0c;服务治理和SOA的设计理念开始逐渐在国内软件行业中落地&#xff0c;并被广泛应用。 早期版本的dubbo遵循SOA的思想&#xff0c;是面向服务架构的重要组件。 …

1708_Simulink中取数组元素

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【多线程】线程安全问题原因与解决方案

目录 线程安全的概念 线程不安全示例 线程不安全的原因 多个线程修改了同一个变量 线程是抢占式执行的 原子性 内存可见性 有序性 线程不安全解决办法 synchronized 关键字-监视器锁monitor lock synchronized 的特性 互斥 刷新内存 可重入 synchronized 使用示例 Java 标…

【第三章:存储系统】

目录 知识框架No.0 引言No.1 存储器概述No.2 主存储器一、SRAM芯片和DRAM芯片二、只读存储器三、主存储器的基本组成1、基本的半导体元件和原理 知识框架 No.0 引言 这一章节主要是&#xff1a;这些二进制的数据在计算机内部如何存储 在学习这个章节之前&#xff0c;首先把下面…

Mybatis - 基础

文章目录 一、 Mybatis基本介绍二、 Mybatis 快速入门程序2.1 引入Mybatis依赖2.2 准备工作2.3 配置SQL信息2.3.1 IDEA连接数据库2.3.2 打开日志信息 2.4 JDBC 了解2.5 数据库连接池2.5.1 Druid数据库连接池 三、 Mybatis 基础3.1 环境准备3.1.1 数据库表3.1.2 实体类 3.2 基础…

EasyRecovery16中文最新版电脑数据恢复软件下载使用教程

EasyRecovery如果需要使用它来恢复数据&#xff0c;请注意&#xff0c;尤其是当需要恢复的数据文件非常重要时&#xff0c;建议使用软件EasyRecovery以保障数据安全。共有三个版本&#xff0c;分别是个人版、专业版、企业版&#xff0c;这三种都可以免费下载并使用&#xff0c;…

[MySQL]关于MySQL索引的一点点东西

最是人间留不住,朱颜辞镜花辞树. 目录 一.为什么需要索引 1.什么是索引 2.索引的创建原则 二.理解索引 1. MySQL与磁盘交互基本单位 2.索引的结构 a.关于hash索引,B树索引,B树索引的特点 B树 B树 HASH b.为什么使用InnoDB 存储引…

15-721 chapter 13 查询执行

优化的目标 CPU层面 cpu是多级流水线操作&#xff0c;所以我们的目标是让每个处理器的每个部分都处于busy。多条流水线&#xff0c;我们没有依赖的指令可以放到不同的流水线里面。但是流水线如果遇到branch判断错误的话&#xff0c;就要flush掉 可以用值传递来代替跳转 查询执…