【Redis数据结构 序】使用redis-py操做Redis数据库

想要看更加舒服的排版、更加准时的推送
关注公众号“不太灵光的程序员”
每日八点有干货推送
同时发布《【Redis数据结构 1序】1使用redis-py操做Redis数据库》python

本文依旧会对学习内容进行拆分,建议阅读时间基本保持10分钟内,
先学习以前章节内容点击《你不了解的Redis》阅读全部章节内容
【Redis数据结构】系列对经常使用String、List、Set、Sorted Set、Hashe和Stream6种类型进行介绍,并使用redis-py进行实践操做。程序员

一个高性能的key-value数据库

Redis的出现,很大程度补偿了Memcached这类key-value存储的不足,在部分场合能够对关系数据库起到很好的补充做用。redis

Redis和Memcached相似,它支持存储的value类型相对更多,value经常使用的数据结构有String、List、Set、Sorted Set、Hashe、Stream 6种,固然不一样类型有不一样的特性,操做命令是不尽相同的。数据库

redis-py是Python中操做Redis数据库的经常使用模块,模块中命令函数基本上是与原命令命名一致,子命令都是做为命令的参数使用。windows

例如 SET命令
语法格式 :
SET key value [EX seconds] [PX milliseconds] [NX|XX]
对应的函数是:
set(self, name, value, ex=None, px=None, nx=False, xx=False, keepttl=False)
注:keepttl 为Redis 6.0 的特性,能够暂不考虑
注:模块的execute_command是实际调用原命令的函数缓存

咱们会结合python的redis模块对这6种数据结构的操做进行讲解,方便加深记忆。服务器

Redis命令命名有如下特色:markdown

  • 命令 以S 开头的为 集合操做命令
  • 命令 以Z 开头的为 有序集合操做命令
  • 命令 以H 开头的为 哈希集操做命令
  • 命令 以X 开头的为 流操做命令

例如:数据结构

  • INCRBY 是 字符串类型原子递增的操做命令
  • ZINCRBY 是 有序集合类型的分数(权值)原子递增的操做命令
  • HINCRBY 是 哈希集类型指定字段的数值的原子递增的操做命令
1 Redis Server

Windows 下载 Redis-x64-3.0.501.zip 解压
管理员权限使用cmd切换到解压后的目录下:运维

  • 手动指定配置文件启动:redis-server.exe redis.windows.conf
    也能够直接双击redis-server.exe启动
  • 安装服务:redis-server.exe --service-install redis.windows.conf
  • 卸载服务:redis-server --service-uninstall
  • 开启服务:redis-server --service-start
  • 中止服务:redis-server --service-stop

配置文件 redis.windows.conf

  • databases 能够设置db的数量,是大于0的任意整数,默认16
  • port 能够设置端口,默认6379
  • maxclients 设置最大链接数,默认10000
  • requirepass 设置链接密码

启动后是这样的:在这里插入图片描述
注:建议安装RedisDesktopManager帮助学习

2 Python环境

首先须要解释下 redis-py 2.X 和 redis-py 3.0的部分区别

数据库链接方式不一样

在redis-py 2.X 中StrictRedis用于实现大部分官方的命令,Redis用于向后兼用旧版本,官方建议使用StrictRedis。

在redis-py 3.0 中StrictRedis只是Redis的一个别名,建议使用Redis。

数值类型不一样

redis-py 2.X 能够接收任何类型的输入并强制转换为字符串类型。

redis-py 3.0 仅接受用户数据做为字节、字符串、数字(int,long和float), 其余类型将引起DataError异常。

在2.x中,当用户输入bool值或者None值是结果就不是预期的了,
会强制转换为“True”、“False”和“None”的字符串,这会致使各类隐藏错误类型。

参数不一样

SETEX、LREM、TTL和PTTL命令的参数顺序发生变化。
MSET、MSETNX和ZADD命令的参数结构发生变化。

注:后文中的全部redis-py都指代redis-py3.0

pip install redis==3.5.1

