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)
View Code

管道 事物

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()
View Code

发布 订阅

发布订阅事例:

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()
操作redis 同步变为异步

 

 

启用认证:
    - 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将文件放入内存

    

 

 

 

沛齐

 

 

 

  

posted @ 2017-10-17 20:30  golangav  阅读(278)  评论(0编辑  收藏  举报