python操作redis
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
 - Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
 - Redis支持数据的备份,即master-slave模式的数据备份。
 
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
 - 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
 - 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
 - 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
 
安装Redis
windows安装:
下载地址:https://github.com/tporadowski/redis/releases
直接下一步一步就可以了
LInux下安装:
- centos:
 
1  | 安装  | 
- untubu
 
1  | 安装  | 
编译安装
1  | wget http://download.redis.io/releases/redis-6.0.4.tar.gz  | 
src 目录 中现在提供了已编译的二进制文件 。使用以下命令运行Redis:
1  | src/redis-server  | 
当然这些都是运维会配置好的,我们了解即可
Python安装 redis 模块
Python 要使用 redis,需要先安装 redis 模块:
1  | pip3 install redis  | 
redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。
redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。
1  | import redis # 导入redis 模块  | 
连接池
redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。
默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。
1  | import redis # 导入redis 模块  | 
常用命令
redis基本命令 String
set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认,不存在则创建,存在则修改
参数:
- ex,过期时间(秒)
 - px,过期时间(毫秒)
 - nx,如果设置为True,则只有name不存在时,当前set操作才执行
 - xx,如果设置为True,则只有name存在时,当前set操作才执行
 
1  | r.set('k','v',ex=2)  | 
mset(*args, **kwargs):批量设置值
1  | r.mget({'k1': 'v1', 'k2': 'v2'})  | 
mget(keys, *args):批量获取
1  | print(r.mget('k1', 'k2'))  | 
getset(name, value):设置新值并获取原来的值
1  | print(r.getset("food", "barbecue")) # 设置的新值是barbecue 设置前的值是beef  | 
redis基本命令 hash
hset(name, key, value)
单个增加—修改(单个取出)—没有就新增,有的话就修改
name对应的hash中设置一个键值对(不存在,则创建;否则,修改)
参数:
- name,redis的name
 - key,name对应的hash中的key
 - value,name对应的hash中的value
 
注:
hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加)
1  | r.hset("hash1", "k1", "v1")  | 
hmset(name, mapping)批量增加(取出)
在name对应的hash中批量设置键值对
参数:
- name,redis的name
 - mapping,字典,如:{‘k1’:’v1’, ‘k2’: ‘v2’}
 
1  | r.hmset("hash2", {"k2": "v2", "k3": "v3"})  | 
hget(name,key)在name对应的hash中获取根据key获取value
hmget(name, keys, *args) 在name对应的hash中获取多个key的值
参数:
- name,reids对应的name
 - keys,要获取key集合,如:[‘k1’, ‘k2’, ‘k3’]
 - *args,要获取的key,如:k1,k2,k3
 
1  | print(r.hget("hash2", "k2")) # 单个取出"hash2"的key-k2对应的value  | 
hgetall(name)取出所有的键值对
1  | print(r.hgetall("hash1"))  | 
hexists(name, key)判断成员是否存在(类似字典的in)
检查name对应的hash是否存在当前传入的key
1  | print(r.hexists("hash1", "k4")) # False 不存在  | 
hdel(name,*keys)删除键值对
将name对应的hash中指定key的键值对删除
1  | print(r.hgetall("hash1"))  | 
redis基本命令 list
lpush(name,values) 左添加 &rpush右添加
1  | r.lpush("list1", 11, 22, 33) # 在列表的左边,依次添加11,22,33  | 
lpushx(name,value) 存在才添加左边 &rpushx(name,value) 存在才添加右边
1  | r.lpushx("list10", 10) # 这里list10不存在  | 
linsert(name, where, refvalue, value))新增(固定索引号位置插入元素)
在name对应的列表的某一个值前或后插入一个新值
参数:
- name,redis的name
 - where,BEFORE或AFTER
 - refvalue,标杆值,即:在它前后插入数据
 - value,要插入的数据
 
1  | r.linsert("list2", "before", "11", "00") # 往列表中左边第一个出现的元素"11"前插入元素"00"  | 
r.lset(name, index, value)修改(指定索引号进行修改)
对name对应的list中的某一个索引位置重新赋值
参数:
- name,redis的name
 - index,list的索引位置
 - value,要设置的值
 
1  | r.lset("list2", 0, -11) # 把索引号是0的元素修改成-11  | 
r.lrem(name, value, num)删除(指定值进行删除)
在name对应的list中删除指定的值
参数:
- name,redis的name
 - value,要删除的值
 - num, num=0,删除列表中所有的指定值;
 - num=2,从前到后,删除2个; num=1,从前到后,删除左边第1个
 - num=-2,从后向前,删除2个
 
1  | r.lrem("list2", "11", 1) # 将列表中左边第一次出现的"11"删除  | 
lpop(name)删除并返回
在name对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素
- rpop(name) 表示从右向左操作
 
1  | r.lpop("list2") # 删除列表最左边的元素,并且返回删除的元素  | 
lindex(name, index)取值(根据索引号取值)
在name对应的列表中根据索引获取列表元素
1  | print(r.lindex("list2", 0)) # 取出索引号是0的值  | 
具体操作可以参考 :https://www.jianshu.com/p/2639549bedc8
常用其实就那么几个get.set.hget,gset