Redis
一. redis 和memcached区别
#memcached redis 软件 在内存中存取数据 应用场景: 页面缓存 #memcached redis 区别 key value存储 类型: memcached: 类型单一 k == "字符串" redis: 五大类型 k == "字符串" k == list k == hash k == set k == order set() 持久化: memcached: 断电内存清空 redis: 支持持久化 redis 只使用单核 而memcached可以使用多核
二. redis
noSQL MongDB 文档存储 Redis key-value 默认端口6379 Redis - 配置文件 - 默认16个数据库 0-15 - 时间间隔物理写的频度 save 900 1 #900秒写了一次 就写操作 - 物理存储名称 dbfilename - Redis是key-value的数据,所以每个数据都是一个键值对 - 键的类型是字符串 - 值的类型分五种 - 字符串 string - 哈希 hash - 列表 list - 集合 set - 有序集合 zset - string string是redis最基本的类型 最大能存储512MB数据 string类型是二进制安全的 即可以为任何数据 比如数字 图片 序列化对象等 1. set key value #设置键值 2. setex key second value #设置键值及过期时间,以秒为单位 3. get key #根据键获取值,如果不存在,此键则返回null 运算 - 要求: 值是数字 - incr key #将key对应的value加1 - key的命令 KEYS pattern #查找键 参考支持正则 - keys * #查询所有的key 匹配任意个字符 - keys ? #匹配任意一个字符 - keys [a-z] #a或b - keys [0-9] - keys [a-z],0-9] #a0 - keys ? #匹配一个 - keys * #匹配多个 EXISTS key #判断键是否存在,如果存在返回1,不存在返回0 TYPE key #查看键对应的value类型 DEL key #删除键及对应的值 TTL key #查看有效时间 以秒为单位 EXPIRE key 10 #设置key的过期时间 以秒为单位 - hash #hash 用于存储对象,对象的格式为键值对 #默认配置文件 hash-max-ziplist-entries 512 #512字节 hash-max-ziplist-value 64 #字段数目 #设置 HSET key field value #设置单个属性 HSETNX key field value #字段不存在才设置成功 HMSET key field1 value1 field2 value2 #设置多个属性值 #获取 HGET key field #获取一个属性的值 HMGET key field1 field2 #获取多个属性的值 HGETALL key #获取所有属性和值 HKEYS key #获取所有的属性 HVALS key #获取所有field对应的值 HLEN key #返回包含属性的个数 HEXISTS key field #判断这个属性的值是否存在 #相加 HINCRBY key field 10 #对属性的值相加 值得是数值类型 HINCRBYFLOAT key field 10.11 #key做浮点相加,原来key也是浮点 #删除 HSEL key field1 field1 #删除 - list 列表的元素类型为string 按照插入顺序排序 在列表的头部或者尾部增加元素 LPUSH #在头部插入数据 LINSERT key BEFBEFORE/AFTER 索引 value #在一个元素的前后插入新元素 - 发布订阅 - 发布订阅模式指一种代码的结构 开发的开发方式 - 有一端完成数据的发布,定制 另一端接收数据 - 发布者不是计划发送消息给特定的接收者(订阅者),而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅 - 订阅者对一个或多个频道感兴许,只需要接受感兴趣的消息,不需要知道什么样的发布者发布的 - 发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑 - 客户端发到频道的消息,将会被推送到所有订阅此频道的客户端 - 客户端不需要主动去获取消息,只需要订阅频道,这个频道的内容就会被推送过来 消息的格式 - 推送消息的格式包含三部分 - part1:消息类型,包含三种类型 - subscribe 表示订阅成功 - unsubscribe 表示取消订阅成功 - message 表示其它终端发布消息 如果第一部分的值为subscribe 则第二部分是频道 第三部分是现在订阅的频道的数量 如果第一部分的值为unsubscribe 则第二部分是频道 第三部分是订阅的频道的数量 如果为0则表示当前没有订阅任何频道 当在Pub/ Sub以外状态,客户端可以发出任何redis命令 如果第一部分的值为message 则第二部分是来源频道的名称 第三部分是消息的内容 命令 - SUBSRIBE 频道名称 #订阅 - UNSUBSRIBE 频道名称 #取消订阅 如果不写参数,表示取消所有订阅 - PUBLISH 频道 #发布 0-7 12- 没看 学院 06-09 没看 boke
消息队列
多个客户端同时监听,向列表中添加数据,只有一个客户端可以获取到数据。
v = conn.lbpop("users",timeout=5) 如果列表里面一直没有值,会停住。 print(v)
管道 事物
redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline 是原子性操作。
#!/usr/bin/env python # -*- coding:utf-8 -*- import redis pool = redis.ConnectionPool(host='10.211.55.4', port=6379) r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) pipe = r.pipeline(transaction=True) pipe.set('name', 'alex') pipe.set('role', 'sb') pipe.execute()
发布 订阅
发布订阅事例:
import redis conn = redis.Redis(host='192.168.11.28', port=6379) conn.publish('107.8', '吃了吗')
import redis conn = redis.Redis(host='192.168.11.28', port=6379) pub = conn.pubsub() pub.subscribe('107.8') while True: result = pub.parse_response() print(result)
对redis的操作同步变为异步
import redis import queue import time from threading import Thread def handle_callback(res): print("get redis res:",res) class SetData: def __init__(self,key,value,handle): self.key = key self.value = value self.handle = handle class RedisAsyncHandle(Thread): q = queue.Queue(maxsize=1024) r = redis.Redis(host='localhost',port=6379,db=0) def send_set_cmd(self,key,value): set_data = SetData(key,value,handle_callback) self.q.put(set_data) def run(self): while True: while not self.q.empty(): item = self.q.get() res = self.r.set(item.key,item.value) item.handle(res) time.sleep(0.1) handle = RedisAsyncHandle() handle.start() handle.send_set_cmd("name","alex") handle.join()
启用认证: - requirepass PASSWORD 清空数据库: - FLUSHDB 清空当前库 - FLUSHALL 清空所有库 事物: - 将多个命令打包后一次性执行。 - MULTI 启动一个事物 - EXEC:执行事物,一次性将事物中的所有操作执行完后返回客户端。 持久化: - RDB(redis DB) 二进制格式,相当于快照,周期性地将数据存储到硬盘上。数据文件默认为dump.rdb - 当需要快照时候,它的主进程会fork一个子进程将数据从内存到硬盘上 - 两种保存机制: - 配置文件 当达到某种条件时候,同步到磁盘中。 - 客户端 客户端可以使用SAVE和BGSAVE命令启动快照保存机制。 - SAVE 同步操作 在主进程中快照,会阻塞,会严重影响性能。 - BGSAVE 异步操作,其它到的客户端还可以继续访问。 - 保存策略 - save 10 10000 表示10分钟如果10000个值发生改变,就备份。 - AOF(append only file) - 将执行的命令追加到指定文件中,类似mysql的binlog日志,当Redis重启时,课通过重新执行文件中的命令在内存中重建数据库。 - 保存过程: - Redis通过fork创建子进程。 - 子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中。 - 父进程继承clint的请求,并会把这些请求中的写操作继续追加到原来的AOF文件。同时额外的这些新的请求还会放置于一个缓存队列中 - 子进程重写完成,会通知父进程,父进程把缓存中的命令写到临时文件中。 - 父进程用临时文件替换老的AOF文件。 同步: 当启动一个Slave,Slave会向Master发送一个sendcommend请求同步,master会启动一个子进程快照一个文件发送slave,slave将文件放入内存