redis使用

mac2022-06-30  19

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.pyimport redisr = 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.pyimport redisr = 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.pyimport redisr = 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  redisr = 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  redisr = 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  redisr = 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 Files\python3.6.7\python.exe" D:/pythonWorkspace/untitled12/redis_publish.pyif continue pulish(y/n):yif continue pulish(y/n):yif continue pulish(y/n):redis_subscribe1运行结果如下:"D:\Program Files\python3.6.7\python.exe" D:/pythonWorkspace/untitled12/redis_subscribe1.pyredis_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 Files\python3.6.7\python.exe" D:/pythonWorkspace/untitled12/redis_subscribe2.pyredis_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'))

转载于:https://www.cnblogs.com/harryTree/p/11365463.html

最新回复(0)