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 Files\python3.6.7\python.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 Files\python3.6.7\python.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 Files\python3.6.7\python.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'))



posted on 2019-08-16 17:48  芦苇草鱼  阅读(238)  评论(0编辑  收藏  举报