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消息队列实现
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'))