redis-py 两种链接方式

  • redis.Redis
  • redis.StrictRedis

正如上面提到的 StrictRedis只是Redis的一个别名,建议使用Redis。

redis-py 链接池

  • redis.ConnectionPool

redis-py 使用链接池来管理对一个redis server的全部链接,避免每次创建、释放链接的开销。

redis-py 管道

  • redis.Pipelines

redis-py 使用管道在单个请求中将多个命令缓冲到服务器,能够理解为数据库事务。

能够经过减小客户机和服务器之间来回传输的TCP数据包的数量来提升性能。

也能够减小应为客户端宕机,致使的一个连续操做没有完成而产生的异常。

实例:

pipe = r.pipeline()
pipe.x 
...
pipe.execute()
Hello World

咱们建立分别建立user:1000:message、user:1001:message、user_1002_message三个key,都保存字符串 Hello World 并读取它们。

# coding=gbk
# 导入redis 模块
import redis

redis_pool = redis.ConnectionPool(
    host='127.0.0.1',
    port=6379,
    db=0,
    password='cbs123',
    decode_responses=True
)

r = redis.Redis(connection_pool=redis_pool)
sr = redis.StrictRedis(connection_pool=redis_pool)

# 将键key设定为指定的"字符串"值
r.set("user:1000:message", "Hello World", ex=100)
sr.set("user:1001:message", "Hello World")
sr.set("user:1004:message", "Hello World", px=10000)
sr.set("user_1002_message", "Hello World")

# 获取key对应的数值
r.get("user:1000:message")
r.get("user:1001:message")
r.get("user_1002_message")
""" > True > True > True > Hello World > Hello World > Hello World """

咱们能够看到key在RedisDesktopManager使用冒号分隔的key是作了层次划分的

在这里插入图片描述
当咱们要使用的redis作数据表的重要数据缓存时,user:1000:message 能够表示为 user表的id为1000的记录中message的数据。

存储的key很少的话还比较好维护,有上万个key在同一级命名空间中维护起来仍是比较痛苦的。

key的定义规则是见名知意,格式统一便可。

固然你也能够作其余格式的定义,你能够理解就好。

Redis通用命令

见源代码
> 表示返回结果

# coding=gbk
# 导入redis 模块
import redis

redis_pool = redis.ConnectionPool(
    host='127.0.0.1',
    port=6379,
    db=0,
    password='cbs123',
    decode_responses=True
)

r = redis.Redis(connection_pool=redis_pool)

# 通用操做 不区分 数据类型的
# EXISTS key 检查key值是否存在,成功返回1,不成功返回0(key对应的值不存在)
r.exists("user:1000:message")
r.exists("user:1002:message")
""" > 1 > 0 """

# TYPE key 返回key对应的值的类型,成功返回类型,不成功返回none(key对应的值不存在)
r.type("user:1000:message")
r.type("user:1002:message")
""" > string > none """

# TTL key 返回key对应的剩余存活时间,成功返回时长单位秒,不成功返回-1 key值不存在返回-2
r.ttl("user:1000:message")
r.ttl("user:1001:message")
r.ttl("user:1004:message")
r.ttl("user:1002:message")
""" > 100 > -1 > 10 > -2 """

# 设置超时时间,当时间到达后会被删除
# EXPIRE key seconds 超时时间,当时间到达后会被删除,单位秒
# PEXPIRE key milliseconds 超时时间,当时间到达后会被删除,单位毫秒
r.expire("user:1000:message", 10)
r.pexpire("user:1001:message", 10)
""" > True > False > False """

# PERSIST key 删除key对应的超时时间,成功返回True,不成功返回False(key对应的值不存在)
r.persist("user:1000:message")
r.persist("user:1001:message")
r.persist("user:1002:message")
""" > True > False > False """

# DEL key 删除key对应的值,成功返回1,不成功返回0(key对应的值不存在)
r.delete("user:1000:message")
r.delete("user:1002:message")
""" > 1 > 0 """
推荐阅读: