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("----* 接收完成 *----")
  • 相关阅读:
    Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel
    Memcached是什么
    Spring.net 网络示例 codeproject
    jquery.modalbox.show 插件
    UVA 639 Don't Get Rooked
    UVA 539 The Settlers of Catan
    UVA 301 Transportation
    UVA 331 Mapping the Swaps
    UVA 216 Getting in Line
    UVA 10344 23 out of 5
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/10496148.html
Copyright © 2011-2022 走看看