Windows安装 Redis及Python操作Redis常见类型详解

6 篇文章 0 订阅
3 篇文章 0 订阅

1、windows 上安装 Redis

便于测试,笔者在 windows 上安装 Redis,如有现成Linux下的Redis和Python环境,也可直接使用。

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  123456。 这是访问Redis时所需的密码,一般测试情况下可以不用设定密码。建议按常规设定一个密码。

设置完成后需要重启Redis-server生效,重连Redis客户端,可以看到需要验证密码。

E:\Redis-x64-3.0.504>redis-cli
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
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 -*-
#author:Fieldyang
#description :python操作Redis 常规用法

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 操作 Redis计数常用方法如下:

redis-string.py

#usr/bin/python
#-*- coding:utf-8 -*-
#author:Fieldyang
#description :python操作Redis 计数
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 -*-
#author:Fieldyang
#description :python操作Redis 列表
import redis
#建立redis连接
r = redis.Redis(host='127.0.0.1',port=6379,db=0,password='8357690')
r.lpush('Language','Java','Python','C#')
#lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 lpush 操作。 当 key 存在但不是列表类型时,返回一个错误。 lpush KEY_NAME VALUE1.. VALUEN ,返回列表的长度
r.rpush('Language','Perl','Node.js')
#rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。rpush KEY_NAME VALUE1..VALUEN
r.linsert('Language','before','Python','Ruby')
r.linsert('Language','after','Python','Html/css')
#linsert 命令用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。当列表不存在时,被视为空列表,不执行任何操作。 linsert key before|after pivot value
print(r.llen('Language'))
#Llen 命令用于返回列表的长度
print(r.lrange('Language',0,-1))
#lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 lrange KEY_NAME START END
print(r.rpop('Language'))
#rpop 命令用于移除列表的最后一个元素,返回值为移除的元素。
print(r.ltrim('Language',0,1))
#Ltrim 对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 LTRIM KEY_NAME START STOP
while True:
  # 如果列表中为空时,则返回None
  result = r.brpop('Language',1)
  if result:
      print result[0]+":"+result[1]
  else:
      break
r.delete('Language')
#brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BRPOP LIST1 LIST2 .. LISTN TIMEOUT  假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
r.close(); 

脚本执行结果如下:

3.5、Python操作Redis集合

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

redis-set.py

#usr/bin/python
#-*- coding:utf-8 -*-
#by Fieldyang
#description :python操作Redis 集合
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.6、Python操作Redis散列

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

#usr/bin/python
#-*- coding:utf-8 -*-
#by Fieldyang
#description :python操作Redis hash散列
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.7、结合数据库表生成redis hash

如下脚本从mysql数据库user表中获取数据生成有序字典,并将数据导出到mysqldata.txt文件,同时将表中数据同步存储成redis hash散列,生产实际使用中往往将配置表缓存为Redis hash,提高访问速度。

该实例同时演示了Python从MySQL取数,导出数据,刷入Redis缓存三个功能。

mysql-redis.py

#usr/bin/python
#-*- coding:utf-8 -*-
#author Fieldyang
#description :Python从MySQL取数,导出数据,刷入Redis缓存
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)       
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','plugin','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,plugin,password_lifetime  from user"
cur.execute(sql)
rows = cur.fetchall()
wfp = io.open(file,"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))
        if r.exists("user_"+hash['User']):
                r.delete("user_"+hash['User'])
        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();        

脚本执行结果如下:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值