通过python操作redis(windows)

注意在连接之前要确保 redis 服务已经安装。

更多的安装信息请查看:https://blog.csdn.net/sinat_20471177/article/details/132042779?spm=1001.2014.3001.5501

redis 模块

Python 要使用 redis,需要先安装 redis 模块。如果要做数据导入/导出操作的话,还需要安装RedisDump。

Redis 和 StrictRedis

RedisPy库提供两个类RedisStrictRedis来实现Redis的命令操作。

++StrictRedis实现了绝大部分官方的命令,参数也一一对应++ ,比如set()方法就对应Redis命令的set方法。而RedisStrictRedis的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了做兼容,它将方法做了改写,比如lrem()方法就将valuenum参数的位置互换,这和Redis命令行的命令参数不一致。

官方推荐使用StrictRedis,所以我们也用StrictRedis类的相关方法作演示。

连接Redis

python 复制代码
from redis import StrictRedis

redis = StrictRedis(host='localhost', port=6379, db=0,password=None)#创建连接
redis.set('name','test')
print(redis.get('name'))

这里我们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的情况下,这4个参数分别为localhost63790None。首先声明了一个StrictRedis对象,接下来调用set()方法,设置一个键值对,然后将其获取并打印。

运行结果如下:

或者使用一下语句,也能返回同样的结果。

python 复制代码
redis.get('name')

这说明我们连接成功,并可以执行set()get()操作了。

ConnectionPool 连接池

还可以使用ConnectionPool来连接,示例如下:

python 复制代码
from redis import StrictRedis, ConnectionPool

pool = ConnectionPool(host='localhost', port=6379, db=0, password=None)
redis = StrictRedis(connection_pool=pool)

这样的连接效果是一样的。StrictRedis内其实就是用hostport等参数又构造了一个ConnectionPool,所以直接将ConnectionPool当作参数传给StrictRedis也一样。

另外,ConnectionPool还支持通过URL来构建。URL的格式支持有如下3种:

python 复制代码
redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db

键操作

基本命令 string字符串

下表总结了键的一些字符串判断和操作方法。

方法 作用 参数说明 示例 示例说明 示例结果
set(name, value) 给数据库中键为name的string赋予值value name: 键名;value: 值 redis.set('name', 'Bob') 给name这个键的value赋值为Bob True
get(name) 返回数据库中键为name的string的value name:键名 redis.get('name') 返回name这个键的value b'Bob'
getset(name, value) 给数据库中键为name的string赋予值value并返回上次的value name:键名;value:新值 redis.getset('name', 'Mike') 赋值name为Mike并得到上次的value b'Bob'
mget(keys, *args) 返回多个键对应的value keys:键的列表 redis.mget(['name', 'nickname']) 返回name和nickname的value [b'Mike', b'Miker']
setnx(name, value) 如果不存在这个键值对,则更新value,否则不变 name:键名 redis.setnx('newname', 'James') 如果newname这个键不存在,则设置值为James 第一次运行结果是True,第二次运行结果是False
setex(name, time, value) 设置可以对应的值为string类型的value,并指定此键值对应的有效期 name: 键名;time: 有效期; value:值 redis.setex('name', 1, 'James') 将name这个键的值设为James,有效期为1秒 True
setrange(name, offset, value) 设置指定键的value值的子字符串 name:键名;offset:偏移量;value:值 redis.set('name', 'Hello') redis.setrange('name', 6, 'World') 设置name为Hello字符串,并在index为6的位置补World 11,修改后的字符串长度
mset(mapping) 批量赋值 mapping:字典 redis.mset({'name1': 'Durant', 'name2': 'James'}) 将name1设为Durant,name2设为James True
msetnx(mapping) 键均不存在时才批量赋值 mapping:字典 redis.msetnx({'name3': 'Smith', 'name4': 'Curry'}) 在name3和name4均不存在的情况下才设置二者值 True
incr(name, amount=1) 键为name的value增值操作,默认为1,键不存在则被创建并设为amount name:键名;amount:增长的值 redis.incr('age', 1) age对应的值增1,若不存在,则会创建并设置为1 1,即修改后的值
decr(name, amount=1) 键为name的value减值操作,默认为1,键不存在则被创建并将value设置为-amount name:键名; amount:减少的值 redis.decr('age', 1) age对应的值减1,若不存在,则会创建并设置为-1 -1,即修改后的值
append(key, value) 键为name的string的值附加value key:键名 redis.append('nickname', 'OK') 向键为nickname的值后追加OK 13,即修改后的字符串长度
substr(name, start, end=-1) 返回键为name的string的子串 name:键名;start:起始索引;end:终止索引,默认为-1,表示截取到末尾 redis.substr('name', 1, 4) 返回键为name的值的字符串,截取索引为1~4的字符 b'ello'
getrange(key, start, end) 获取键的value值从start到end的子字符串 key:键名;start:起始索引;end:终止索引 redis.getrange('name', 1, 4) 返回键为name的值的字符串,截取索引为1~4的字符 b'ello'

应用示例

假定我们对CSDN博文需要记录点击次数。例如每个文章都要记录点击次数,而点击次数比评论的次数的多得多。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。所以,点击数的增加使用redis的INCR命令最好不过了。

