# 中间件3剑客-Redis
# Redis介绍
redis是一个 高性能 基于键值对的 内存型 NoSQL数据库。NoSQL: Not Only SQL
关系型数据库 (mysql, oracle, sql server, sqlite)
- 数据存放在表中,表之间有关系
- 通用的SQL操作语言
- 大部分支持事务
非关系型数据库 (redis, hadoop, mongodb)
- 没有数据表的概念,不同的nosql数据库存放数据位置不同
- nosql数据库没有通用的操作语言
- 基本不支持事务,redis支持简单事务
redis是业界主流的key-value nosql 数据库之一,和memcached类似
- 它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set--有序集合)和hash(哈希类型)
- 为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步
- redis是一款基于CS架构的数据库,客户端可以使用python等编程语言,也可以终端命令行工具
Redis (opens new window)是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件
安装启动
# docker
docker run -d --rm --name redis -p 6379:6379 redis:alpine
# ubuntu
$sudo apt-get update
$sudo apt-get install redis-server
$redis-server
$redis-cli
redis 127.0.0.1:6379> ping
PONG
# Python操作Redis
redis-py 的API的使用可以分类为:
- 连接方式
- 操作
- String 操作
- Hash 操作
- List 操作
- Set 操作
- Sort Set 操作
- 管道
- 发布订阅
# 连接方式
0、安装依赖
pip install redis-py
1、操作模式
redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py.
import redis
r = redis.Redis(host='127.0.0.1', port=6379)
r.set('foo', 'bar')
print(r.get('foo'))
2、连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
r.set('foo', 'bar')
print(r.get('foo'))
3、基本操作
1. string类型:
字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型,最大容量是512M。
2. hash类型:
hash用于存储对象,对象的结构为属性、值,值的类型为string。
key:{
域:值[这里的值只能是字符串],
域:值,
域:值,
域:值,
...
}
3. list类型:
列表的元素类型为string。
key:[值1,值2, 值3..... ]
4. set类型:
无序集合,元素为string类型,元素唯一不重复,没有修改操作。
{值1, 值4, 值3, 值5}
5. zset类型:
有序集合,元素为string类型,元素唯一不重复,没有修改操作。
# String操作
redis中的String在在内存中按照一个name对应一个value来存储
name --> value
n1 --> v1
n2 --> v2
n3 --> v3
- set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有name不存在时,当前set操作才执行
xx,如果设置为True,则只有name存在时,岗前set操作才执行
- setnx(name, value)
设置值,只有name不存在时,执行设置操作(添加)
- setex(name, time, value)
参数:
time,过期时间(数字秒 或 timedelta对象)
- psetex(name, time_ms, value)
参数:
time_ms,过期时间(数字毫秒 或 timedelta对象)
- mset(*args, **kwargs)
批量设置值
如:
mset(k1='v1', k2='v2')
或
mget({'k1': 'v1', 'k2': 'v2'})
- get(name) 获取值
- mget(keys, *args)
批量获取
如:
mget('k1', 'k1')
或
r.mget(['k1', 'k1'])
getset(name, value) 设置新值并获取原来的值
getrange(key, start, end)
获取子序列(根据字节获取,非字符)
参数:
# name,Redis 的 name
# start,起始位置(字节)
# end,结束位置(字节)
- strlen(name) # 返回name对应值的字节长度(一个汉字3个字节)
- incr(self, name, amount=1)
自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
参数:
# name,Redis的name
# amount,自增数(必须是整数)
注:同incrby
- incrbyfloat(self, name, amount=1.0)
自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。
参数:
# name,Redis的name
# amount,自增数(浮点型)
- decr(self, name, amount=1)
自减 name对应的值,当name不存在时,则创建name=amount,否则,则自减。
参数:
# name,Redis的name
# amount,自减数(整数)
- append(key, value)
在redis name对应的值后面追加内容
参数:
key, redis的name
value, 要追加的字符串