注意在连接之前要确保 redis 服务已经安装。
更多的安装信息请查看:https://blog.csdn.net/sinat_20471177/article/details/132042779?spm=1001.2014.3001.5501
redis 模块
Python 要使用 redis,需要先安装 redis 模块。如果要做数据导入/导出操作的话,还需要安装RedisDump。
Redis 和 StrictRedis
RedisPy库提供两个类Redis
和StrictRedis
来实现Redis的命令操作。
StrictRedis
实现了绝大部分官方的命令,参数也一一对应,比如set()
方法就对应Redis命令的set
方法。而Redis
是StrictRedis
的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了做兼容,它将方法做了改写,比如lrem()
方法就将value
和num
参数的位置互换,这和Redis命令行的命令参数不一致。
官方推荐使用StrictRedis
,所以我们也用StrictRedis类
的相关方法作演示。
连接Redis
from redis import StrictRedis
redis = StrictRedis(host='localhost', port=6379, db=0,password=None)#创建连接
redis.set('name','test')
print(redis.get('name'))
这里我们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的情况下,这4个参数分别为localhost
、6379
、0
和None
。首先声明了一个StrictRedis
对象,接下来调用set()
方法,设置一个键值对,然后将其获取并打印。
运行结果如下:
或者使用一下语句,也能返回同样的结果。
redis.get('name')
这说明我们连接成功,并可以执行set()
和get()
操作了。
ConnectionPool 连接池
还可以使用ConnectionPool
来连接,示例如下:
from redis import StrictRedis, ConnectionPool
pool = ConnectionPool(host='localhost', port=6379, db=0, password=None)
redis = StrictRedis(connection_pool=pool)
这样的连接效果是一样的。StrictRedis
内其实就是用host
和port
等参数又构造了一个ConnectionPool
,所以直接将ConnectionPool
当作参数传给StrictRedis
也一样。
另外,ConnectionPool
还支持通过URL来构建。URL的格式支持有如下3种:
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次)
redis.set("visit:blog.csdn.net/sinat_20471177/article:totals", 10000)
redis.get("visit:blog.csdn.net/sinat_20471177/article:totals")
每当有一个页面点击,则使用INCR增加点击数即可。
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单个增加\修改
hset(name, key, value)
向键为name的散列表中添加映射(key:value)(不存在,则创建;否则,修改)
例如
#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时则创建(相当于添加)
例如:
redis.hsetnx("hash1", "k2", "v3") #前面存在k2是没办法修改的, 只能新建
print(redis.hget("hash1", "k2"))
返回的结果为:
参考: