参考: http://www.cnblogs.com/wupeiqi/articles/5132791.html
redis是一个软件
redis是单进程单线程
帮助开发者对一台机器的内存进行操作,
可以做持久化:
AOF
RDB
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
1 yum install redis (或者编译安装)
2 启动: redis-server /etc/redis.conf
(如果是编译安装: /src/redis-server redis-conf)
3 redis配置文件: redis.conf
bind: 0.0.0.0
port: 6379
requirepass sdfs (密码)
pip3 install redis # 创建连接 conn = redis.Redis(host=‘192.168.1.66‘, port=6379, password=‘...‘) conn.set(‘x1‘, ‘val1‘) val = conn.get(‘x1‘) print(val) # 连接池 pool = redis.ConnectionPool(host=‘192.168.1.66‘, port=6379, password=‘123456‘, max_connections=1000) conn = reids.Redis(connection_pool=pool)
# 注意: 只用一个连接池, 可以通过单例模式实现(从其他模块导入实例好的连接池对象)
# 使用连接池: 本质是维护一个已经和服务端连接成功的socket; 以后再次发送数据时, 直接获取一个socket, 直接send数据
set(name, value, ex=None, px=None, nx=False, xx=False) # 设置值,默认,不存在则创建,存在则修改 setnx(name, value) # 设置值,只有name不存在时,执行设置操作(添加) setex(name, value, time) # time,过期时间(数字秒 或 timedelta对象) psetex(name, time_ms, value) # time_ms,过期时间(数字毫秒 或 timedelta对象) mset(*args, **kwargs) # 批量设置值 如: mset(k1=‘v1‘, k2=‘v2‘) get(name) # 获取值 mget(keys, *args) # 批量获取 如: r.mget(‘ylr‘, ‘wupeiqi‘)或 r.mget([‘ylr‘, ‘wupeiqi‘]) getset(name, value) # 设置新值并获取原来的值
hset(name, key, value) # name对应的hash中设置一个键值对(不存在,则创建;否则,修改) hmset(name, mapping) # 在name对应的hash中批量设置键值对, 如: r.hmset(‘xx‘, {‘k1‘:‘v1‘, ‘k2‘: ‘v2‘}) hget(name,key) # 在name对应的hash中获取根据key获取value hmget(name, keys, *args) # 在name对应的hash中获取多个key的值 如: r.mget(‘xx‘, [‘k1‘, ‘k2‘]) 或 r.hmget(‘xx‘, ‘k1‘, ‘k2‘) hgetall(name) # 获取name对应hash的所有键值 hincrby(name, key, amount=1) # 自增name对应的hash中的指定key的值,不存在则创建key=amount 【计数器】 amount可以是负数,实现自减 hlen(name) # 获取name对应的hash中键值对的个数 hexists(name, key) # 检查name对应的hash是否存在当前传入的key hscan_iter(name, match=None, count=None) # 利用yield封装hscan创建生成器,实现分批去redis中获取数据 (支持匹配 "hello_*")
lpush(name, values) # 从左放 rpush(name, values) # 从右放 lpop(name) # 从左取一个 rpop(name) # 从右取一个 lrange(name, start, end) # 在name对应的列表分片获取数据 blpop(keys, timeout) # 从左边pop数据, 没有数据会一直等, 如果到了超时时间还没有, 则取回None brpop(keys, timeout) # 从右边pop数据, 没有数据会一直等, 如果到了超时时间还没有, 则取回None lpushx(name,value) # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边 rpushx(name,value) # 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最右边 llen(name) # name对应的list元素的个数 # 一点一点取, 可以通过yield创建一个生成器
delete(*names) # 根据删除redis中的任意数据类型 exists(name) # 检测redis的name是否存在 keys(pattern=‘*‘) # 根据模型获取redis的name expire(name ,time) # 为某个redis的某个name设置超时时间
管道(redis事务)
如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
import redis pool = redis.ConnectionPool(host=‘10.211.55.4‘, port=6379) r = redis.Redis(connection_pool=pool) pipe = r.pipeline(transaction=True) pipe.multi() # 批量操作 pipe.set(‘name‘, ‘alex‘) pipe.set(‘role‘, ‘sb‘) pipe.execute() # 执行
1 取所有数据时, 先检查一下长度, 如果很多数据, 使用hscan_iter
2 redis操作时, 只有第一层支持数据类型, 如果要嵌套, 先转成json字符串, 再作为值"嵌套"进去
原文:https://www.cnblogs.com/sunch/p/10422190.html