zoukankan      html  css  js  c++  java
  • Python存储系统(Redis)

    存储系统数据缓存一般会使用三个模块:Mongodb,redis,memcache。其中memcache是轻量级缓存,只能将数据保存到内存中,redis可以配置数据保存在内存还是硬盘。

    其主要用途有:不同应用(语言)中共享数据

    CentOS安装Redis

    安装

    yum install epel-release
    yum install redis

    开启服务:

    systemctl start redis

    设置密码:

    编辑文件:/etc/redis.conf

    #requirepass foobared去掉注释,foobared改为自己的密码

    requirepass newpasswd #这句表示该密码为newpasswd

    保存并重启redis服务

    设置密码后的命令行登入方式:redis-cli -h 127.0.0.1 -p 6379 -a newpasswd

    设置远程端可访问:

    因为redis服务默认不提供远程操作

    编辑文件:/etc/redis.conf

    将bind 127.0.0.1 改为 bind 0.0.0.0

    保存并重启redis服务

    设置防火墙开放端口

    firewall-cmd --zone=public --add-port=6379/tcp --permanent

    重启防火墙

    systemctl restart firewalld

    命令行基本操作操作

    连接

    redis-cli

    通过键值对设置值

    set key value [EX seconds] [PX milliseconds] [NX|XX]

    其中ex表示保存的秒数,px表示毫秒数,nx表示key不存在时才操作,xx表示key存在时才操作

    set keyx valuex

    设置值且保存5秒

    set keyx1 valuex1 ex 5

    一次性设置多个

    mset key1 value1 key2 value2

    设置新值并返回原值

    getset key1 value1111

    字符串切片,如"value1"经过下面结果为:"val"

    getrange key1 0 2

    退出

    exit

    通过键值对获取值

    get keyx

    查看所有的键

    keys *

    查看带有e字符的所有key

    keys *e*

    一次性获取多个

    mget key1 key2

    通过键值对删除值

    del key [key ...]

    判断键是否存在,返回0或1

    exists key1

    重命名

    rename key1 key2

    跳转到另一个空间(db)

    总共有[0,15]个,默认为0

    select 1

    移动键值内容

    move key db

    自增自减

    自增:

    incr keycunx  #执行一次增加一

    自减

    decr keycunx  #执行一次减去一

    二进制位操作:

    如果把设置值的offset匹配成用户id,则可以实现高效的用户登入判断,设置1为登入,0为非登入

    设置值:

    setbit key offset value 设置二进制offset位的值为value

    setbit dongbit 2 1
    setbit dongbit 1000 1

    取出值为1的位个数:

    bitcount dongbit    #输出2

    获取二进制第几位的值:

    getbit dongbit 10   #输出0
    getbit dongbit 2    #输出1

    Hash操作:

    设置数据

    hset key field value 其中key总键,field为子键,value为子键的值

    hset user name dongxiaodong
    hset user passwd pdongdongdong

    获取到所有数据:

    hgetall user
    hkeys user
    hvals user

    获取到指定数据:

    hget user passwd

    批量设置:

    hmset user1 name dong1 passwd pdong111

    判断子键是否存在,存在返回1,否则为0

    hexists user1 passwd

    列表操作:

    设置

    rpush key value [value ...] #一个key可以保持多个value,先入先出,如果需要先入后出则使用rpush

    rpush listdong dong1 dong2 dong3

    取值:

    lrange key start stop 取key的值需要确定起始和结束位置

    lrange listdong 0 -1  #取所有
    lrange listdong 1 1   #确定某个

    集合操作(值不可重复):

    设置

    sadd aggdong dong1 dong2 33 dong1

    取值

    smembers aggdong

    获取个值数

    scard aggdong

    Python基本操作

    安装模块

    pip3 install redis

    简单的连接:

     1 #连接方法一:
     2 #每次操作都是一个连接,如get、set等,一个就是一个网络连接,所以不可取
     3 # conn=redis.Redis(host="192.168.1.195",port=6379,password="rpdong")
     4 
     5 #连接方法二(连接池)
     6 poolx=redis.ConnectionPool(host="192.168.1.195",port=6379,password="rpdong")
     7 conn=redis.Redis(connection_pool=poolx)
     8 
     9 #设置数据
    10 conn.set("keyx","valuexx")
    11 #取出数据
    12 print(conn.get("keyx"))

    键值对操作补充:
    只有键本身存在时才更改数据值和最长保留时间为10秒

    #设置数据,
    conn.set("keyx","valuexx",ex=10,xx=True)

    发布和订阅:

    发布

    命令行发布:

    参数为:publish 主题 内容

    publish dongtop dongtototo

    Python发布:

     1 import redis
     2 
     3 #连接池
     4 poolx=redis.ConnectionPool(host="192.168.1.195",port=6379,password="rpdong")
     5 conn=redis.Redis(connection_pool=poolx)
     6 
     7 #发布消息,参数(主题,内容)
     8 conn.publish("dongtop","dongxiaodongtext")
     9 conn.publish("dongtop2","dongxiaodongtext222")
    10 
    11 print("------ 发送完成  --------")

    订阅:

     1 import redis
     2 
     3 #连接池
     4 poolx=redis.ConnectionPool(host="192.168.1.195",port=6379,password="rpdong")
     5 conn=redis.Redis(connection_pool=poolx)
     6 
     7 
     8 pub=conn.pubsub() #打开接收
     9 pub.subscribe("dongtop") #设置接收主题
    10 pub.subscribe("dongtop2")
    11 
    12 print("-------- 等待接收 ---------")
    13 
    14 while True:
    15   msgx=pub.parse_response() #准备接收,如果无数据则阻塞
    16   '''
    17   第一次会输出订阅成功消息:
    18   收到的数据为: [b'subscribe', b'dongtop', 1] 
    19   收到的数据为: [b'subscribe', b'dongtop2', 2]
    20   #输出:
    21   收到的数据为: [b'message', b'dongtop', b'dongxiaodongtext']
    22   收到的数据为: [b'message', b'dongtop2', b'dongxiaodongtext222'
    23   '''
    24   print("收到的数据为:",msg

    基于订阅和发布的小文件传输:

    发布端

    #发布消息,参数(主题,文件内容)
    conn.publish("dongtop",open("南沙客运港.mp4","rb").read())
    
    print("------ 发送完成  --------")

    接收端:

    msgx =pub.parse_response()  # 去掉第一次订阅成功的消息
    print("-------- 等待接收 ---------",msgx)
    while True:
        msgx =pub.parse_response()  # 准备接收,如果无数据则阻塞
        #得到文件数据并写入文件
        open("客运港.mp4","wb").write(msgx[2])
        print("----* 接收完成 *----")
  • 相关阅读:
    [CF666E] Forensic Examination
    [BZOJ3739] DZY loves math VIII
    [BZOJ3561] DZY Loves Math VI
    VS中的类模板
    php中的this,self,parent
    js中的 Table 对象
    CEF中弹出窗口的处理
    VC禁止或允许拖拽改变窗口尺寸
    MFC系统自动生成的停靠窗格关掉后,如何重新显示?
    VS2010 如何自动生成UML图
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/10496148.html
Copyright © 2011-2022 走看看