当redis服务器启动时,可以从关系数据库读入点击数的初始值(某篇文章被访问了10000次)

python 复制代码
redis.set("visit:blog.csdn.net/sinat_20471177/article:totals", 10000)
redis.get("visit:blog.csdn.net/sinat_20471177/article:totals")

每当有一个页面点击,则使用INCR增加点击数即可。

python 复制代码
redis.incr("visit:blog.csdn.net/sinat_20471177/article:totals")
redis.incr("visit:blog.csdn.net/sinat_20471177/article:totals")

访问两次后:

基本命令 hash散列

方法 作用 参数说明 示例 示例说明 示例结果
hset(name, key, value) 向键为name的散列表中添加映射 name:键名;key:映射键名;value:映射键值 hset('price', 'cake', 5) 向键为price的散列表中添加映射关系,cake的值为5 1,即添加的映射个数
hsetnx(name, key, value) 如果映射键名不存在,则向键为name的散列表中添加映射 name:键名;key:映射键名;value:映射键值 hsetnx('price', 'book', 6) 向键为price的散列表中添加映射关系,book的值为6 1,即添加的映射个数
hget(name, key) 返回键为name的散列表中key对应的值 name:键名;key:映射键名 redis.hget('price', 'cake') 获取键为price的散列表中键名为cake的值 5
hmget(name, keys, *args) 返回键为name的散列表中各个键对应的值 name:键名;keys:映射键名列表 redis.hmget('price', ['apple', 'orange']) 获取键为price的散列表中apple和orange的值 [b'3', b'7']
hmset(name, mapping) 向键为name的散列表中批量添加映射 name:键名;mapping:映射字典 redis.hmset('price', {'banana': 2, 'pear': 6}) 向键为price的散列表中批量添加映射 True
hincrby(name, key, amount=1) 将键为name的散列表中映射的值增加amount name:键名;key:映射键名;amount:增长量 redis.hincrby('price', 'apple', 3) key为price的散列表中apple的值增加3 6,修改后的值
hexists(name, key) 键为name的散列表中是否存在键名为键的映射 name:键名;key:映射键名 redis.hexists('price', 'banana') 键为price的散列表中banana的值是否存在 True
hdel(name, *keys) 在键为name的散列表中,删除键名为键的映射 name:键名;keys:映射键名 redis.hdel('price', 'banana') 从键为price的散列表中删除键名为banana的映射 True
hlen(name) 从键为name的散列表中获取映射个数 name: 键名 redis.hlen('price') 从键为price的散列表中获取映射个数 6
hkeys(name) 从键为name的散列表中获取所有映射键名 name:键名 redis.hkeys('price') 从键为price的散列表中获取所有映射键名 [b'cake', b'book', b'banana', b'pear']
hvals(name) 从键为name的散列表中获取所有映射键值 name:键名 redis.hvals('price') 从键为price的散列表中获取所有映射键值 [b'5', b'6', b'2', b'6']
hgetall(name) 从键为name的散列表中获取所有映射键值对 name:键名 redis.hgetall('price') 从键为price的散列表中获取所有映射键值对 {b'cake': b'5', b'book': b'6', b'orange': b'7', b'pear': b'6'}

hset单个增加\修改

python 复制代码
hset(name, key, value)

向键为name的散列表中添加映射(key:value)(不存在,则创建;否则,修改)

例如

python 复制代码
#redis是前面创建的链接
redis.hset("hash1", "k1", "v1")
redis.hset("hash1", "k2", "v2")
print(redis.hkeys("hash1")) # 取hash中所有的key
print(redis.hget("hash1", "k1"))    # 单个取hash的key对应的值
print(redis.hmget("hash1", "k1", "k2")) # 多个取hash的key对应的值

返回的结果为:

hsetnx(name, key, value) 当name对应的hash中不存在当前key时则创建(相当于添加)

例如:

python 复制代码
redis.hsetnx("hash1", "k2", "v3") #前面存在k2是没办法修改的, 只能新建
print(redis.hget("hash1", "k2"))

返回的结果为:

更多的操作请参考官方文档,或查看博文:https://blog.csdn.net/sinat_20471177/article/details/132043998?spm=1001.2014.3001.5501https://blog.csdn.net/sinat_20471177/article/details/132043998?spm=1001.2014.3001.5501

参考:

1.Python redis 使用介绍 | 菜鸟教程 (runoob.com)

2.Python操作Redis,你要的都在这了! - John-Python - 博客园 (cnblogs.com)

相关推荐
静听山水3 分钟前
mysql语句执行过程
数据库·mysql
虽千万人 吾往矣21 分钟前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
mariokkm44 分钟前
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
数据库·django·sqlite
Jay_fearless1 小时前
Redis SpringBoot项目学习
spring boot·redis
Wang's Blog2 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO2 小时前
MySQL事务
数据库·mysql
cyt涛4 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油4 小时前
01_SQLite
数据库·sqlite
liuxin334455664 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
少女的迷鹿5 小时前
Paper:NSG(Navigating Spreading-out Graph)
数据库