zoukankan      html  css  js  c++  java
  • redis使用

    1、aof文件不产生问题

    1.1直接redis-server.exe不会产生,在命令redis-server后加上要修改的配置名和值(可以设置多对),没有设置的将使用默认配置;

    如:redis-server --port 6389 –timeout 3000

    虽然可以自定义配置。但是如果修改的配置较多则应该保存在配置文件中,不建议使用这种方式。

    (配置文件启动

    1.2将配置文件写到指定的redis.conf文件里,启动时在redis-server命令后,指定配置文件的路径,则redis会按照配置文件redis.conf的配置进行启动。

    例如:redis-server.exe redis.windows.conf 

    2、redis 与Python交互取出来的是bytes类型

    在连接数据库的时候加上decode_responses=True即可

    def register(name, pwd):
    try:
    r = redis.Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True)
    r.incr("users:count")
    count = r.get("users:count")
    print(count)
    print(type(count))
    print("count:%d" % count)
    rt1 = r.hset("user:%d:name"%count, name)
    rt2 = r.hset("user:%d:pwd" % count, pwd)
    print(rt1)
    print(rt2)
    r.close()
    except:
    r.decr("users:count")
    print(traceback.format_exc())

    3 python中redis执行zadd, 第二个参数是mapping类型
    r = redis.Redis(host='127.0.0.1', port=6379, db=0, decode_responses=True)
    r.zadd(following_rds_key, {following_user: 1} )
    r.zadd(followed_rds_key, {followed_user: 1 } )

    与无序集合sadd的区别:
    pipe.sadd(following_rds_key,  followed_user )



    4、redis中有序集合没有交集的方法,做关注和粉丝的功能,只能选择用无序集合,获取对象,然后做交集;
    redis> SMEMBERS language
    1) "Python"
    2) "Ruby"
    3) "Clojure"


    5、redis消息队列实现
    #redis_pub.py
    import redis
    r = redis.Redis(host= "127.0.0.1" , port= 6379, db = 0 ,decode_responses=True)
    while True:
        arg = input("please input(1/2/3):")
        if arg == "1":
            r.lpush("queue1",arg)
        if arg == "2":
            r.lpush("queue2", arg)
        if arg == "3":
            r.lpush("queue3", arg)

    #redis_sub1.py
    import redis
    r = redis.Redis(host= "127.0.0.1" , port= 6379, db = 0 ,decode_responses=True)
    while True:
        arg = input("if continue(y/n):")
        if arg == 'y':
            result = r.blpop(["queue1","queue2", "queue3" ])
            print(result)
        else:
            print("do break")
            break

    #redis_sub2.py
    import redis
    r = redis.Redis(host= "127.0.0.1" , port= 6379, db = 0 ,decode_responses=True)
    while True:
        arg = input("if continue(y/n):")
        if arg == 'y':
            result = r.brpop("queue1")
            print(result)
        else:
            print("do break")
            break

    说明:blpop优先从最左边的队列pop出消息,如果没有再找其他的队列。


    6.redis发布/订阅

    #redis_publish.py文件
    import  redis
    r = redis.Redis(host="127.0.0.1", port=6379, db=0,decode_responses=True)
    while True:
        arg = input("if continue pulish(y/n):")
        if arg == "y" :
            r.publish("channel.1", "hi")
        else:
            print("break")
            break

    #redis_subscribe1.py文件
    import  redis
    r = redis.Redis(host="127.0.0.1", port=6379, db=0, decode_responses=True )
    pb = r.pubsub()
    pb.subscribe("channel.1")
    for message in pb.listen():
        print("redis_subscribe1 listen:")
        print(message)

    #redis_subscribe2.py文件
    import  redis
    r = redis.Redis(host="127.0.0.1", port=6379, db=0, decode_responses=True )
    pb = r.pubsub()
    pb.subscribe("channel.1")
    for message in pb.listen():
        print("redis_subscribe2 listen:")
        print(message)

    redis_publish运行结果如下:
    "D:Program Filespython3.6.7python.exe" D:/pythonWorkspace/untitled12/redis_publish.py
    if continue pulish(y/n):y
    if continue pulish(y/n):y
    if continue pulish(y/n):
    redis_subscribe1运行结果如下:
    "D:Program Filespython3.6.7python.exe" D:/pythonWorkspace/untitled12/redis_subscribe1.py
    redis_subscribe1 listen:
    {'type': 'subscribe', 'pattern': None, 'channel': 'channel.1', 'data': 1}
    redis_subscribe1 listen:
    {'type': 'message', 'pattern': None, 'channel': 'channel.1', 'data': 'hi'}
    redis_subscribe1 listen:
    {'type': 'message', 'pattern': None, 'channel': 'channel.1', 'data': 'hi'}
    redis_subscribe2运行结果如下:
    "D:Program Filespython3.6.7python.exe" D:/pythonWorkspace/untitled12/redis_subscribe2.py
    redis_subscribe2 listen:
    {'type': 'subscribe', 'pattern': None, 'channel': 'channel.1', 'data': 1}
    redis_subscribe2 listen:
    {'type': 'message', 'pattern': None, 'channel': 'channel.1', 'data': 'hi'}
    redis_subscribe2 listen:
    {'type': 'message', 'pattern': None, 'channel': 'channel.1', 'data': 'hi'}


    redis订阅消息的缺点:发出去的消息不会持久化
    rammitmq的好处:目前rabbitmq使用比较多,可以将订阅的队列设置成持久化的,当消费者死掉也没有没有关系,消息仍然缓存在队列上,消费者重新复活之后,再次订阅队列就好了,消息不会丢失,即使队列出异常死掉,那么队列重新恢复的时候,消息还在,因为队列是持久化的,所以这种场景用mq更加合适!!!


    7、redis连接池

    为什么使用连接池?
    Redis 是单进程单线程的,它利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

    Redis 是基于内存的数据库,使用之前需要建立连接,建立断开连接需要消耗大量的时间。

    再假设 Redis 服务器与客户端分处在异地,虽然基于内存的 Redis 数据库有着超高的性能,但是底层的网络通信却占用了一次数据请求的大量时间,因为每次数据交互都需要先建立连接,假设一次数据交互总共用时 30ms,超高性能的 Redis 数据库处理数据所花的时间可能不到 1ms,也即是说前期的连接占用了 29ms,连接池则可以实现在客户端建立多个连接并且不释放,当需要使用连接的时候通过一定的算法获取已经建立的连接,使用完了以后则还给连接池,这就免去了数据库连接所占用的时间。


    1 #!/usr/bin/env python
    2 # -*- coding:utf8 -*-
    3
    4 import redis
    5
    6 '''
    7 这种连接是连接一次就断了,耗资源.端口默认6379,就不用写
    8 r = redis.Redis(host='127.0.0.1',port=6379,password='tianxuroot')
    9 r.set('name','root')
    10
    11 print(r.get('name').decode('utf8'))
    12 '''
    13 '''
    14 连接池:
    15 当程序创建数据源实例时,系统会一次性创建多个数据库连接,并把这些数据库连接保存在连接池中,当程序需要进行数据库访问时,
    16 无需重新新建数据库连接,而是从连接池中取出一个空闲的数据库连接
    17 '''
    18 pool = redis.ConnectionPool(host='127.0.0.1',password='helloworld') #实现一个连接池
    19
    20 r = redis.Redis(connection_pool=pool)
    21 r.set('foo','bar')
    22 print(r.get('foo').decode('utf8'))



  • 相关阅读:
    有点成熟的短句,最新个性签名
    ACM2039_三角形三边关系
    Android 绘制中国地图
    Opengl-法线贴图(用来细化表面的表现表现的凹凸)
    Go的sync
    Laravel Study(使用 Laravel )
    对于宅男来说,硬盘里的数据就是命
    设计模式之模板方法模式
    游戏掉落道具掉落
    NEWMING
  • 原文地址:https://www.cnblogs.com/harryTree/p/11365463.html
Copyright © 2011-2022 走看看