神奇: 客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库。首先Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。
1 启动/停止
(1)打开cmd,如果配置系统的环境变量,直接输入 redis-server.exe redis.windows.conf
便可启动redis服务器。 (后面的redis.windows.conf
是端口等配置信息,可以省略。)
(2)停止 redis-server --service-stop
(3)另起一个cmd,执行redis-cli.exe -h 127.0.0.1 -p 6379
便可启动redis客户端,在这里就可以进行实际的用户操作了。(后面的-h 127.0.0.1 -p 6379
:-h 是主机ip,-p 是端口号,也可以省略。)
2 操作
设置键值对:set myKey myValue
获得键的值:get myKey
查看所有的键: keys *
删除所有的键:flushall
删除键值对:del myKey
删除成功返回1
判断是否存在:exists myKey
存在返回1,不存在返回0
3 列表
插入列表:
lpush myKey redis
lpush myKey mongodb
lpush myKey mysql
查看列表:
lrange myKey 0 10
起始index为0,终止index为10
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止:
blpop key1 [key2] timeout
timeout设置为时间,单位为s,如果列表没有元素,就会等待timeout的时间
4 python 操作 redis
(1)通过redis client写入数据:
(2)代码片段
import redis
class Task(object):
def __init__(self):
self.redis_conn = redis.StrictRedis(host='localhost')
self.queue = 'myKey'
def listen_queue(self):
while True:
cell = self.redis_conn.blpop(self.queue, 0)[1]
print("The output of myKey queue :", cell)
if __name__ == '__main__':
print('listen queue: %s' % Task().listen_queue())
(3)代码执行结果
5 Redis发布订阅
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接受消息。
(1)起一个redis客户端作为订阅者,订阅频道“redischat”
subscribe redischat
(2)另起一个redis客户端作为发布者,发布频道也为“redischat”,发布内容为 “redis is a great caching technique”
publish redischat "redis is a great caching technique"
(3)结果:作为订阅者的redis客户端,收到以下消息:
(4)Python操作 redis 消息订阅
import redis
class Task(object):
def __init__(self):
self.rcon = redis.StrictRedis(host='localhost')
self.ps = self.rcon.pubsub()
self.ps.subscribe('channel')
def listen_task(self):
for i in self.ps.listen():
if i['type'] == 'message':
print("Task get", i['data'])
if __name__ == '__main__':
print('listen task channel')
Task().listen_task()
通过redis client 的channel频道发布消息:
可以看到python中接受到相应的消息:
6 通过flask集成 python+redis代码
import redis
import random
import logging
from flask import Flask, redirect
app = Flask(__name__)
redis_test = redis.StrictRedis(host='localhost')
prodcons_queue = 'myQueue'
pubsub_channel = 'myChannel'
@app.route('/')
def index():
html = """
<br>
<center><h3>Redis Message Queue</h3>
<br>
<a href="/prodcons">生产消费者模式</a>
<br>
<br>
<a href="/pubsub">发布订阅者模式</a>
</center>
"""
return html
@app.route('/prodcons')
def prodcons():
elem = random.randrange(10)
redis_test.lpush(prodcons_queue, elem) # 生产者
logging.info("lpush {} -- {}".format(prodcons_queue, elem))
output = redis_test.blpop(prodcons_queue, 1)[1] # 消费者
print(output)
return redirect('/')
@app.route('/pubsub')
def pubsub():
ps = redis_test.pubsub()
ps.subscribe(pubsub_channel) # 订阅者
elem = random.randrange(5)
redis_test.publish(pubsub_channel, elem) # 发布者
for i in ps.listen():
if i['type'] == 'message':
print("Task get", i['data'])
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)