Python中Redis的使用

本文章主要是python redis模块的一些简单的使用,主要为了给以后网站设置缓存而准备一些必要的知识。

Redis模块安装

pip3 install redis

建立连接

要使用redis数据库,首先要与redis服务端建立一个连接,一般连接的建立有两种方式:

  1. 直接建立连接
r = redis.Redis() # Default parameters
r = redis.Redis(host="127.0.0.1", password=None, port=6379, db=0)
  1. 使用连接池
pool = redis.ConnectionPool(host="127.0.0.1", port=6379, db=0)
r = redis.Redis(connection_pool=pool)

使用

Redis目前支持以下几种数据类型:

  • string:存储string,以及int或者float等数据类型的数据。
  • hash:存储字典类型的数据
  • list:存储列表类型的数据
  • set:存储集合类型的数据
  • zset:存储的也是集合类型的数据,不过数据是有序存储

文档地址: https://redis-py.readthedocs.io/en/latest/

  1. 字符串类型
In [11]: r.set("foo", "bar")
Out[11]: True

In [12]: r.get("foo")
Out[12]: b'bar'

In [26]: r.delete("foo")
Out[26]: 1

In [27]: r.get("foo")

Key的加减运算

In [31]: r.incr("cnt")
Out[31]: 11

In [32]: r.incr("cnt")
Out[32]: 12

In [33]: r.incrby("cnt", 20)
Out[33]: 32

In [34]: r.set("cnt",10)
Out[34]: True

In [35]: r.incr("cnt")
Out[35]: 11

In [36]: r.incr("cnt")
Out[36]: 12

In [37]: r.incrby("cnt", 20)
Out[37]: 32

In [38]: r.decr("cnt")
Out[38]: 31

In [39]: r.incrby("cnt", -18)
Out[39]: 13

获取字符长度:

In [40]: r.set("name", "你好,  Redis")
Out[40]: True

In [41]: r.strlen("name")
Out[41]: 14

这里默认的字符串的类型是bytes而不是python3中常用的str类型,为了避免因为字符类型导致问题,可以在建立连接的时候加上一个decode_responses=True选项,这样返回的数据就会被直接解码为python3的str格式。

  1. 散列类型

散列类型一般用来保存一个key多个字段,每个字段可以单独更改的情况。操作举例如下

In [46]: r.hset("user", "name", "major")
Out[46]: 0

In [47]: r.hmset("user", {"address":"china", "age":10})
Out[47]: True

In [48]: r.hget("user", "age")
Out[48]: '10'

In [49]: r.hincrby("user", "age", 5)
Out[49]: 15

IIn [51]: import datetime

In [52]: stamp=datetime.datetime.now()

In [53]: r.hset("user", "stamp", stamp)
Out[53]: 1

In [54]: r.hgetall("user")
Out[54]:
{'address': 'china',
 'age': '15',
 'name': 'major',
 'stamp': '2017-06-03 10:27:08.294347'}

可以看到keyuser的键对应多个fields并且每个field都是可以单独修改的。还可以通过hgetall获取所有的数据,需要说明的是,这里所有的数据都是按照字符串保存的,包括int类型的age以及时间戳,因此在数据处理上要注意。

  1. 列表类型
    列表类型可以保存一个有序的字符串列表,常用的操作是向列表两端添加数据或者获取列表的一个片断。列表内部通过链表实现,因此向两边插入数据很快,但向中间插入数据就很慢。通过索引的方式访问列表也是很慢的。
#  直接向key中push数据就会创建一个列表
In [91]: r.lpush("number", 1)
Out[91]: 1

In [92]: r.lpush("number", 2)
Out[92]: 2

In [93]: r.lpush("number", 3)
Out[93]: 3
# 列表可以从两端pop数据
In [105]: r.lpop("number")
Out[105]: '4'

In [106]: r.rpop("number")
Out[106]: '1'
# 列表可以通过正向和负向索引获取中间的一个片断。索引超出列表不会报错,而是返回列表中存在的数据。
In [108]: r.lrange("number", -3, -1)
Out[108]: ['3', '2']

In [109]: r.lrange("number", 1, 3)
Out[109]: ['2']

发表新评论